关于RTT新合PR的一些疑惑

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模式用的很少,这个改动没有问题,有问题的是它的理由。

结束!

  • 7
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

papaofdoudou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值