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