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设计上,习惯性的没有添加优先级反转问题的解决办法。
试想这么一个问题:
优先级 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