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


前言

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


一、什么是队列

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

1、数据存储

在这里插入图片描述

2、多任务访问

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

3、出队阻塞 与 入队阻塞

在这里插入图片描述
在这里插入图片描述

3、队列操作过程图示

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

二、创建队列

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
                        );

()在这里插入图片描述

(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 ) 

在这里插入图片描述

三、向队列发送消息

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

在这里插入图片描述
在这里插入图片描述

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

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

在这里插入图片描述
xQueueGenericSendFromISR 的参数与任务级通用入队函数的参数
一致。

四、队列上锁与解锁

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

五、从队列读取消息

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
另一个类似。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
另一个类似。

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

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值