在编写项目应用时,常常会遇到一个任务和另一个任务进行“沟通交流”的情况,在没有操作系统时,全局变量可以解决这个问题,但是如果在使用操作系统的应用中用全部变量来传递信息就会涉及到“资源管理”的问题,而且全局变量不易维护,往往逻辑复杂的程序中,无法追踪全局变量被谁使用或被谁更改。 FreeRTOS对此提供一个叫做“队列”的机制。
本文分为如下几部分:
- 队列简介
- 队列结构体
- 队列创建
- 向队列发送消息
- 队列上锁和解锁
- 从队列读取信息
队列简介
数据存储
队列采用先进先出(FIFO)的存储缓冲机制。数据发送到队列中会导致数据拷贝,也就是将要发送的数据拷贝到队列中,这意味着在队列中存储的是数据原始值,也就是值传递。虽然这样会浪费一点时间,但是一旦将消息发送到队列中原始的数据缓冲区就可以删除或覆写,FreeRTOS中队列传递消息虽然使用的数据拷贝,但也可以使用引用来传递消息。
多任务访问
任何任务都可以向队列中发送消息,或从队列中提取消息。
出队阻塞
当任务尝试从一个队列中读取消息的时候可以指定一个阻塞时间,这个阻塞时间就是当任务从队列中读取消息无效的时候任务阻塞的时间。
比如说队列Q是空的,这是A任务来读取,此时A又三种选择:
- 不等待
- 等待一段时间
- 死等
选哪一个由阻塞时间决定
入队阻塞
入队是指向队列中发送消息,将消息加入到队列中,和出队阻塞一样,当一个任务向队列中发送消息的话也可以设置阻塞时间。
队列操作过程
队列结构体
结构体定义在queue.c中:
typedef struct QueueDefinition
{
int8_t *pcHead;
int8_t *pcWriteTo;
{