MS-RTOS 消息队列

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

MS-RTOS 消息队列

本章将介绍 MS-RTOS 消息队列的使用。

消息队列相关数据类型

类型描述
ms_mqueue_stat_t消息队列的状态信息结构类型

ms_eventset_stat_t

消息队列的状态信息结构类型:

typedef struct {
    ms_ptr_t    msg_buf; 
    ms_uint16_t msg_count;
} ms_mqueue_stat_t;
参数说明
msg_buf消息缓冲区的基地址
msg_count消息队列中消息数目

消息队列相关 API

下表展示了消息队列相关的 API 在两个权限空间下是否可用:

API用户空间内核空间
ms_mqueue_create
ms_mqueue_destroy
ms_mqueue_wait
ms_mqueue_trywait
ms_mqueue_post
ms_mqueue_trypost
ms_mqueue_post_overwrite
ms_mqueue_post_front
ms_mqueue_trypost_front
ms_mqueue_post_front_overwrite
ms_mqueue_flush
ms_mqueue_stat
ms_mqueue_recv
ms_mqueue_send

ms_mqueue_create()

  • 描述 创建一个消息队列

  • 函数原型

ms_err_t ms_mqueue_create(const char *name, ms_ptr_t msg_buf, ms_uint16_t n_msg, 
                            ms_uint16_t msg_size, ms_ipc_opt_t opt, 
                            ms_handle_t *mqueueid);
  • 参数
输入/输出参数描述
[in]name消息队列的名字,不能为空指针
[in]msg_buf消息缓冲区的基地址
[in]n_msg消息缓冲区能存放多少则消息
[in]msg_size每则消息的大小
[in]opt消息队列的选项
[out]mqueueid消息队列的 ID,不能为空指针

opt 参数可以取如下的值:

含义
MS_WAIT_TYPE_PRIO按优先级高低规则等待
MS_WAIT_TYPE_FIFO按先来先服务规则等待
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 不能在中断中调用

  • 示例

static ms_handle_t mqueue_id;

static ms_uint8_t mqueue[16U * 4U];

int main(int argc, char *argv[])
{
    ms_mqueue_create("mqueue", mqueue, 16U, 4U, MS_WAIT_TYPE_PRIO, &mqueue_id);

    return 0;
}

ms_mqueue_destroy()

  • 描述 销毁一个消息队列

  • 函数原型

ms_err_t ms_mqueue_destroy(ms_handle_t mqueueid);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 不能在中断中调用

  • 示例

static ms_handle_t mqueue_id;

static ms_uint8_t mqueue[16U * 4U];

int main(int argc, char *argv[])
{
    ms_mqueue_create("mqueue", mqueue, 16U, 4U, MS_WAIT_TYPE_PRIO, &mqueue_id);

    // do some thing

    ms_mqueue_destroy(mqueue_id);

    return 0;
}

ms_mqueue_wait()

  • 描述 从消息队列中取出一则消息,也可以使用接口别名 ms_mqueue_recv

  • 函数原型

ms_err_t ms_mqueue_wait(ms_handle_t mqueueid, ms_ptr_t msg, ms_tick_t timeout);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
[out]msg用于接收消息的缓冲区
[in]timeout消息队列空时需要等待的超时时间
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 中断中或内核锁定期间调用,timeout 必须为 MS_TIMEOUT_NO_WAIT,不能在内核启动前调用

  • 示例

static ms_handle_t mqueue_id;

static ms_uint8_t mqueue[16U * 4U];

int main(int argc, char *argv[])
{
    ms_uint32_t msg;

    ms_mqueue_create("mqueue", mqueue, 16U, 4U, MS_WAIT_TYPE_PRIO, &mqueue_id);

    ms_mqueue_wait(mqueue_id, &msg, 1000U);

    ms_mqueue_destroy(mqueue_id);

    return 0;
}

ms_mqueue_trywait()

  • 描述 尝试从消息队列中取出一则消息

  • 函数原型

ms_err_t ms_mqueue_trywait(ms_handle_t mqueueid, ms_ptr_t msg);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
[out]msg用于接收消息的缓冲区
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

ms_mqueue_post()

  • 描述 投递一则消息到消息队列,也可以使用接口别名 ms_mqueue_send

  • 函数原型

ms_err_t ms_mqueue_post(ms_handle_t mqueueid, ms_ptr_t msg, ms_tick_t timeout);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
[in]msg消息的缓冲区
[in]timeout消息队列满时需要等待的超时时间
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 中断中、内核锁定期间或内核启动前调用,timeout 必须为 MS_TIMEOUT_NO_WAIT

  • 示例

static ms_handle_t test_tid;
static ms_handle_t mqueue_id;

static ms_uint8_t mqueue[16U * 4U];

static void test_thread(void *arg)
{
    ms_uint32_t msg;

    ms_mqueue_wait(mqueue_id, &msg, MS_TIMEOUT_FOREVER);

    // msg come
    // do some thing
}

int main(int argc, char *argv[])
{
    ms_uint32_t msg;

    ms_mqueue_create("mqueue", mqueue, 16U, 4U, MS_WAIT_TYPE_PRIO, &mqueue_id);

    ms_thread_create("test", test_thread, MS_NULL,
                    4096U, 16U, 0U,
                    MS_THREAD_OPT_USER, &test_tid);

    ms_thread_sleep_s(1U);

    // post msg
    msg = 0xabcdabcdUL;
    ms_mqueue_post(mqueue_id, &msg, MS_TIMEOUT_FOREVER);

    ms_thread_sleep_s(1U);

    return 0;
}

ms_mqueue_trypost()

  • 描述 尝试投递一则消息到消息队列

  • 函数原型

ms_err_t ms_mqueue_trypost(ms_handle_t mqueueid, ms_ptr_t msg);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
[in]msg消息的缓冲区
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

ms_mqueue_post_overwrite()

  • 描述 投递一则消息到消息队列,如果队列满,则覆写队列末尾的一则消息

  • 函数原型

ms_err_t ms_mqueue_post_overwrite(ms_handle_t mqueueid, ms_const_ptr_t msg);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
[in]msg消息的缓冲区
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

ms_mqueue_post_front()

  • 描述 投递一则消息到消息队列的前面

  • 函数原型

ms_err_t ms_mqueue_post_front(ms_handle_t mqueueid, ms_const_ptr_t msg, ms_tick_t timeout);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
[in]msg消息的缓冲区
[in]timeout消息队列满时需要等待的超时时间
  • 返回值 MS-RTOS 内核错误码

  • 注意事项 中断中、内核锁定期间或内核启动前调用,timeout 必须为 MS_TIMEOUT_NO_WAIT

  • 示例

static ms_handle_t test_tid;
static ms_handle_t mqueue_id;

static ms_uint8_t mqueue[16U * 4U];

static void test_thread(void *arg)
{
    ms_uint32_t msg;

    ms_mqueue_wait(mqueue_id, &msg, MS_TIMEOUT_FOREVER);

    // msg come
    // do some thing
}

int main(int argc, char *argv[])
{
    ms_uint32_t msg;

    ms_mqueue_create("mqueue", mqueue, 16U, 4U, MS_WAIT_TYPE_PRIO, &mqueue_id);

    ms_thread_create("test", test_thread, MS_NULL,
                    4096U, 16U, 0U,
                    MS_THREAD_OPT_USER, &test_tid);

    ms_thread_sleep_s(1U);

    // post msg
    msg = 0xabcdabcdUL;
    ms_mqueue_post_front(mqueue_id, &msg, MS_TIMEOUT_FOREVER);

    ms_thread_sleep_s(1U);

    return 0;
}

ms_mqueue_trypost_front()

  • 描述 尝试投递一则消息到消息队列的前面

  • 函数原型

ms_err_t ms_mqueue_trypost_front(ms_handle_t mqueueid, ms_ptr_t msg);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
[in]msg消息的缓冲区
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

ms_mqueue_post_front_overwrite()

  • 描述 投递一则消息到消息队列的前面,如果队列满,则覆写最前面的一则消息

  • 函数原型

ms_err_t ms_mqueue_post_overwrite(ms_handle_t mqueueid, ms_const_ptr_t msg);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
[in]msg消息的缓冲区
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

ms_mqueue_flush()

  • 描述 清空消息队列

  • 函数原型

ms_err_t ms_mqueue_flush(ms_handle_t mqueueid);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

static ms_handle_t test_tid;
static ms_handle_t mqueue_id;

static ms_uint8_t mqueue[16U * 4U];

static void test_thread(void *arg)
{
    ms_uint32_t msg;

    // flush msg
    ms_mqueue_flush(mqueue_id);

    ms_mqueue_wait(mqueue_id, &msg, MS_TIMEOUT_FOREVER);

    // msg come, msg will be 0xaa55aa55
    // do some thing
}

int main(int argc, char *argv[])
{
    ms_uint32_t msg;

    ms_mqueue_create("mqueue", mqueue, 16U, 4U, MS_WAIT_TYPE_PRIO, &mqueue_id);

    // post msg 0xabcdabcd
    msg = 0xabcdabcdUL;
    ms_mqueue_post(mqueue_id, &msg, MS_TIMEOUT_FOREVER);

    ms_thread_create("test", test_thread, MS_NULL,
                    4096U, 16U, 0U,
                    MS_THREAD_OPT_USER, &test_tid);

    ms_thread_sleep_s(1U);

    // post msg 0xaa55aa55
    msg = 0xaa55aa55UL;
    ms_mqueue_post(mqueue_id, &msg, MS_TIMEOUT_FOREVER);
    ms_thread_sleep_s(1U);

    return 0;
}

ms_mqueue_stat()

  • 描述 获得消息队列的状态

  • 函数原型

ms_err_t ms_mqueue_stat(ms_handle_t mqueueid, ms_mqueue_stat_t *stat);
  • 参数
输入/输出参数描述
[in]mqueueid消息队列的 ID
[out]stat消息队列的状态
  • 返回值 MS-RTOS 内核错误码

  • 注意事项

  • 示例

static ms_handle_t mqueue_id;

static ms_uint8_t mqueue[16U * 4U];

int main(int argc, char *argv[])
{
    ms_uint32_t msg;
    ms_mqueue_stat_t stat;

    ms_mqueue_create("mqueue", mqueue, 16U, 4U, MS_WAIT_TYPE_PRIO, &mqueue_id);

    // post msg
    msg = 0xabcdabcdUL;
    ms_mqueue_post(mqueue_id, &msg, MS_TIMEOUT_FOREVER);

    ms_mqueue_stat(mqueue_id, &stat);
    // do some thing

    ms_mqueue_destroy(mqueue_id);

    return 0;
}
文档内容是否对您有所帮助?
有帮助
没帮助