4

我正在尝试在 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();
    }
}

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

4

2 回答 2

7

uC/OS-II 是抢占式的,但仅限于一个方向——它将抢占一个较低优先级的线程以允许较高优先级的线程运行,但不会做相反的事情。也就是说,较高优先级的线程需要明确放弃对CPU的控制,才能让较低优先级的线程运行。我敢打赌,您的串行线程的优先级高于 HTTP 线程,并且serFgetc()根本不会放弃控制(通过OSMboxPendOSTimeDly其他例程)。

尝试使串行线程成为系统中最低优先级的线程,或者在其代码中添加一些东西以使其放弃对 CPU 的控制。(例如,当没有字符可用时等待信号量,您可以从数据可用中断中发布该信号量。)两者都应该工作。

于 2010-07-10T18:19:10.890 回答
2

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

于 2010-08-15T18:48:56.130 回答