rtx任务间通信--互斥量

来源:互联网 发布:剑网三有挂机软件么 编辑:程序博客网 时间:2024/05/17 08:44
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 0