MS-RTOS 条件变量
本章将介绍 MS-RTOS 条件变量的使用。
条件变量只能与互斥量配合使用,如果您还不清楚互斥量,建议先查阅互斥量章节。
条件变量相关 API
下表展示了条件变量相关的 API 在两个权限空间下是否可用:
API | 用户空间 | 内核空间 |
---|---|---|
ms_cond_create | ● | ● |
ms_cond_destroy | ● | ● |
ms_cond_wait | ● | ● |
ms_cond_trywait | ● | ● |
ms_cond_signal | ● | ● |
ms_cond_broadcast | ● | ● |
ms_cond_create()
描述 创建一个条件变量
函数原型
ms_err_t ms_cond_create(const char *name, ms_ipc_opt_t opt, ms_handle_t *condid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | name | 条件变量的名字,不能为空指针 |
[in] | opt | 条件变量的选项 |
[out] | condid | 条件变量的 ID,不能为空指针 |
opt 参数可以取如下的值:
宏 | 含义 |
---|---|
MS_WAIT_TYPE_PRIO | 按优先级高低规则等待 |
MS_WAIT_TYPE_FIFO | 按先来先服务规则等待 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t cond_id;
int main(int argc, char *argv[])
{
ms_cond_create("cond", MS_WAIT_TYPE_PRIO, &cond_id);
return 0;
}
ms_cond_destroy()
描述 销毁一个条件变量
函数原型
ms_err_t ms_cond_destroy(ms_handle_t condid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | condid | 条件变量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t cond_id;
int main(int argc, char *argv[])
{
ms_cond_create("cond", MS_WAIT_TYPE_PRIO, &cond_id);
ms_thread_sleep_s(1U);
ms_cond_destroy(cond_id);
return 0;
}
ms_cond_wait()
描述 等待一个条件变量
函数原型
ms_err_t ms_cond_wait(ms_handle_t condid, ms_handle_t mutexid, ms_tick_t timeout);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | condid | 条件变量的 ID |
[in] | mutexid | 互斥量的 ID |
[in] | timeout | 等待的超时时间 |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例
static ms_handle_t cond_id;
static ms_handle_t mutex_id;
int main(int argc, char *argv[])
{
ms_cond_create("cond", MS_WAIT_TYPE_PRIO, &cond_id);
ms_mutex_create("mutex", MS_WAIT_TYPE_PRIO, &mutex_id);
ms_cond_wait(cond_id, mutex_id, 1000U);
return 0;
}
ms_cond_trywait()
描述 尝试等待一个条件变量
函数原型
ms_err_t ms_cond_trywait(ms_handle_t condid, ms_handle_t mutexid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | condid | 条件变量的 ID |
[in] | mutexid | 互斥量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 不能在中断中调用
示例 无
ms_cond_signal()
描述 发送一个条件变量
函数原型
ms_err_t ms_cond_signal(ms_handle_t condid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | condid | 条件变量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
static ms_handle_t test_tid;
static ms_handle_t cond_id;
static ms_handle_t mutex_id;
static void test_thread(void *arg)
{
// lock the resource pool
ms_mutex_lock(mutex_id, MS_TIMEOUT_FOREVER);
// do some thing
// no resource, wait condition variable
ms_cond_wait(cond_id, mutex_id, MS_TIMEOUT_FOREVER);
// get resource, do some thing
// unlock the resource pool
ms_mutex_unlock(mutex_id);
}
int main(int argc, char *argv[])
{
ms_cond_create("cond", MS_WAIT_TYPE_PRIO, &cond_id);
ms_mutex_create("mutex", MS_WAIT_TYPE_PRIO, &mutex_id);
ms_thread_create("test", test_thread, MS_NULL,
1024U, 16U, 0U,
MS_THREAD_OPT_USER, &test_tid);
ms_thread_sleep_s(1U);
// lock the resource pool
ms_mutex_lock(mutex_id, MS_TIMEOUT_FOREVER);
// produce resource, signal condition variable
ms_cond_signal(cond_id);
// unlock the resource pool
ms_mutex_unlock(mutex_id);
ms_thread_sleep_s(1U);
return 0;
}
ms_cond_broadcast()
描述 广播一个条件变量
函数原型
ms_err_t ms_cond_broadcast(ms_handle_t condid);
- 参数
输入/输出 | 参数 | 描述 |
---|---|---|
[in] | condid | 条件变量的 ID |
返回值 MS-RTOS 内核错误码
注意事项 无
示例
#include <ms_rtos.h>
static ms_handle_t test0_tid;
static ms_handle_t test1_tid;
static ms_handle_t cond_id;
static ms_handle_t mutex_id;
static void test_thread0(void *arg)
{
// lock the resource pool
ms_mutex_lock(mutex_id, MS_TIMEOUT_FOREVER);
// do some thing
// no resource, wait condition variable
ms_cond_wait(cond_id, mutex_id, MS_TIMEOUT_FOREVER);
// get resource, do some thing
// unlock the resource pool
ms_mutex_unlock(mutex_id);
}
static void test_thread1(void *arg)
{
// lock the resource pool
ms_mutex_lock(mutex_id, MS_TIMEOUT_FOREVER);
// do some thing
// no resource, wait condition variable
ms_cond_wait(cond_id, mutex_id, MS_TIMEOUT_FOREVER);
// get resource, do some thing
// unlock the resource pool
ms_mutex_unlock(mutex_id);
}
int main(int argc, char *argv[])
{
ms_cond_create("cond", MS_WAIT_TYPE_PRIO, &cond_id);
ms_mutex_create("mutex", MS_WAIT_TYPE_PRIO, &mutex_id);
ms_thread_create("test0", test_thread0, MS_NULL,
1024U, 16U, 0U,
MS_THREAD_OPT_USER, &test0_tid);
ms_thread_create("test1", test_thread1, MS_NULL,
1024U, 16U, 0U,
MS_THREAD_OPT_USER, &test1_tid);
ms_thread_sleep_s(1U);
// lock the resource pool
ms_mutex_lock(mutex_id, MS_TIMEOUT_FOREVER);
// produce resource, broadcast condition variable
ms_cond_broadcast(cond_id);
// unlock the resource pool
ms_mutex_unlock(mutex_id);
ms_thread_sleep_s(1U);
return 0;
}