队列管理
队列的工作机制
队列通过FIFO的机制在任务间传递数据,主要有两种传输手段,而:
FreeRTOS uses the queue by copy method.
内存的读写都会产生任务的阻塞.
队列的使用
创建队列
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
/*创建队列,接受两个参数
*uxQueueLength:创建队列的长度
*uxItemSize:队列中单个存储单元的大小(详情参考前几篇文章内容中提到的内存对齐)
*return:一个队列handle,用于标识身份
*/
在队列中添加内容
BaseType_t xQueueSendToFront( QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait );
/*向队列头传送消息,接受三个参数
*xQueue:传送消息队列handle
*pvItemToQueue:传送消息的地址
*xTicksToWait:任务等待队列所阻塞的最长时间
*return:pdPASS和errQUEUE_FULL
*/
BaseType_t xQueueSendToBack( QueueHandle_t xQueue,
const void * pvItemToQueue,
TickType_t xTicksToWait );
/*
*向队列尾传送消息,接受三个参数
*和上面的几乎没区别,不赘述
*/
接收队列
BaseType_t xQueueReceive( QueueHandle_t xQueue,
void * const pvBuffer,
TickType_t xTicksToWait );
/*
*接收队列,接受三个参数
*xQueue
*pvBuffer:Queue所带着的数据包
*xTicksToWait
*return:pdPASS 和 errQUEUE_EMPTY
*/
队列状态查询
UBaseType_t uxQueueMessagesWaiting( QueueHandle_t xQueue );
/*
*查询有多少个在队列中等待传递
*xQueue
*return:剩余数目
*/
多资源的队列工作机制(重要)
虽然简单,但是涉及到两个内容蛮有意思
第一个是数据包定义的事情,节选自官方文档
/* Define an enumerated type used to identify the source of the data. */
typedef enum
{
eSender1,
eSender2
} DataSource_t;
/* Define the structure type that will be passed on the queue. */
typedef struct
{
uint8_t ucValue;
DataSource_t eDataSource;
} Data_t;
/* Declare two variables of type Data_t that will be passed on the queue. */
static const Data_t xStructsToSend[ 2 ] =
{
{ 100, eSender1 }, /* Used by Sender1. */
{ 200, eSender2 } /* Used by Sender2. */
};
第二个是由于receive的优先级低,导致了队列充满,因而send函数被阻塞,使得receive能够运行
用队列传输指针
思路没有变化,要注意的内容不来源于FreeRTOS中,来源于内存的使用是否合法.
有个有意思的事情是,由于FreeRTOS队列传输的办法用的是copy,所以表面上有种在传引用的感觉,和前文内容相违背,实际上并没有.
队列组
掌握几个给出的api,参数和返回值和前面提到的没有太大区别