QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 1342|回复: 4

SKYeye中uC/OS的多任务真的都在运行嘛?

[复制链接]
发表于 2005-5-17 21:12:43 | 显示全部楼层 |阅读模式
我刚接触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确实没有得到运行!
为什么?
发表于 2005-5-17 21:52:24 | 显示全部楼层
uC/OS的是real time的,优先级高的先运行完。
回复

使用道具 举报

 楼主| 发表于 2005-5-18 23:47:19 | 显示全部楼层
[quote:d816506d37="bigdragon"]uC/OS的是real time的,优先级高的先运行完。[/quote]
老兄
uC/OS是实时抢占式内核,并不是优先级低的就不运行,只是它能得到的时间片少一些!这样的话,任务调度器应该在任务之间切换才对。
不过可能是我对uC/OS了解不够吧,才发现它的程序好像不会自动为任务分配时间片是吧?
回复

使用道具 举报

发表于 2005-5-19 10:28:34 | 显示全部楼层
如果优先级高的任务不因为需要等待信号量,或者其他原因阻塞而主动让出 cpu ,那么优先级低的任务就无法运行。
你的 task1 如果优先级高,那么按照你的程序是无法主动让出 cpu 的,因此 task2 也就无法运行。

void Task1(void * pParam)
{
at91_init();
while (1)
{
count1 += 1;
}
}

可以参考 skyeye 中 ucos-ii 的移植代码加入 sleep 来实现任务切换和调度。
回复

使用道具 举报

 楼主| 发表于 2005-5-19 21:54:37 | 显示全部楼层
谢谢了。我重新看了uC/OS的资料那本邵蓓蓓翻译的书,p39:“目前,uC/OS不支持时间片轮番调度法”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2024-11-5 11:37 , Processed in 0.077079 second(s), 15 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表