定义不再赘述,可以查询官方文档 ,这里可以直达官方文档
队列控制块创建 rt_mq_t 指针
rt_mq_t rtmq1;
控制块创建函数 rt_mq_creat
rtmq1=rt_mq_create("mq1",80,1,RT_IPC_FLAG_PRIO);
往队列发送数据的函数 rt_send
u8 mq_send_buffer[]={
"这是往消息队列发送的数据"};
rt_mq_send(rtmq1,mq_send_buffer,sizeof(mq_send_buffer));
接收队列数据的函数rt_recv
u8 recv[sizeof(mq_send_buffer)];
rt_mq_recv(rtmq1,recv,sizeof(mq_send_buffer),-1);
手敲Demo(缓冲区需要自己定义的好识别点)
#include "stm32f10x.h"
#include "delay.h"
#include "rtthread.h"
#include "usart.h"
rt_timer_t testtimer;
void timer1_get(void*wen);
//创建线程所必须要的全局变量
u8 wen1[]={
"这是往消息队列发送的数据这是往消息队列发送的数据这是往消息队列发送的数据"};
//线程创建1
rt_thread_t rtt1;
//线程创建2
rt_thread_t rtt2;
//消息队列创建
rt_mq_t rtmq1;
void rtt1out(void*wen);
void rtt2out(void*wen);
int main(void)
{
//创建线程
rtt1=rt_thread_create("r1",rtt1out,RT_NULL,256,1,0);
if(rtt1!=RT_NULL)
{
rt_kprintf("线程1创建成功\r\n");
}
else
rt_kprintf("线程1创建失败\r\n");
rt_thread_startup(rtt1);
//创建线程2
rtt2=rt_thread_create("r2",rtt2out,RT_NULL,256,2,0);
if(rtt2!=RT_NULL)
{
rt_kprintf("线程2创建成功\r\n");
}
else
rt_kprintf("线程2创建失败\r\n");
rt_thread_startup(rtt2);
//创建消息队列
rtmq1=rt_mq_create("mq1",80,1,RT_IPC_FLAG_PRIO);
}
void rtt1out(void*wen)
{
while(1)
{
rt_kprintf("线程1运行\r\n");
//rt_mq_send(rtmq1,wen1,sizeof(wen1));
rt_thread_mdelay(100);
}
}
void rtt2out(void*wen)
{
u8 recv[sizeof(wen1)];
while(1)
{
rt_kprintf("线程2运行\r\n");
rt_mq_recv(rtmq1,recv,sizeof(wen1),-1);
rt_kprintf("接收到队列的数据为%s\r\n",recv);
rt_thread_mdelay(100);
}
}
补充
函数参数的查询方法,把鼠标悬浮在函数上面会显示参数
易错点!!!
消息队列创建的时候要预估你传送的数据大小进行,一个英文1字节,一个汉字两字节,没有预估好大小会导致线程阻塞!!!
工程的现象
线程1循环往队列发送数据
线程2循环读取队列数据
可以使用函数往队列一直发送数据
但是如果单独使用从队列获取的函数且没有对应的发送函数队列会挂起
资料获取
github地址放评论区