0

我在 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);
}

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

4

2 回答 2

1

您可能需要使用中断驱动的 有限状态机

于 2010-08-25T12:36:55.540 回答
0

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

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

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

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

于 2010-08-25T17:49:44.560 回答