定義は繰り返されません。公式ドキュメントを照会できます。ここから公式ドキュメントに直接アクセスできます。
キュー制御ブロックが 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);
ハンド ノックのデモ (バッファは適切な認識ポイントを定義する必要があります)
#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 バイト、漢字 1 文字は 2 バイトです. サイズを見積もらないと、スレッドがブロックされます! ! !
Project 現象
スレッド 1 ループでキューにデータを送信
スレッド 2 ループでキュー データを読み込み
常に関数を使用してキューにデータを送信することができます
しかし、キューから取得した関数のみを使用し、対応する送信関数がない場合、キューがハングします
データ収集
コメント欄にgithubのアドレスを入れてください