做网站seo怎么赚钱下列关于seo优化说法不正确的是
队列Queue
队列Queue可以用在“任务到任务”、“任务到中断”、“中断到任务”直接传输信息。
队列的阻塞访问(可指定超时时间)
只要知道队列的句柄,任务、ISR都可以读、写该队列。任务读写队列时,如果读写成功了就马上进入就绪态,否则阻塞直到超时。
可以从多个任务读写队列。当多个任务读取空队列时,这些任务都会进入阻塞状态。当队列中有数据时,优先级最高的任务会先进入就绪态,同优先级时等待时间最久的任务会先进入就绪态。写队列也类似。
创建队列
动态创建队列
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
// uxQueueLength:队列长度,最多能存放多少个数据(item)
// uxItemSize:每个数据(item)的大小,单位为字节
// 返回值:
// 非0:成功,返回句柄
// NULL:失败,内存不足
静态创建队列
QueueHandle_t xQueueCreateStatic( UBaseType_t uxQueueLength, UBaseType_t uxItemSize, uint8_t *pucQueueStorageBuffer, StaticQueue_t *pxQueueBuffer );
// uxQueueLength:队列长度,最多能存放多少个数据(item)
// uxItemSize:每个数据(item)的大小,单位为字节
// pucQueueStorageBuffer:如果uxQueueLength非0,该参数必须指向一个uint8_t数组,数组大小至少为uxQueueLength * uxItemSize
// pxQueueBuffer:必须执行一个StaticQueue_t结构体,用来保存队列的数据结构
// 返回值:
// 非0:成功,返回句柄
// NULL:失败,因为pxQueueBuffer为NULL
// 示例代码
#define QUEUE_LENGTH 10
#define ITEM_SIZE sizeof( uint32_t )// xQueueBuffer用来保存队列结构体
StaticQueue_t xQueueBuffer;// ucQueueStorage 用来保存队列的数据
// 大小为:队列长度 * 数据大小
uint8_t ucQueueStorage[ QUEUE_LENGTH * ITEM_SIZE ];void vATask( void *pvParameters )
{QueueHandle_t xQueue1;// 创建队列: 可以容纳QUEUE_LENGTH个数据,每个数据大小是ITEM_SIZExQueue1 = xQueueCreateStatic( QUEUE_LENGTH,ITEM_SIZE,ucQueueStorage,&xQueueBuffer );
}
队列复位
队列刚被创建时,里面是没有数据的。使用过程中可以调用xQueueReset()把队列恢复为初始状态。
// pxQueue : 复位哪个队列;
// 返回值: pdPASS(必定成功)
BaseType_t xQueueReset( QueueHandle_t pxQueue);
删除队列
只能删除使用动态方法创建的队列。
void vQueueDelete( QueueHandle_t xQueue );
写队列
可以把数据写到队列头部/尾部。函数都有两个版本:在任务中使用、在ISR中使用。
/* 等同于xQueueSendToBack。往队列尾部写入数据,如果没有空间,阻塞时间为xTicksToWait */
BaseType_t xQueueSend(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait
);/* 往队列尾部写入数据,如果没有空间,阻塞时间为xTicksToWait */
BaseType_t xQueueSendToBack(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait
);/* 往队列尾部写入数据,此函数可以在中断函数中使用,不可阻塞 */
BaseType_t xQueueSendToBackFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken
);/* 往队列头部写入数据,如果没有空间,阻塞时间为xTicksToWait */
BaseType_t xQueueSendToFront(QueueHandle_t xQueue,const void *pvItemToQueue,TickType_t xTicksToWait
);/* 往队列头部写入数据,此函数可以在中断函数中使用,不可阻塞 */
BaseType_t xQueueSendToFrontFromISR(QueueHandle_t xQueue,const void *pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken
);
参数 | 说明 |
xQueue | 队列句柄 |
pvItemToQueue | 数据指针 |
xTicksToWait | 如果队列满则无法写入新数据,可以让任务进入阻塞状态,xTicksToWait表示阻塞的最大时间(Tick Count)。 如果设为0,无法写入数据时函数会立即返回; 如果设为portMAX_DELAY,则会一直阻塞直到有空间可写 |
返回值 | pdPASS:数据成功写入了队列。 errQUEUE_NULL:写入失败,因为队列满了。 |
读队列
函数都有两个版本:在任务中使用、在ISR中使用。
BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait
);BaseType_t xQueueReceiveFromISR(QueueHandle_t xQueue,void *pvBuffer,BaseType_t *pxTaskWoken
);
参数 | 说明 |
xQueue | 队列句柄 |
pvBuffer | 数据指针 |
xTicksToWait | 如果队列空则无法读取新数据,可以让任务进入阻塞状态,xTicksToWait表示阻塞的最大时间(Tick Count)。 如果设为0,无法读取数据时函数会立即返回; 如果设为portMAX_DELAY,则会一直阻塞直到可读 |
返回值 | pdPASS:从队列读出数据了。 errQUEUE_NULL:读取失败,因为队列空。 |
队列查询
可以查询队列中有多少个数据、有多少空余空间。
/* 返回队列中可用数据的个数 */
UBaseType_t uxQueueMessagesWaiting( const QueueHandle_t xQueue );/* 返回队列中可用空间的个数 */
UBaseType_t uxQueueSpacesAvailable( const QueueHandle_t xQueue );
队列覆盖
当队列长度为1时,可以使用xQueueOverwrite()或xQueueOverwriteFromISR()来覆盖数据。
注意:队列长度必须为1。当队列满时,这些函数会覆盖里面的数据。不会阻塞。
/* 覆盖队列* xQueue: 写哪个队列* pvItemToQueue: 数据地址* 返回值: pdTRUE表示成功, pdFALSE表示失败
*/
BaseType_t xQueueOverwrite(QueueHandle_t xQueue,const void * pvItemToQueue
);BaseType_t xQueueOverwriteFromISR(QueueHandle_t xQueue,const void * pvItemToQueue,BaseType_t *pxHigherPriorityTaskWoken
);
队列偷看
如果想让队列的数据供多方读取,即只读不取。可进行偷看。可使用xQueuePeek()或xQueuePeekFromISR(),这些函数会从队列中复制出数据,但是不移除数据。
如果队列中没有数据,那么使用这些函数时也会导致阻塞;一旦队列中有数据,使用这些函数都会成功。
/* 偷看队列* xQueue: 偷看队列* pvItemToQueue: 数据地址* xTicksToWait: 阻塞时间* 返回值: pdTRUE表示成功, pdFALSE表示失败
*/
BaseType_t xQueuePeek(QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait
);BaseType_t xQueuePeekFromISR(QueueHandle_t xQueue,void *pvBuffer,
);