WaitFor实现Cortex M3

时间:2010-08-25 11:00:02

标签: arm multitasking

我正在使用带有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);
}

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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

如果你想要多个waitfor()激活,基本上你不想只让一个forground任务坐在一个waitfor()中。然后我会做两件事之一。有前台任务轮询,而不是waitfor(某事)将它改为if(checkfor(something)){然后做某事}。

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