MS-RTOS 二值信号量

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

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