MS-RTOS 二值信号量
本章将介绍 MS-RTOS 二值信号量的使用。
二值信号量相关数据类型
类型 | 描述 |
---|---|
ms_semb_stat_t | 二值信号量的状态信息结构类型 |
ms_semb_stat_t
二值信号量的状态信息结构类型:
typedef struct {
ms_bool_t value;
} ms_semb_stat_t;
参数 | 说明 |
---|---|
value | 二值信号量的当前值 |
二值信号量相关的 API
下表展示了二值信号量相关的 API 在两个权限空间下是否可用:
API | 用户空间 | 内核空间 |
---|---|---|
ms_semb_create | ● | ● |
ms_semb_destroy | ● | ● |
ms_semb_wait | ● | ● |
ms_semb_trywait | ● | ● |
ms_semb_post | ● | ● |
ms_semb_stat | ● | ● |
ms_semb_create()
描述 创建一个二值信号量
函数原型
ms_err_t ms_semb_create(const char *name, ms_bool_t init_value, ms_ipc_opt_t opt,
ms_handle_t *sembid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | name | 二值信号量的名字,不能为空指针 |
[in] | init_value | 二值信号量的初始值 |
[in] | opt | 二值信号量的选项 |
[out] | sembid | 二值信号量的 ID,不能为空指针 |
opt 参数可以取如下的值:
宏 | 含义 |
---|---|
MS_WAIT_TYPE_PRIO | 按优先级高低规则等待 |
MS_WAIT_TYPE_FIFO | 按先来先服务规则等待 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t semb_id;
int main(int argc, char *argv[])
{
ms_semb_create("semb", MS_TRUE, MS_WAIT_TYPE_PRIO, &semb_id);
return 0;
}
ms_semb_destroy()
描述 销毁一个二值信号量
函数原型
ms_err_t ms_semb_destroy(ms_handle_t sembid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sembid | 二值信号量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t semb_id;
int main(int argc, char *argv[])
{
ms_semb_create("semb", MS_TRUE, MS_WAIT_TYPE_PRIO, &semb_id);
// do some thing
ms_semb_destroy(semb_id);
return 0;
}
ms_semb_wait()
描述 等待一个二值信号量
函数原型
ms_err_t ms_semb_wait(ms_handle_t sembid, ms_tick_t timeout);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sembid | 二值信号量的 ID |
[in] | timeout | 等待的超时时间 |
返回值 MS-RTOS 内核错误码
注意事项 中断中或内核锁定期间调用,timeout 必须为
MS_TIMEOUT_NO_WAIT
,不能在内核启动前调用示例
static ms_handle_t semb_id;
int main(int argc, char *argv[])
{
ms_semb_create("semb", MS_TRUE, MS_WAIT_TYPE_PRIO, &semb_id);
ms_semb_wait(semb_id, 1000U);
// do some thing
ms_semb_destroy(semb_id);
return 0;
}
ms_semb_trywait()
描述 尝试等待一个二值信号量
函数原型
ms_err_t ms_semb_trywait(ms_handle_t sembid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sembid | 二值信号量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 无
示例 无
ms_semb_post()
描述 发送一个二值信号量
函数原型
ms_err_t ms_semb_post(ms_handle_t sembid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sembid | 二值信号量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
static ms_handle_t test_tid;
static ms_handle_t semb_id;
static void test_thread(void *arg)
{
ms_semb_wait(semb_id, MS_TIMEOUT_FOREVER);
// semb come
// do some thing
}
int main(int argc, char *argv[])
{
ms_semb_create("semb", MS_FALSE, MS_WAIT_TYPE_PRIO, &semb_id);
ms_thread_create("test", test_thread, MS_NULL,
4096U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
ms_thread_sleep_s(1U);
// post semb
ms_semb_post(semb_id);
ms_thread_sleep_s(1U);
return 0;
}
ms_semb_stat()
描述 获得二值信号量的状态信息
函数原型
ms_err_t ms_semb_stat(ms_handle_t sembid, ms_semb_stat_t *stat);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | sembid | 二值信号量的 ID |
[out] | stat | 二值信号量的状态信息 |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
static ms_handle_t semb_id;
int main(int argc, char *argv[])
{
ms_semb_stat_t stat;
ms_semb_create("semb", MS_FALSE, MS_WAIT_TYPE_PRIO, &semb_id);
ms_semb_stat(semb_id, &stat);
// do some thing
return 0;
}