RTT昨天新merge了一条PR
[kernel][ipc] 移除mutex RT_IPC_FLAG_FIFO 功能 #4852
对于描述中说的”互斥量诞生之初就是为了解决信号量带来的无界优先级反转问题(Sha, 1990),而FIFO flag却恰恰人为引入了无界优先级反转的问题“, 并且貌似是引述而来(Sha, 1990)。
它的改法很简单,仅仅是去掉了FIFO这个选项,默认强制设置为PRIO。
看一下其它OS怎么处理的:
UCOSIII:
UCOSIII挂队的统一接口是OS_Pend,信号量和互斥锁都是从这里进入。
它的实现是:
很明显可以看出UCOSIII也是按照优先级入队的。
再来看一下UCOSII,ucos使用事件来pend tcb,入口为OS_EventTaskWait:
看到按照优先级设置bitmap.
唤醒的流程是
唤醒操作也是按照优先级来进行的。不是FIFO。
看一下FreeRTOS:
初始化设置优先级到pxNewTCB->xEventListItem中
之后,在资源获取不到睡眠时,调用的是:
最终,也是按照优先级进行排序的:
nuttx系统的做法:
nuttx系统在资源获取不到进入睡眠时会调用nxsched_add_blocked函数,此函数会判断全局列表的类型,如是是PRIORITIZED的类型,则需要按照优先级进行入队。否则,加入普通队列。
nuttx 的所有队列都是全局的,而不像其它系统,每个ipc对象都有一个队列。所以通过全局列表可以看出队列的属性,从下图可以看出,大部分的队列都是PRIORITIZED的,所以资源不到位时都会进入优先级队列等待。
所以看起来,大部分RTOS的资源就绪队列默认就是按照RTT中的RT_IPC_FLAG_PRIO模式管理的,RT_IPC_FLAG_FIFO模式用的很少,这个改动没有问题,有问题的是它的理由。