学习之路主要为FreeRTOS操作系统在STM32F103(STM32F103C8T6)上的运用,采用的是标准库编程的方式,使用的IDE为KEIL5。
注意!!!本学习之路可以通过购买STM32最小系统板以及部分配件的方式进行学习,也可以通过Proteus仿真的方式进行学习。
后续文章会同时发表在个人博客(jason1016.club)、CSDN;
视频会发布在bilibili(UID:399951374)
一、FreeRTOS队列概念
在实际的应用中,常常会遇到一个任务或者中断服务需要和另外一个任务进行“沟通交流”,这个“沟通交流”的过程其实就是消息传递的过程。在没有操作系统的时候两个应用程序进行消息传递一般使用全局变量的方式,但是如果在使用操作系统的应用中用全局变量来传递消息就会涉及到“资源管理”的问题。FreeRTOS 对此提供了一个叫做“队列”的机制来完成任务与任务、任务与中断之间的消息传递
。
数据储存
通常队列采用先进先出(FIFO)的存储缓冲机制,也就是往队列发送数据的时候(也叫入队)永远都是发送到队列的尾部,而从队列提取数据的时候(也叫出队)是从队列的头部提取的。但是也可以使用 LIFO 的存储缓冲,也就是后进先出,FreeRTOS 中的队列也提供了 LIFO 的存储缓冲机制。
多任务访问
队列不是属于某个特别指定的任务的,任何任务都可以向队列中发送消息,或者从队列中提取消息。
出队阻塞
为防止任务接收传输队列时,队列还没有消息,导致任务接收空信息的情况下,设置了出队阻塞。
当任务尝试从一个队列中读取消息的时候可以指定一个阻塞时间,这个阻塞时间就是当任务从队列中读取消息无效的时候任务阻塞的时间。出队就是就从队列中读取消息,出队阻塞是针对从队列中读取消息的任务而言的。
不阻塞 | 阻塞时间为 0 | |
等一段时间,等不到就走 | ||
超级阻塞 |
入队阻塞
入队说的是向队列中发送消息,将消息加入到队列中。和出队阻塞一样,当一个任务向队列发送消息的话也可以设置阻塞时间。
二、队列创建
动态队列创建 | |
静态队列创建 |
//动态创建
QueueHandle_t xQueueCreate(UBaseType_t uxQueueLength,//消息队列长度
UBaseType_t uxItemSize) //消息的大小
/*返回值:
其他值: 队列创捷成功以后返回的队列句柄!
NULL: 队列创建失败。*/
//静态创建
QueueHandle_t xQueueCreateStatic(UBaseType_t uxQueueLength,
UBaseType_t uxItemSize,
uint8_t * pucQueueStorageBuffer,
StaticQueue_t * pxQueueBuffer)
三、队列操作
3.1向队列发送消息
BaseType_t xQueueSend( QueueHandle_t xQueue, //队列句柄
const void * pvItemToQueue, //要发送的信息
TickType_t xTicksToWait); //阻塞时间
/*返回值:
pdPASS: 向队列发送消息成功!
errQUEUE_FULL: 队列已经满了,消息发送失败。*/
3.2队列接收信息
BaseType_t xQueueReceive(QueueHandle_t xQueue, //队列句柄
void * pvBuffer, //保存数据的缓冲区
TickType_t xTicksToWait); //阻塞时间
/*返回值:
pdTRUE: 从队列中读取数据成功。
pdFALSE: 从队列中读取数据失败。*/
3.3队列上锁与解锁
队列上锁 | |
队列解锁 |