今天刚看了一下freertos的使用信号量对资源进行访问控制时会出现的优先级翻转问题,由于自己对这部分内容认识还不够清楚,所以写下这篇文章来理清自己的学习思路,并分享出来
假设在freertos当中有多个任务都要访问某一种资源,但该种资源是有限的,所以就要进行访问控制,取一个极限情况,该资源只有一种,所以我们就要使用互斥信号量对该资源进行访问控制,当获取到信号量时,则代表该资源无人使用,可以放心使用,但使用结束后一定要释放信号量来告诉其他任务现在资源无人使用。这就导致如果一个低优先级任务正在持有资源,而一个高优先级任务也在等待该资源,这时高优先级任务必须要等待低优先级释放资源,高优先级任务才可以获取到资源从而进入就绪队列来 获取cpu进行运行,但是如果现在就绪队列中有中级优先级任务,这样的话该任务就会从正在运行的低优先级任务中抢占cpu,从而使获取资源的低优先级任务处于就绪队列,直到中优先级任务执行完毕,才可以轮到低优先级执行,然后执行完毕释放信号量,使得高优先级任务获取信号量从而运行,这样的话高优先级任务就多等待了中优先级任务的时间,使得高优先级任务反而最后运行,这样会导致很严重的后果,就叫做优先级翻转问题
那么该如何解决优先级翻转问题,上述问题所在与高优先级多等待了中优先级任务执行的时间,我们肯定希望高优先级任务只需要等待持有互斥资源的低优先级执行的时间,不希望低优先级执行时被别的低于高优先级的任务打断,这时就可以把低优先级任务的优先级提升,提升到等待资源的阻塞队列中的最高优先级,这样的话就可以避免优先级翻转问题