mutex和semaphore不为人知的秘密

mutex 缘由:
试想这么一个问题:
优先级 task1 > task2 > task3, 并且拥有同一资源。
task3运行,并且获取资源,这时候task1运行抢占资源,task1获取不到资源阻塞,这时候task2运行。
这个过程违背了RTOS的原理,任何时候都是最高优先级就绪的任务运行的,task1没有运行,task2就运行了。
这就是优先级转问题。
所以为了解决这个问题,可以提升task3的优先级,这个优先级大于task2.
当task3优先级提升到被抢占的任务的优先级的策略叫优先级继承。
当task3优先级提升到预定设置的优先级的策略叫优先级置顶。

优先级继承存在的bug
任务优先级:A(3) > B(2) > C(1),并且拥有同一资源,括号内的数字表示优先级
任务C运行获取资源,任务B运行抢占资源,任务C优先级提升到2,任务B阻塞。这时候A运行抢占资源,C任务优先级被提升到1。
任务C释放资源,一切归于正常。
这时候,考虑C任务的优先级应该回退到优先级3。但是很多RTOS都没有考虑到资源被多次抢占后的优先级回退问题。

优先级置顶问题
优先级置顶的值不可以过高,否则可能会造成其他任务未能及时运行。该值应该比获得资源最高优先级的任务高一级。

semaphore缘由:
semaphore更加于任务之间的同步, 中断与任务之间的同步,semaphore在RTOS设计上,习惯性的没有添加优先级反转问题的解决办法。

所以semaphore不适合用于多个任务对同一资源抢占的保护办法, 因为会导致优先级反转问题,mutex适合。

Download source code:  https://github.com/yangshanjin/fos

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值