Arm 等待Cortex M3的实施

Arm 等待Cortex M3的实施,arm,multitasking,Arm,Multitasking,我将stm32f103与GCC一起使用,并且有一个任务,可以用以下伪代码描述: 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); }

我将stm32f103与GCC一起使用,并且有一个任务,可以用以下伪代码描述:

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);
}
我知道,所有的嵌入式操作系统都提供这样的功能,但它们对于这个单一任务来说太庞大了。我不需要抢占、互斥、队列和其他特性。只是在次要任务中等待标志,并在中断中提升这些标志。
希望有人知道这个主题的好教程,或者有一段上下文切换和等待实现的代码。

您可能需要使用中断驱动。

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

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

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


或者设置您的系统,使中断处理程序(在您的伪代码中,知道这是tcp数据包数据已经非常复杂)深入检查tcp报头,并知道为端口80事件调用http_server()函数,为您可能已等待的其他事件调用其他函数。因此,在本例中,不要使用一系列等待()的多任务函数,而是创建一个事件列表,并在ISR中查找它们。使用定时器、中断和全局函数进行超时(当数据包到达时重置计数器,如果计数器达到N,则在定时器中断时触发计数器,然后发生超时,调用超时任务处理程序函数)

是的,这是可能的方法。但长开关会让代码看起来很难看。这就是我寻找wait()实现的原因。那么所有这些都可以以更清晰的方式完成。唯一的其他选择是非抢占式调度程序,但这涉及多个堆栈(即更多内存)当然,我同意多个堆栈。但我需要一段代码或教程来看看如何实现它。除非你想实现一个完整的调度程序,否则最好还是坚持使用FSM