rtx任务间通信--互斥量

2013-11-06 
--luoqindong
void os_mut_init (
    OS_ID mutex );    /* The mutex to initialize */


初始化一个互斥量,互斥量内部计数计为0, mutex类型必须为OS_MUT.在调用互斥量相关函数之前,必须用该函数先初始化互斥量.


OS_RESULT os_mut_wait (
    OS_ID mutex,        /* The mutex to acquire */
    U16   timeout );    /* Length of time to wait */


返回值:
OS_R_OK 获取到互斥量,给互斥量上锁后返回
OS_R_MUT  任务挂起,在超时之前获取到互斥量,给互斥量上锁后返回
OS_R_TMO    等待互斥量超时返回.


该函数用于获取一个互斥量,
1. 如果互斥量没有上锁(计数计为0),将互斥量计数计加1后返回OS_R_OK,
2. 如果互斥量已上锁,调用该函数的任务会挂起(timeout !=0 的情况),
3. 在超时前获取到互斥量,该函数返回OS_R_MUT,超时后返回OS_R_TMO.


互斥量使用优先级继承机制解决优先级反转的问题,如一全局变量G受到互斥量的保护,任务A优先级为1,需要访问该全局变量,所以先占有了互斥量,
在任务A还在访问完全局变量时,切换到了优先级为2的任务B运行,B也想访问全局变量G,于是调用os_mut_wait获取互斥量,但是任务A现在占有互
斥量且优先级比任务B低,这时os_mut_wait将任务A的优先级改为2(任务B的优先级),让任务A先运行,任务A访问完全局变量G,调用os_mut_release
释放互斥量时,会将任务A优先级恢复为1.


参数mutex类型必须为OS_MUT, timeout为超时时间,单位为系统tick, 0和0xffff为特殊值:
timeout=0时,获取不到互斥量会立即返回OS_R_TMO
timeout=0xffff表示无限等待


OS_RESULT os_mut_release (
        OS_ID mutex );    /* The mutex to release */


返回值:
OS_R_OK   互斥量解锁成功
OS_R_NOK  解锁出错: 1. 互斥量内部计数计为0  2. 调用该函数的任务不是互斥量的拥有者(如任务A上锁互斥量,但是任务B去解锁) 


如果任务A占有互斥量M,任务A可以继续调用os_mut_wait获取互斥量M,这时os_mut_wait只是简单的将互斥量计数计加1,然后返回。
调用os_mut_release解锁互斥量时,


1.如果互斥量内部计数计>=1,将计数计减1,返回OS_R_OK.
2.互斥量内部计数计为0, 返回OS_R_NOK


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值