3、队列(queue)
2022-11-30 10:50:29 3 举报
AI智能生成
学习
作者其他创作
大纲/内容
特性
1、FIFO(First In First Out)先进先出
2、传输数据的两种方法
a.引用 (把数据、把变量的地址复制进队列里)
b. 拷贝 (把数据、把变量的值复制进队列里)
3、阻塞访问
函数
1、创建
动态分配内存
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
参数: uxQueueLength --> 队列长度,最多能存放多少个数据(item) uxItemSize --> 每个数据(item)的大小:以字节为单位
静态分配内存
QueueHandle_t xQueueCreateStatic(
UBaseType_t uxQueueLength, // 队列长度
UBaseType_t uxItemSize, //每个数据(item)的大小
uint8_t *pucQueueStorageBuffer,
StaticQueue_t *pxQueueBuffer
);
UBaseType_t uxQueueLength, // 队列长度
UBaseType_t uxItemSize, //每个数据(item)的大小
uint8_t *pucQueueStorageBuffer,
StaticQueue_t *pxQueueBuffer
);
参数 pucQueueStorageBuffer uxItemSize非0 pucQueueStorageBuffer必须指向一个uint8_t数组 pxQueueBuffer 必须执行一个StaticQueue_t结构体,用来保存队列的数据结构
复位 BaseType_t xQueueReset( QueueHandle_t pxQueue); //队列恢复为初始状态
删除 void vQueueDelete( QueueHandle_t xQueue );
写队列
任务中使用
BaseType_t xQueueSend( //队尾
QueueHandle_t xQueue, //队列句柄
const void *pvItemToQueue, //数据指针
TickType_t xTicksToWait //阻塞时间
);
QueueHandle_t xQueue, //队列句柄
const void *pvItemToQueue, //数据指针
TickType_t xTicksToWait //阻塞时间
);
BaseType_t xQueueSendToBack( //队尾
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);
BaseType_t xQueueSendToFront( //队头
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);
ISR中使用
BaseType_t xQueueSendToBackFromISR(
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
QueueHandle_t xQueue,
const void *pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
BaseType_t xQueueSendToFront(
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);
QueueHandle_t xQueue,
const void *pvItemToQueue,
TickType_t xTicksToWait
);
参数
xQueue 队列句柄,要写哪个队列
pvItemToQueue 数据指针,这个数据的值会被复制进队列,
xTicksToWait 如果队列满则无法写入新数据,可以让任务进入阻塞状态, 0 无法写入数据时函数会立刻返回 portMAX_DELAY,则会一直阻塞直到有空间可写
返回值 pdPASS:数据成功写入了队列
errQUEUE_FULL:写入失败,因为队列满了。
errQUEUE_FULL:写入失败,因为队列满了。
读队列
任务中使用
BaseType_t xQueueReceive( QueueHandle_t xQueue,
void * const pvBuffer,
TickType_t xTicksToWait );
void * const pvBuffer,
TickType_t xTicksToWait );
ISR中使用
BaseType_t xQueueReceiveFromISR(
QueueHandle_t xQueue,
void *pvBuffer,
BaseType_t *pxTaskWoken
);
QueueHandle_t xQueue,
void *pvBuffer,
BaseType_t *pxTaskWoken
);
参数
pvBuffer bufer指针,队列的数据会被复制到这个buffer
查询
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue ); //返回队列中可用数据的个数
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue ); //返回队列中可用空间的个数
覆盖/偷看
覆盖队列
BaseType_t xQueueOverwrite(
QueueHandle_t xQueue,
const void * pvItemToQueue
);
QueueHandle_t xQueue,
const void * pvItemToQueue
);
BaseType_t xQueueOverwriteFromISR(
QueueHandle_t xQueue,
const void * pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
QueueHandle_t xQueue,
const void * pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken
);
参数 pvItemToQueue 数据地址 返回值 pdTRUE --> 成功 pdFALSE --> 失败
偷看队列 读取时不移除数据
BaseType_t xQueuePeek( // peek --> 偷看,窥视
QueueHandle_t xQueue,
void * const pvBuffer,
TickType_t xTicksToWait
);
QueueHandle_t xQueue,
void * const pvBuffer,
TickType_t xTicksToWait
);
BaseType_t xQueuePeekFromISR(
QueueHandle_t xQueue,
void *pvBuffer,
);
QueueHandle_t xQueue,
void *pvBuffer,
);
参数 pvItemToQueue: // 数据地址 xTicksToWait //没有数据的话阻塞一会 portMAX_DELAY,则会一直阻塞直到有空间可写 返回值 pdTRUE --> 成功 pdFALSE --> 失败
邮箱
0 条评论
下一页