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