我正在和GCC一起使用stm32f103,我有一个任务,可以用以下伪代码来描述:
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都提供这样的功能,但是对于这个单一的任务来说,它们太庞大了。我不需要抢占,互斥,队列和其他功能。只需等待辅助任务中的标志,并在中断中提升这些标志。希望有人知道这个主题的很好的教程,或者有一段上下文切换和等待实现的代码。
发布于 2010-08-25 20:36:56
您可能需要使用中断驱动的finite state machine。
发布于 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则发生超时,调用超时任务处理函数)。
https://stackoverflow.com/questions/3565155
复制相似问题