MS-RTOS 条件变量

更新时间:
2023-08-09
下载文档

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;
}
文档内容是否对您有所帮助?
有帮助
没帮助