[应用相关] 关于互斥(mutex)的实现

[复制链接]
2262|3
 楼主| kingtut2008 发表于 2014-5-14 22:28 | 显示全部楼层 |阅读模式
本帖最后由 kingtut2008 于 2014-5-14 22:28 编辑

如题,想搞清互斥的具体实现。
看了rtx(mdk自带的rtos)和ucos-ii的源代码,以mutex和semphare的实现为例,ucos在信号量的cnt(计数值)检测时,会进入临界区,而rtx的mutex值检测则不会。如下:

  
rtx.jpg
ucos-ii.jpg
 楼主| kingtut2008 发表于 2014-5-14 22:37 | 显示全部楼层
自己二楼补充。
其实就是,比如:检测某变量0或1,就像检测互斥一样,直接用如下方式,即rtx用的方式
if (mutex) {
  mutex--;//互斥可用
  ......
}
由于C语言中单句并非原子的,if (mutex)的执行应该不能保证原子,所以ucos才加进入临界区的吧。但rtx为什么又没加,mdk安装包中的源码应该不会儿戏的。不知道linux中如何实现。
有此疑问,哪位可以系统解释下。
 楼主| kingtut2008 发表于 2014-7-10 13:58 | 显示全部楼层
妈蛋,还是自问自答吧。
MDK的RTX至少在cortex-M平台上所有OS的调用都采用了cortex-M提供的SVC。
个人理解是,当调用os的提供的调用时,本就是进入了svc异常,相对于其它进程,当前进程已进入了临界区。
当前进程被其它进程抢占只可能是systick或者中断引起的异步通知等,此处涉及到:ucos的所有任务调度都是通过pengSV,而rtx不是,ucos也未采用svc,貌似使用关掉总中断这种自宫的方法。太细节的说不清了,总之,ucos是为通用平台设计的,rtx由mdk为各arm系列平台修改定制,与硬件的结合明显强于ucos。
bjxdylzsts 发表于 2014-7-10 15:54 | 显示全部楼层
支持原创。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

14

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部