7·STM32F103freeRTOS---队列与关于队列的实验

文章目录

  • 前言
  • 一、什么是队列
    • 1、数据存储
    • 2、多任务访问
    • 3、出队阻塞 与 入队阻塞
    • 3、队列操作过程图示
  • 二、创建队列
    • 1、函数原型
      • (1)动态创建
      • (2)静态创建
      • (3)xQueueGenericCreateStatic
  • 三、向队列发送消息
    • 以 FromISR结尾的函数都是用于中断服务函数中的
    • 真正干活的发送函数:xQueueGenericSend(任务级通用入队函数)和xQueueGenericSendFromISR(中断级通用入队函数)
  • 四、队列上锁与解锁
  • 五、从队列读取消息


前言

在实际运用中,会遇到一个任务或者中断服务需要和另一个任务进行“沟通”,这个沟通交流的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序就是通过使用全局变量来传递消息。但是如果在使用操作系统的应用中全局变量来传递消息就会涉及到“资源管理”的问题。freeRTOS就使用“队列”的机制来完成任务与任务,任务与中断之间的消息传递。


一、什么是队列

队列是为任务与任务,任务与中断之间的通信而存在。可以传递消息,这里的消息就是数据。如果还有疑问,不妨先看下去。
队列可以存储有限的、大小固定的数据项目。任务与任务,任务与中断之间的需要交流的数据保存在队列中,叫做队列项目。队列能保存的最大数据项目数量叫做队列的长度。创建队列时需要明确队列项目的大小和长度。
队列是用来传递信息的,所以又叫消息队列。
在freeRTOS中,队列是很重要的知识点。

1、数据存储

7·STM32F103freeRTOS---队列与关于队列的实验_第1张图片

2、多任务访问

队列不是属于某个特别指定的任务的,任何任务都可以向队列中发送消息,或者从队列中提取消息。
(不然它怎么在任务与任务,任务与中断之间传递消息嘞?)

3、出队阻塞 与 入队阻塞

7·STM32F103freeRTOS---队列与关于队列的实验_第2张图片
7·STM32F103freeRTOS---队列与关于队列的实验_第3张图片

3、队列操作过程图示

7·STM32F103freeRTOS---队列与关于队列的实验_第4张图片
7·STM32F103freeRTOS---队列与关于队列的实验_第5张图片
7·STM32F103freeRTOS---队列与关于队列的实验_第6张图片
7·STM32F103freeRTOS---队列与关于队列的实验_第7张图片
7·STM32F103freeRTOS---队列与关于队列的实验_第8张图片

二、创建队列

1、函数原型

(1)动态创建

QueueHandle_t xQueueCreate(
                       	 UBaseType_t uxQueueLength,
                    	 UBaseType_t uxItemSize
                      );

参数:
uxQueueLength:要创建的队列的长度,也就是队列的项目数。
uxItemSize:队列中每个项目(也就是 消息)的长度,单位是字节。

返回值:
成功创建就返回队列句柄
失败就返回NULL

(2)静态创建

QueueHandle_t xQueueCreateStatic(
                       		 UBaseType_t uxQueueLength,
                          	 UBaseType_t uxItemSize,
                      	     uint8_t *pucQueueStorageBuffer,
                       		 StaticQueue_t *pxQueueBuffer
                        );

()7·STM32F103freeRTOS---队列与关于队列的实验_第9张图片

(3)xQueueGenericCreateStatic

函数xQueueGenericCreateStatic()用于创建动态队列,创建队列过程中需要内存的动态管理函数pvPortMalloc分配。

QueueHandle_t xQueueGenericCreateStatic( const UBaseType_t uxQueueLength,
                                             const UBaseType_t uxItemSize,
                                             uint8_t * pucQueueStorage,
                                             StaticQueue_t * pxStaticQueue,
                                             const uint8_t ucQueueType ) 

7·STM32F103freeRTOS---队列与关于队列的实验_第10张图片

三、向队列发送消息

7·STM32F103freeRTOS---队列与关于队列的实验_第11张图片
7·STM32F103freeRTOS---队列与关于队列的实验_第12张图片
7·STM32F103freeRTOS---队列与关于队列的实验_第13张图片
在这里插入图片描述
7·STM32F103freeRTOS---队列与关于队列的实验_第14张图片

以 FromISR结尾的函数都是用于中断服务函数中的

7·STM32F103freeRTOS---队列与关于队列的实验_第15张图片
7·STM32F103freeRTOS---队列与关于队列的实验_第16张图片

真正干活的发送函数:xQueueGenericSend(任务级通用入队函数)和xQueueGenericSendFromISR(中断级通用入队函数)

BaseType_t xQueueGenericSend( QueueHandle_t xQueue,
                              const void * const pvItemToQueue,
                              TickType_t xTicksToWait,
                              const BaseType_t xCopyPosition )

7·STM32F103freeRTOS---队列与关于队列的实验_第17张图片
xQueueGenericSendFromISR 的参数与任务级通用入队函数的参数
一致。

四、队列上锁与解锁

内部实现,有一个上锁计数器,记录了在队列上锁期间,入队或者出队的数量,当队列上锁以后队列项是可以加入或者移除的,但是相应的列表不会。

五、从队列读取消息

7·STM32F103freeRTOS---队列与关于队列的实验_第18张图片

7·STM32F103freeRTOS---队列与关于队列的实验_第19张图片
在这里插入图片描述
另一个类似。

7·STM32F103freeRTOS---队列与关于队列的实验_第20张图片
在这里插入图片描述
7·STM32F103freeRTOS---队列与关于队列的实验_第21张图片
另一个类似。

代码荔枝:
我的另一篇博客:关于队列的使用
也有这篇博客的排错笔记。

你可能感兴趣的:(32freeRTOS,stm32,单片机,嵌入式硬件)