首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cortex M3的WaitFor实现

Cortex M3的WaitFor实现
EN

Stack Overflow用户
提问于 2010-08-25 19:00:02
回答 2查看 297关注 0票数 0

我正在和GCC一起使用stm32f103,我有一个任务,可以用以下伪代码来描述:

代码语言:javascript
复制
void http_server() {
  transmit(data, len);
  event = waitfor(data_sent_event | disconnect_event | send_timeout_event);
}

void tcp_interrupt() {
  if (int_reg & DATA_SENT) {
    emit(data_send_event);
  }
}

void main.c() {
  run_task(http_server);
}

我知道,所有的嵌入式OSes都提供这样的功能,但是对于这个单一的任务来说,它们太庞大了。我不需要抢占,互斥,队列和其他功能。只需等待辅助任务中的标志,并在中断中提升这些标志。希望有人知道这个主题的很好的教程,或者有一段上下文切换和等待实现的代码。

EN

回答 2

Stack Overflow用户

发布于 2010-08-25 20:36:56

您可能需要使用中断驱动的finite state machine

票数 1
EN

Stack Overflow用户

发布于 2010-08-26 01:49:45

有许多独立于操作系统甚至中断的IP堆栈。lwip (轻量级ip)出现在脑海中。我间接使用了它,因为它是由xilinx提供的。freedos的人可能已经有了一个,当然,crynwr包驱动程序出现在脑海中,毫无疑问,有堆栈构建。

至于可能更简单的问题。您的代码位于waitfor()函数的前台任务中,该函数似乎希望成为一个无限循环,等待某些全局变量发生变化。一个中断来调用中断处理程序,中断处理程序有大量的堆栈工作(知道这是一个tcp中断),调用修改标志的tcp_interrupt,中断结束,现在等待看到全局标志的变化。上下文切换是内置在处理器中的中断,不需要操作系统或任何花哨的东西,一个或两个全局变量和isr。与tcp/ip协议栈相比,上下文切换和标志/事件是免费的。udp非常简单,你真的需要tcp btw吗?

如果您希望这些waitfor()中有多个处于活动状态,那么基本上您不希望只有一个forground任务位于一个waitfor()中。然后我会做两件事中的一件。让前台任务轮询,而不是等待(某事),将其更改为if(checkfor( something )) { then do something }。

或者设置您的系统,使中断处理程序(在伪代码中已经非常复杂,无法知道这是tcp数据包数据)更深入地检查tcp报头,并知道为端口80事件调用http_server()方法,以及为您可能等待了一段时间的其他事件调用其他函数。因此,在这种情况下,不是等待()的一系列多任务函数,而是创建单个事件列表,并在ISR中查找它们。使用计时器、中断和全局超时(当数据包到达时重置计数器,在计时器中断时颠簸计数器如果计数器达到N则发生超时,调用超时任务处理函数)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3565155

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档