第二章 队列
1. 如何创建一个队列
xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize );
uxQueueLength | 队列深度。 |
uxItemSize | 数据单元的长度,以字节为单位。 |
返回值 | NULL :创建失败。 非 NULL :创建成功,作为操作此队列的句柄。 |
2.队列如何管理其数据
1.FIFO
先写入的数据先被读出来
2.一般从队尾写入数据从队首读出数据
3.查询队列
unsigned portBASE_TYPE uxQueueMessagesWaiting( xQueueHandle xQueue );
xQueue | 被查询队列的句柄。 |
返回值 | 数据个数。0:数据个数为空 |
3.如何向队列发送数据
1.发送数据到队尾
portBASE_TYPE xQueueSendToBack( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait );
2.发送数据到队首
portBASE_TYPE xQueueSendToFront( xQueueHandle xQueue, const void * pvItemToQueue, portTickType xTicksToWait );
xQueue | 目标队列的句柄 |
pvItemToQueue | 发送数据的指针 |
xTicksToWait | 阻塞超时时间 |
返回值 | pdPASS :数据发送成功。errQUEUE_FULL :队列满/阻塞超时 |
3.中断中发送数据到队尾
xQueueSendToBackFromISR()
4.中断中发送数据到队首
xQueueSendToFrontFromISR()
4.如何从队列接收数据
1.接收数据同时删除数据
portBASE_TYPE xQueueReceive( xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait );
2.接收数据不删除数据
portBASE_TYPE xQueuePeek( xQueueHandle xQueue, const void * pvBuffer, portTickType xTicksToWait );
xQueue | 被读队列的句柄。 |
pvBuffer | 接收缓存指针 |
xTicksToWait | 阻塞超时时间。 |
返回值 | pdPASS:成功读取到数据。errQUEUE_FULL :队列无数据/阻塞超时 |
3.中断中接收数据同时删除数据
xQueueRceiveFromISR()
4.中断中接收数据不删除数据
xQueuePeekFromISR()
5. 队列阻塞是什么意思
队列阻塞分为读队列堵塞和写队列堵塞
1.读队列堵塞:一个任务读取队列时,队列为空,则任务进入阻塞态,当队列被写入数据后,该任务可从阻塞态进入就绪态。当等待队列数据时间超过设置等待时间,任务也会自动进入就绪态
2.写队列堵塞:一个任务写入队列时,队列全满,则任务进入阻塞态,当队列被读取数据后,该任务可从阻塞态进入就绪态。当等待队列数据时间超过设置等待时间,任务也会自动进入就绪态
6. 往队列发送和从队列接收时,任务优先级会有什么样的影响
1.写队列Task优先级大于读队列task优先级,队列被写满,写任务进入阻塞态,读队列任务,读取数据后,写队列任务进入就绪态继续写入数据到队列
2.读队列Task优先级大于写队列task优先级,队列被读空,读任务进入阻塞态,写队列任务,写入数据后,读队列任务进入就绪态继续从队列读出数据