动态C / Rabbit上的Micrium uC-OS / II可能会导致任务不足

时间:2010-07-10 18:08:27

标签: c embedded rtos multitasking micrium

我正在尝试在Micrium uC-OS / II下的Dynamic C中运行2个任务。一个任务是http处理程序,另一个是从串行端口读取。串口任务似乎禁止http任务运行。任何想法为什么会这样?我认为uC-OS / II是优秀的。

void httptask(void* ptr)
{
 http_init();

 while(1) {
  http_handler();
 }
}

void gpstask(void* ptr) {

 int c;

 while (1) {
        c = serFgetc();
    }
}

两个线程都设置为相同的默认优先级。

2 个答案:

答案 0 :(得分:7)

uC / OS-II是抢占式的,但只能在一个方向上 - 它将抢占一个低优先级的线程以允许更高优先级的线程运行,但不会反过来。也就是说,优先级较高的线程需要明确放弃对CPU的控制,以便允许较低优先级的线程运行。我打赌你的串行线程优先于HTTP线程,serFgetc()根本不放弃控制(通过OSMboxPend,或OSTimeDly或其他一些例程)

尝试将串行线程作为系统中最低优先级的线程,或者将某些内容放入其代码中以允许它放弃对CPU的控制。 (例如,当没有可用的字符时,等待信号量,你可以从数据可用中断发布信号量。)要么应该工作。

答案 1 :(得分:2)

uC / OS-II仅支持唯一的优先级。您还需要OSTimeDLY(x)或任务循环中的其他项目来放弃对调度程序的控制。