ucos-iii和FreeRTOS的优先级问题总结

UC/OSiii的任务优先级影响
1、uc/os-iii 使用的调度算法是:优先级 + 时间片轮转
2、优先级指的是,高优先级一旦就绪,就可以抢占低优先级的执行权,换句话说,高优先级如果一直处于 ready 状态,就会一直 run, 那么低优先级的任务,就只能永远在墙角哭了(一直 block)
3、因此高优先级的任务,不能总是 ready/run,总是要适时主动进入 block 状态,进入的方法:task_delay、等待内核同步对象等(信号量、互斥量、消息队列、事件等),task_suspend 等
4、而时间片轮转,只针对同一优先级的任务,这个理论上不需要你主动进入 block 状态(当然你如果这样,就会影响到更低优先级的任务,原因参考上面所述),因为时间片一到,就会被强制切换到下一个就绪任务(同一优先级)
在这里插入图片描述
FreeRTOS的任务优先级影响
1、ucos-iii与FreeRTOS的区别:
FreeRTOS在过程上大致与UC/OS相似,但他们的任务优先级却是相反。
FreeRTOS的优先值越小其优先级越小,反之则越大。
2、FreeRTOS的任务优先级分析:

1)任务2优先级比任务1优先级高,且没有事件驱动发生,则任务2一直抢占任务1的CPU使用权,任务1将不被执行(被饿死)。原因:由于系统检测任务2一直处于就绪态,并没有让出CPU的事件发生,因此任务1无法被CPU调度,一直处于睡眠态。如下图所示:
在这里插入图片描述
2)当两个任务同等级优先级时且无事件驱动,他们将会被相互打断
3)当两个任务同等级优先级时,任务1添加了事件驱动(延时1s进行任务调度),此时任务2处于就绪态一直执行,当任务1延时1s后再次切换为就绪态去执行相应的任务,如下图所示:
在这里插入图片描述
4)当两个任务优先级相同且都有事件驱动时(均为延时,延时时间相同),他们之间类似情况2会相互打断,但是任务1总是先被执行,因为任务1比任务2要先创建。
若想避免互相打断这个问题,可以使用vTaskSuspend()API函数挂起其中一个任务,等待执行中的任务执行完后再使用vTaskResume()API函数恢复被挂起的任务。如下图所示:
在这里插入图片描述
5)当两个任务优先级不相同(任务1优先级比任务2优先级高)但都有事件驱动时(均为延时,延时时间相同),他们将被看似是同时在执行任务,但通过比较他们的优先级会发现,优先级高的总是会先执行,由于时间片的切换时间太小,可忽略不计,因此他们都能同时正常工作,如下图所示:
在这里插入图片描述
6)两个任务的优先级相同,都有(延时)事件驱动,任务1延时1s,任务2延时1.2s,两个任务都能正常工作,如下图所示:
在这里插入图片描述
7)对于不太重要的任务我们可以通过设置其的优先级或延时时间来区别对待执行先后顺序,当多个任务优先级相同的情况下,我们也可以通过设置他们的延时时间来分别执行,他们会相互打断。
注意:FreeRTOS的临界区代码可以添加延时或阻塞操作,而UC/OS中的临界区代码是不可以添加延时或阻塞操作,一旦添加延时或阻塞操作,调用临界区保护的函数则会失效!!!
结论:(必须满足有事件驱动的情况下)只要当两个或多个任务的优先级不相同时或延时睡眠设置值不同时多任务都可以正常执行不会被相互打断,只有同时满足上面两个条件时多任务之间就会相互打断。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值