MS-RTOS 计数信号量

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

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