动态C/Rabbit上的Micrium uC OS/II-可能有任务饥饿

动态C/Rabbit上的Micrium uC OS/II-可能有任务饥饿,c,embedded,rtos,multitasking,micrium,C,Embedded,Rtos,Multitasking,Micrium,我正试图在micriumucos/II下的dynamicc中运行两个任务。一个任务是http处理程序,另一个从串行端口读取。串行端口任务似乎禁止http任务运行。你知道为什么吗?我认为uC OS/II是先发制人的 void httptask(void* ptr) { http_init(); while(1) { http_handler(); } } void gpstask(void* ptr) { int c; while (1) { c = serF

我正试图在micriumucos/II下的dynamicc中运行两个任务。一个任务是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();
    }
}

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

uC/OS-II是抢占式的,但仅在一个方向上-它将抢占低优先级线程以允许高优先级线程运行,但不会执行相反的操作。也就是说,高优先级线程需要显式放弃对CPU的控制,以允许低优先级线程运行。我打赌串行线程的优先级高于HTTP线程,而且
serFgetc()
根本不会放弃控制(通过
OSMboxPend
,或
ostimely
或其他一些例程)


尝试使串行线程成为系统中优先级最低的线程,或者在其代码中添加一些内容,以允许它放弃对CPU的控制。(例如,在没有可用字符的情况下等待信号量,您可以从数据可用中断中发布哪个信号量。)两者都可以工作。

uC/OS-II只支持唯一优先级。此外,在任务循环中还需要类似ostimely(x)或其他项的内容,以便将控制权交给调度程序

a)uC/OS-II是否允许两个线程具有相同的优先级?我记得根据调度程序的工作方式,每个任务(线程)必须具有唯一的优先级,这可能是错误的。b) 您确定serFgetc()会阻塞某个位置,而不是忙于旋转吗?我们没有足够的信息。