首页 > 代码库 > rtx任务间通信--互斥量

rtx任务间通信--互斥量

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

rtx任务间通信--互斥量