关注+星标公众号,不错过精彩内容!
1、什么是优先级反转
假设现在有三个任务TaskA(优先级高)、TaskB(优先级中)、TaskC(优先级低),一个信号量(Semaphore),此信号量用于任务之间争夺某个资源。在某一时刻,高优先级的TaskA和中优先级的TaskB由于其它原因挂起了,低优先级的TaskC获得信号量,正在独享这个资源,这时候高优先级TaskA就绪了,抢占了TaskC,高优先级的TaskA运行一段时间后也想得到这个信号量,但是信号量被低优先级的TaskC占用,无奈TaskA只能挂起等待,低优先级的TaskC获得CPU,这时候TaskB就绪了,再次抢占TaskC,但是这个TaskB并不想使用这个资源,没有办法,直到TaskB挂起后,才能运行TaskC,TaskC释放信号量之后高优先级的TaskA才能执行。看起来高优先级的TaskA还不如低优先级的TaskC优先级高,这就叫做优先级反转,TaskB的存在加剧了优先级反转。这种优先级反转问题在实时操作系统中带来的影响不容小觑,因此我们在编写代码时要避免出现优先级翻转影响实时性。
2、使用互斥信号量解决优先级翻转问题。
在RTOS中可以使用互斥信号量解决优先级问题,如FreeRTOS、ucos等。互斥信号量原理:如果一个互斥信号量被一个低优先级的TaskC获得,此时如果高优先级的TaskA也想获得这个信号量,由于信号量被TaskC占用,只能挂起,挂起TaskA的同时RTOS会把TaskC的优先级调整为和TaskA一样,让低优先级的TaskC继续执行,直至TaskC释放信号量,TaskC优先级恢复之前的优先级,这时TaskA获得信号量。提升TaskC优先级是为了让TaskC尽快地执行,执行完赶紧释放信号量,减少高优先级任务的挂起时间。
//FreeRTOS
SemaphoreHandle_t xSemaphoreCreateMutex(void)
//ucos
OS_EVENT *OSMutexCreate (INT8U prio, INT8U *err)
推荐阅读:
RTOS为什么用PendSV进行线程调度?
RTOS中SysTick中断优先级应该这样配置!
说一说RTOS
实时操作系统真的实时吗?