首页 > 代码库 > 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任务间通信--互斥量