MS-RTOS 互斥量
本章将介绍 MS-RTOS 互斥量的使用。
互斥量相关 API
下表展示了互斥量相关的 API 在两个权限空间下是否可用:
API | 用户空间 | 内核空间 |
---|---|---|
ms_mutex_create | ● | ● |
ms_mutex_destroy | ● | ● |
ms_mutex_lock | ● | ● |
ms_mutex_trylock | ● | ● |
ms_mutex_unlock | ● | ● |
ms_mutex_create()
描述 创建一个互斥量
函数原型
ms_err_t ms_mutex_create(const char *name, ms_ipc_opt_t opt, ms_handle_t *mutexid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | name | 互斥量的名字,不能为空指针 |
[in] | opt | 互斥量的选项 |
[out] | mutexid | 互斥量的 ID,不能为空指针 |
opt 参数可以取如下的值:
宏 | 含义 |
---|---|
MS_WAIT_TYPE_PRIO | 按优先级高低规则等待 |
MS_WAIT_TYPE_FIFO | 按先来先服务规则等待 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t mutex_id;
int main(int argc, char *argv[])
{
ms_mutex_create("mutex", MS_WAIT_TYPE_PRIO, &mutex_id);
return 0;
}
ms_mutex_destroy()
描述 销毁一个互斥量
函数原型
ms_err_t ms_mutex_destroy(ms_handle_t mutexid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mutexid | 互斥量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t mutex_id;
int main(int argc, char *argv[])
{
ms_mutex_create("mutex", MS_WAIT_TYPE_PRIO, &mutex_id);
// do some thing
ms_mutex_destroy(mutexid);
return 0;
}
ms_mutex_lock()
描述 锁住一个互斥量
函数原型
ms_err_t ms_mutex_lock(ms_handle_t mutexid, ms_tick_t timeout);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mutexid | 互斥量的 ID |
[in] | timeout | 等待的超时时间 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,在内核锁定期间调用,timeout 必须为
MS_TIMEOUT_NO_WAIT
,不能在内核启动前调用,与ms_mutex_unlock
配对使用示例 见
ms_mutex_unlock
ms_mutex_trylock()
描述 尝试锁住一个互斥量
函数原型
ms_err_t ms_mutex_trylock(ms_handle_t mutexid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mutexid | 互斥量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,与
ms_mutex_unlock
配对使用示例 见
ms_mutex_unlock
ms_mutex_unlock()
描述 解锁一个互斥量
函数原型
ms_err_t ms_mutex_unlock(ms_handle_t mutexid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | mutexid | 互斥量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用,不能在内核启动前调用,与
ms_mutex_lock
配对使用示例
static ms_handle_t mutex_id;
int main(int argc, char *argv[])
{
ms_mutex_create("mutex", MS_WAIT_TYPE_PRIO, &mutex_id);
ms_mutex_lock(mutex_id, MS_TIMEOUT_FOREVER);
// do some thing
ms_mutex_unlock(mutex_id);
ms_mutex_destroy(mutexid);
return 0;
}