SKYeye中uC/OS的多任务真的都在运行嘛?
我刚接触skyeye不久不过在使用过程中发现程序中的多个任务并没有真正运行,而是只运行了优先级最高的那个。不知道这是怎么的?高手请指教以下是我的程序测试
以下实验是两个任务分别对两个变量逐次加一,
int count1 = 0;
int count2 = 0;
void Task1(void * pParam)
{
at91_init();
while (1)
{
count1 += 1;
}
}
void Task2(void * pParam)
{
at91_init();
while (1)
{
count2 += 1;
}
}
用gdb调试结果
(SkyEye) print count1
$1 = 328
(SkyEye) print count2
$2 = 0
(SkyEye) Quit
(SkyEye)
说明变量count2确实没有得到运行!
为什么? uC/OS的是real time的,优先级高的先运行完。 uC/OS的是real time的,优先级高的先运行完。
老兄
uC/OS是实时抢占式内核,并不是优先级低的就不运行,只是它能得到的时间片少一些!这样的话,任务调度器应该在任务之间切换才对。
不过可能是我对uC/OS了解不够吧,才发现它的程序好像不会自动为任务分配时间片是吧? 如果优先级高的任务不因为需要等待信号量,或者其他原因阻塞而主动让出 cpu ,那么优先级低的任务就无法运行。
你的 task1 如果优先级高,那么按照你的程序是无法主动让出 cpu 的,因此 task2 也就无法运行。
void Task1(void * pParam)
{
at91_init();
while (1)
{
count1 += 1;
}
}
可以参考 skyeye 中 ucos-ii 的移植代码加入 sleep 来实现任务切换和调度。 谢谢了。我重新看了uC/OS的资料那本邵蓓蓓翻译的书,p39:“目前,uC/OS不支持时间片轮番调度法”
页:
[1]