目录
1.消息队列
1.1什么是消息队列
消息队列类似于数据结构中的“队列”,都是一个线性的存储表。可以往队列里面写入数据,也可从队列里面读取数据。队列的简化操作如下图所示,从此图可知:
- 队列可以包含若干个数据:队列中有若干项,这被称为"长度"(length)
- 每个数据大小固定
- 创建队列时就要指定长度、数据大小
- 数据的操作采用先进先出的方法(FIFO,First In First Out):写数据时放到尾部,读数据时从头部读
- 也可以强制写队列头部:覆盖头部数据

1.2 传输数据的两种方法
- 拷贝:把数据或变量的值复制进队列里
- 引用:把数据或变量的地址复制进队列里
1.3 队列的阻塞访问
只要知道队列的句柄,谁都可以读、写该队列。
任务读写队列时,简单地说:如果读写不成功,则阻塞;可以指定超时时间。口语化地说,就是可以定个闹钟:如果能读写了就马上进入就绪态,否则就阻塞直到超时。
跟读队列类似,一个任务要写队列时,如果队列满了,该任务也可以进入阻塞状态:还可以指定阻塞的时间。如果队列有空间了,则该阻塞的任务会变为就绪态。如果一直都没有空间,则时间到之后它也会进入就绪态。
1.4 读取队列的两种方式
- Get(获取):使用函数osMessageGet()读队列的时候,读到一个数据,队列中的改数据会被移除
- Peek(偷窥):使用函数osMessagePeek()读队列的时候,此函数会从队列中复制出数据,但是不移除 数据
2 示例程序
使用队列传递数据的两种方法:
- 拷贝:把数据或变量的值复制进队列里
- 引用:把数据或变量的地址复制进队列里
2.1 以拷贝值的方式传递数据
2.1.1 例程功能
创建一个按键任务用来向队列里写数据,创建两个任务以PEEK和GET的方式从队列里面读取数据并打印出来。
2.1.2 步骤
配置按键的IO口

配置串口1,波特率115200、数据位8、停止位1、奇偶校验none

创建3个动态任务

创建一个队列,队列长度16(能存放16个数据),每个数据占32位

创建按键任务,按键按下即往消息队列里面发送数据
/* USER CODE END Header_StartTask_KEY */
void StartTask_KEY(void const * argument)
{
/* USER CODE BEGIN StartTask_KEY */
/* Infinite loop */
uint32_t ProducerValue=0;
for(;;)
{
if(HAL_GPIO_ReadPin(KEY_GPIO_Port,KEY_Pin)==0)
{
if(osMessagePut(myQueue01Handle,ProducerValue,100)!=osOK)
{
osThreadSuspendAll();
printf("发送失败\n"); //要添加头文件 stdio.h
osThreadResumeAll();
}
else
{
++ProducerValue;
osThreadSuspendAll();
printf("发送成功\n"); //要添加头文件 stdio.h

最低0.47元/天 解锁文章
2799





