打印
[应用相关]

关于互斥(mutex)的实现

[复制链接]
2079|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 kingtut2008 于 2014-5-14 22:28 编辑

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

  

ucos-ii.jpg (116.45 KB )

ucos-ii.jpg

rtx.jpg (77.58 KB )

rtx.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

粉丝