代码之家  ›  专栏  ›  技术社区  ›  fred basset

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

  •  4
  • fred basset  · 技术社区  · 16 年前

    我试图在micriumucos/II下的动态C中运行两个任务。一个任务是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 回复  |  直到 16 年前
        1
  •  7
  •   Aidan Cully    16 年前

    uC/OS-II是抢占式的,但只在一个方向上—它将抢占低优先级线程以允许高优先级线程运行,但不会执行相反的操作。也就是说,高优先级线程需要显式地放弃对CPU的控制,以允许低优先级线程运行。我打赌你的串行线程的优先级比HTTP线程高,而且 serFgetc() OSMboxPend ,或 OSTimeDly 或者其他一些常规)。

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

        2
  •  2
  •   ValiRossi    16 年前