【FreeRtos教程三】STM32 CubeMx——Message Queue(消息队列)

目录

1.消息队列

1.1什么是消息队列

1.2 传输数据的两种方法

1.3 队列的阻塞访问

1.4 读取队列的两种方式

2 示例程序

2.1 以拷贝值的方式传递数据

2.1.1 例程功能

2.1.2 步骤

2.1.3 实验结果

2.1.4 函数讲解

2.1.5 程序源码

2.2 以拷贝地址的方式传递数据

2.2.1 例程功能

2.2.2 步骤

2.2.3 实验结果

2.2.4 函数讲解

2.2.5 程序源码



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
      
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值