我正在尝试在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();
}
}
两个线程都设置为相同的默认优先级。
答案 0 :(得分:7)
uC / OS-II是抢占式的,但只能在一个方向上 - 它将抢占一个低优先级的线程以允许更高优先级的线程运行,但不会反过来。也就是说,优先级较高的线程需要明确放弃对CPU的控制,以便允许较低优先级的线程运行。我打赌你的串行线程优先于HTTP线程,serFgetc()
根本不放弃控制(通过OSMboxPend
,或OSTimeDly
或其他一些例程)
尝试将串行线程作为系统中最低优先级的线程,或者将某些内容放入其代码中以允许它放弃对CPU的控制。 (例如,当没有可用的字符时,等待信号量,你可以从数据可用中断发布信号量。)要么应该工作。
答案 1 :(得分:2)
uC / OS-II仅支持唯一的优先级。您还需要OSTimeDLY(x)或任务循环中的其他项目来放弃对调度程序的控制。