OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5260|回复: 9

UCOSIII 任务优先级对任务抢占的影响

[复制链接]

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-11-10
在线时间
5 小时
发表于 2017-12-15 17:17:31 | 显示全部楼层 |阅读模式
5金钱
有两个任务:
task1   任务优先级 3
task2   任务优先级 4  (当设置task2的优先级小于10时,task1不能实现0.5S打印"task1";当设置task2优先级大于等于10时,就可以)

void task1()
{
    while(1)
   {
        printf("task1\r\n");
        OSTimeDlyHMSM(0, 0, 0, 500,OS_OPT_TIME_HMSM_STRICT,&err);
    }
}

void delay_2s()
{
   //自己实现的延时
}

void task2()
{
    while(1)
   {
         delay_2s();//自己实现的延时2S
         printf("task2\r\n");
         OSTimeDlyHMSM(0, 0, 0, 500,OS_OPT_TIME_HMSM_STRICT,&err);     
   }
}



最佳答案

查看完整内容[请看2#楼]

我试验过没问题啊,优先级高的task1延时到了就运行,不管task2有没有释放CPU,我把代码和截图贴出来。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-12-15 17:17:32 | 显示全部楼层
我试验过没问题啊,优先级高的task1延时到了就运行,不管task2有没有释放CPU,我把代码和截图贴出来。
KTK_)IF)8YG9HMF3ZL0I3VE.png

例10-3 UCOSIII使用信号量进行任务同步.rar

13.5 MB, 下载次数: 221

回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-11-10
在线时间
5 小时
 楼主| 发表于 2017-12-15 17:19:33 | 显示全部楼层
为什么会这样??
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-12-15 17:45:05 | 显示全部楼层
本帖最后由 zuozhongkai 于 2017-12-15 17:46 编辑

你从哪里得出的task2优先级小于10时,task1不能实现0.5s打印“task1”的结论?就你这个试验写法,task1和task2都能非常正常的工作,每个时钟周期UCOSIII都会进行一次任务切换!task1的优先级为3高于task2的4,所以每次任务切换的时候task1都会运行!!
回复

使用道具 举报

0

主题

4

帖子

0

精华

新手上路

积分
28
金钱
28
注册时间
2016-4-20
在线时间
6 小时
发表于 2017-12-16 13:01:36 | 显示全部楼层
个人觉得问题的关键是你自己写的延时函数,是用系统函数来堆积,还是用耗时指令是堆积。如果用系统函数的话,这中间就会引起任务调度!
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-11-10
在线时间
5 小时
 楼主| 发表于 2017-12-16 17:17:19 | 显示全部楼层
zuozhongkai 发表于 2017-12-15 17:45
你从哪里得出的task2优先级小于10时,task1不能实现0.5s打印“task1”的结论?就你这个试验写法,task1和ta ...

不是得出结论,是不懂哪里出现问题导致这种情况出现; 当我把task2任务优先级设置为小于10时,task1确实不能准时打印。
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-12-20 16:25:22 | 显示全部楼层
zuozhongkai 发表于 2017-12-15 17:45
你从哪里得出的task2优先级小于10时,task1不能实现0.5s打印“task1”的结论?就你这个试验写法,task1和ta ...

左哥,更确切的是说每个时钟节拍都会运行就绪链表的最高优先级任务
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2017-12-20 16:27:59 | 显示全部楼层
1547674987 发表于 2017-12-20 16:25
左哥,更确切的是说每个时钟节拍都会运行就绪链表的最高优先级任务

对的,是这个道理。
开往春天的手扶拖拉机
回复

使用道具 举报

2

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
63
金钱
63
注册时间
2013-11-10
在线时间
5 小时
 楼主| 发表于 2017-12-20 16:53:58 | 显示全部楼层
1547674987 发表于 2017-12-20 15:04
我试验过没问题啊,优先级高的task1延时到了就运行,不管task2有没有释放CPU,我把代码和截图贴出来。

原因找到了    从官方下载STM32F17例程  该工程的Tick任务优先级设为10   没注意     现在改为1就好了
回复

使用道具 举报

23

主题

344

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2305
金钱
2305
注册时间
2017-7-6
在线时间
280 小时
发表于 2017-12-20 19:52:38 | 显示全部楼层
umbra 发表于 2017-12-20 16:53
原因找到了    从官方下载STM32F17例程  该工程的Tick任务优先级设为10   没注意     现在改为1就好了

这个问题我之前倒是没考虑过,很好 给大家一个警示。下的官方代码TICK任务优先级太低,接收到信号量但是运行不了导致就绪列表无法更新
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-2 04:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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