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;
}