15.读取但不移除队列项(带中断保护)15.1函数描述 BaseType_t xQueuePeekFromISR(QueueHandle_t xQueue, void *pvBuffer,); 功能与xQueuePeek()相同,用于中断服务程序。 15.2参数描述
- pxQueue:队列句柄。
- pvBuffer:指向一个缓冲区,用于拷贝接收到的列表项。
15.3返回值 成功接收到列表项返回pdTRUE,否则返回pdFALSE。 16.队列注册16.1函数描述 void vQueueAddToRegistry(QueueHandle_t xQueue, char *pcQueueName,); 为队列分配名字并进行注册。 16.2参数描述
- l xQueue:队列句柄
- l pcQueueName:分配给队列的名字。这仅是一个有助于调试的字符串。队列注册仅存储指向队列名字符串的指针,因此这个字符串必须是静态的(全局变量活着存储在ROM/Flash中),不可以定义到堆栈中。
队列注册有两个目的,这两个目的都是为了调试RTOS内核:
- 它允许队列具有一个相关的文本名字,在GUI调试中可以容易的标识队列;
- 包含调试器用于定位每一个已经注册的队列和信号量时所需的信息。
队列注册仅用于调试器。 宏configQUEUE_REGISTRY_SIZE定义了可以注册的队列和信号量的最大数量。仅当你想使用可视化调试内核时,才进行队列和信号量注册。 16.3用法举例void vAFunction( void )
{
xQueueHandle xQueue;
/*创建一个队列,可以容纳10个char类型数值 */
xQueue = xQueueCreate( 10, sizeof( portCHAR ) );
/* 我们想可视化调试,所以注册它*/
vQueueAddToRegistry( xQueue, "AMeaningfulName" );
}
17.解除注册17.1函数描述 void vQueueUnregisterQueue(QueueHandle_t xQueue); 从队列注册表中移除指定的队列。 17.2参数描述
18.查询队列是否为空(仅用于中断服务程序)18.1函数描述 BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue ); 查询队列是否为空。这个函数仅用于ISR。 18.2参数描述
18.3返回值 队列非空返回pdFALSE,其它值表示队列为空。 19.查询队列是否满(仅用于中断服务程序)19.1函数描述 BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue ); 查询队列是否满,仅用于ISR。 19.2参数描述
19.3返回值 队列没有满返回pdFALSE,其它值表示队列满。 20.向队列尾部覆盖式投递队列项20.1函数描述 BaseType_t xQueueOverwrite(QueueHandle_t xQueue, const void * pvItemToQueue); 其实是个宏,真正被调用的函数是xQueueGenericSend()。这个宏是xQueueSendToBack()的另一个版本,向队列尾投递一个队列项,如果队列已满,则覆盖之前的队列项。一般用于只有一个队列项的队列中,如果队列的队列项超过1个,使用这个宏会触发一个断言(已经正确定义configASSERT()的情况下)。这个宏绝不可以在中断服务程序中调用,可以使用使用带有中断保护的版本xQueueOverwriteFromISR()来完成相同功能。 20.2参数描述
- xQueue:队列句柄。
- pvItemToQueue:指针,指向要入队的项目。要保存到队列中的项目字节数在队列创建时就已确定。因此要从指针pvItemToQueue指向的区域拷贝到队列存储区域的字节数,也已确定。
20.3返回值 总是返回pdPASS。 20.4用法举例
void vFunction( voidvoid *pvParameters )
{
QueueHandle_t xQueue;
unsigned long ulVarToSend, ulValReceived;
/*创建队列,保存一个unsignedlong值。如果一个队列的队列项超过1个,强烈建议不要使用xQueueOverwrite(),如果使用xQueueOverwrite()会触发一个断言(已经正确定义configASSERT()的情况下)。*/
xQueue = xQueueCreate( 1, sizeof( unsigned long ) );
/*使用 xQueueOverwrite().向队列写入10*/
ulVarToSend = 10;
xQueueOverwrite( xQueue, &ulVarToSend );
/*从队列读取值,但是不把这个值从队列中删除。*/
ulValReceived = 0;
xQueuePeek( xQueue, &ulValReceived, 0 );
if( ulValReceived != 10 )
{
/* 处理错误*/
}
/*到这里队列仍是满的。使用xQueueOverwrite()覆写队列,写入值100 */
ulVarToSend = 100;
xQueueOverwrite( xQueue, &ulVarToSend );
/* 从队列中读取值*/
xQueueReceive( xQueue, &ulValReceived, 0 );
if( ulValReceived != 100 )
{
/*处理错误 */
}
/* ... */
}
21向队列尾部覆盖式投递队列项(带中断保护)21.1函数描述
BaseType_t xQueueOverwriteFromISR (QueueHandle_t xQueue, const voidvoid * pvItemToQueue,
BaseType_t *pxHigherPriorityTaskWoken);
其实是个宏,真正被调用的函数是xQueueGenericSendFromISR()。这个宏的功能与xQueueOverwrite()相同,用在中断服务程序中。
21.2参数描述
- xQueue:队列句柄。
- pvItemToQueue:指针,指向要入队的项目。要保存到队列中的项目字节数在队列创建时就已确定。因此要从指针pvItemToQueue指向的区域拷贝到队列存储区域的字节数,也已确定。
- pxHigherPriorityTaskWoken:如果入队导致一个任务解锁,并且解锁的任务优先级高于当前运行的任务,则该函数将*pxHigherPriorityTaskWoken设置成pdTRUE。如果xQueueSendFromISR()设置这个值为pdTRUE,则中断退出前需要一次上下文切换。从FreeRTOS V7.3.0起,pxHigherPriorityTaskWoken称为一个可选参数,并可以设置为NULL。
21.3返回值 总是返回pdPASS。
|