FreeRTOS队列消息查询
uxQueueMessagesWaiting
uxQueueMessagesWaiting
是 FreeRTOS 中任务级的队列 API,用于获取当前队列中等待被读取的消息数量(即队列中的有效消息总数)。它是队列状态查询的核心函数,常用于调试、流量控制或避免不必要的阻塞等待。
一、函数原型
UBaseType_t uxQueueMessagesWaiting( QueueHandle_t xQueue );
- 参数:
xQueue
为目标队列的句柄(通过xQueueCreate
创建的队列)。 - 返回值:无符号整数(
UBaseType_t
),表示队列中当前等待处理的消息数量(0 表示队列为空)。
二、核心功能:查询队列中的消息数量
队列是 FreeRTOS 中任务间异步通信的常用机制,消息通过 xQueueSend
等 API 写入队列,通过 xQueueReceive
等 API 读取。uxQueueMessagesWaiting
的作用是实时查询队列中尚未被读取的消息总数,反映队列的 “负载状态”。
例如:
- 若队列最多可存储 10 条消息(创建时
uxQueueLength=10
),当前有 3 条未被读取,则uxQueueMessagesWaiting
返回 3; - 若所有消息都被读取,返回 0。
三、使用场景
1. 避免不必要的阻塞等待
当任务希望 “有消息时才读取,无消息时做其他事” 时,可先通过 uxQueueMessagesWaiting
检查队列状态,再决定是否调用 xQueueReceive
(避免阻塞)。
QueueHandle_t data_queue; // 数据队列句柄void process_task(void *param) {uint8_t data;while(1) {// 检查队列中是否有消息if (uxQueueMessagesWaiting(data_queue) > 0) {// 有消息,立即读取(不阻塞)xQueueReceive(data_queue, &data, 0); // 超时0,不阻塞USART1_SendString((uint8_t*)"处理消息\r\n");} else {// 无消息,执行其他轻量操作USART1_SendString((uint8_t*)"无消息,执行其他任务\r\n");vTaskDelay(pdMS_TO_TICKS(100)); // 短暂延时,释放CPU}}
}
2. 调试与监控队列负载
通过查询消息数量,可监控队列是否出现消息堆积(如生产者速度远快于消费者),用于调试或优化系统性能。
void monitor_task(void *param) {while(1) {// 打印队列当前消息数量UBaseType_t msg_count = uxQueueMessagesWaiting(data_queue);char buf[30];sprintf(buf, "队列消息数:%u\r\n", msg_count);USART1_SendString((uint8_t*)buf);// 若消息数超过阈值,报警(可能是消费者处理太慢)if (msg_count > 5) {USART1_SendString((uint8_t*)"警告:队列消息堆积!\r\n");}vTaskDelay(pdMS_TO_TICKS(500)); // 每500ms监控一次}
}
3. 批量处理消息
当队列中积累了多条消息时,可一次性批量读取并处理,减少任务切换开销。
void batch_process_task(void *param) {uint8_t data[10]; // 缓冲区UBaseType_t count;while(1) {// 获取当前消息数量count = uxQueueMessagesWaiting(data_queue);if (count > 0) {// 批量读取(最多读取10条)count = (count > 10) ? 10 : count; // 限制最大读取量for (UBaseType_t i = 0; i < count; i++) {xQueueReceive(data_queue, &data[i], 0); // 不阻塞}USART1_SendString((uint8_t*)"批量处理消息完成\r\n");}vTaskDelay(pdMS_TO_TICKS(200));}
}
四、关键注意事项
任务级 API,不可在 ISR 中使用:
uxQueueMessagesWaiting
是任务级函数,若需在中断服务程序(ISR)中查询消息数量,需使用中断专用版本uxQueueMessagesWaitingFromISR
。返回值的 “瞬时性”:由于队列可能被多个任务同时操作(如一个任务写入,一个任务读取),
uxQueueMessagesWaiting
返回的数量是 “调用瞬间” 的状态,可能在函数返回后立即变化(如刚查询到有 3 条消息,下一刻被其他任务读取 1 条,实际只剩 2 条)。因此,它不能作为同步依据,仅能作为参考。队列未创建或无效句柄:若
xQueue
是无效句柄(如未初始化、已删除),函数行为未定义(可能返回 0 或垃圾值),需确保句柄有效。与队列长度的关系:返回值不会超过队列的最大长度(创建时
uxQueueLength
指定的值),因为队列满时无法写入新消息。
五、与中断级版本的区别
中断中查询消息数量需使用 uxQueueMessagesWaitingFromISR
,函数原型如下:
UBaseType_t uxQueueMessagesWaitingFromISR( QueueHandle_t xQueue );
- 功能与
uxQueueMessagesWaiting
完全一致,但可在 ISR 中安全调用; - 调用时需确保中断优先级 ≤
configMAX_SYSCALL_INTERRUPT_PRIORITY
。
总结
uxQueueMessagesWaiting
是查询队列当前消息数量的核心任务级 API,主要用于:
- 避免不必要的阻塞等待;
- 监控队列负载(调试或报警);
- 实现批量消息处理。
需注意其返回值的瞬时性,且不可在 ISR 中使用(需用中断专用版本)。合理使用可提升队列操作的灵活性和系统可调试性。
uxQueueMessagesWaitingFromISR
uxQueueMessagesWaitingFromISR
是 FreeRTOS 中中断服务程序(ISR)专用的队列 API,用于在中断环境下查询队列中等待被读取的消息数量(即当前队列中的有效消息总数)。它是任务级 API uxQueueMessagesWaiting
的中断适配版本,核心特点是支持中断安全调用,确保在中断中能安全获取队列状态。
一、函数原型
UBaseType_t uxQueueMessagesWaitingFromISR( QueueHandle_t xQueue );
- 参数:
xQueue
为目标队列的句柄(通过xQueueCreate
创建的有效队列句柄)。 - 返回值:无符号整数(
UBaseType_t
),表示中断调用瞬间队列中等待处理的消息数量(0 表示队列为空)。
二、核心功能:中断中查询队列消息数量
与任务级的 uxQueueMessagesWaiting
功能一致,uxQueueMessagesWaitingFromISR
用于获取队列中当前未被读取的消息总数,但专为中断环境设计:
- 不涉及阻塞操作,执行时间极短(仅读取队列内部的消息计数);
- 内部通过临界区保护队列状态,确保在中断中读取时的线程安全(避免与任务级队列操作冲突)。
三、使用场景:为何在 ISR 中需要查询消息数量?
中断服务程序(ISR)的核心诉求是 “快速响应、减少阻塞”,查询队列消息数量的典型场景包括:
1. 中断中判断是否需要唤醒处理任务
当中断产生消息并写入队列后,可通过查询消息数量判断是否需要唤醒等待队列的任务(避免不必要的任务切换)。
QueueHandle_t uart_queue; // 串口数据队列句柄// 串口接收中断服务程序
void USART1_IRQHandler(void) {uint8_t rx_data = USART_ReceiveData(USART1); // 读取接收数据BaseType_t xHigherPriorityTaskWoken = pdFALSE;// 将数据写入队列(非阻塞,队列满则丢弃)xQueueSendFromISR(uart_queue, &rx_data, &xHigherPriorityTaskWoken);// 查询队列当前消息数:若消息数从0变为1,说明是第一条消息,唤醒处理任务if (uxQueueMessagesWaitingFromISR(uart_queue) == 1) {// 唤醒阻塞在队列上的处理任务(示例:任务句柄为uart_task_handle)vTaskNotifyGiveFromISR(uart_task_handle, &xHigherPriorityTaskWoken);}// 触发任务切换(若需要)portYIELD_FROM_ISR(xHigherPriorityTaskWoken);USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除中断标志
}
2. 中断中做简单流量控制(避免队列溢出)
若中断频繁产生消息(如高频传感器数据),可通过查询消息数量判断队列是否接近满状态,避免继续写入导致消息丢失。
#define QUEUE_MAX_LEN 10 // 队列最大长度为10
QueueHandle_t sensor_queue;// 传感器数据采集中断
void TIM2_IRQHandler(void) {uint16_t sensor_data = read_sensor(); // 读取传感器数据BaseType_t xHigherPriorityTaskWoken = pdFALSE;// 查询当前消息数:若小于最大长度的80%,才写入队列if (uxQueueMessagesWaitingFromISR(sensor_queue) < (QUEUE_MAX_LEN * 0.8)) {xQueueSendFromISR(sensor_queue, &sensor_data, &xHigherPriorityTaskWoken);} else {// 队列接近满,记录警告(如溢出计数+1)sensor_overflow_count++;}portYIELD_FROM_ISR(xHigherPriorityTaskWoken);TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
3. 中断中区分 “首条消息” 与 “后续消息”
对于批量到达的中断(如连续按键触发),可通过消息数量判断是否为 “首条消息”,仅在首条消息时唤醒任务(后续消息让任务处理时批量读取),减少任务切换次数。
四、关键注意事项
中断优先级限制:调用该函数的 ISR 优先级必须 ≤
configMAX_SYSCALL_INTERRUPT_PRIORITY
(在FreeRTOSConfig.h
中定义)。若优先级过高,会绕过 FreeRTOS 的临界区保护,导致队列状态查询错误或系统异常。返回值的 “瞬时性”:与任务级版本一样,返回的消息数量是 “中断调用瞬间” 的状态。由于队列可能被其他任务或中断同时操作(如任务正在读取消息),返回值可能在函数返回后立即变化(例如刚查询到有 3 条消息,下一刻被任务读取 1 条,实际只剩 2 条)。因此,它不能作为精确同步的依据,仅能作为参考。
仅用于查询,不影响队列状态:该函数仅读取消息数量,不会修改队列(如不会删除或添加消息),也不会影响任务对队列的阻塞等待状态。
与任务级版本的区别:
特性 uxQueueMessagesWaiting
(任务级)uxQueueMessagesWaitingFromISR
(中断级)调用环境 任务函数中 中断服务程序(ISR)中 优先级限制 无(任务优先级任意) 必须 ≤ configMAX_SYSCALL_INTERRUPT_PRIORITY
内部实现 可能涉及任务级临界区 仅使用中断安全的临界区(快速执行)
总结
uxQueueMessagesWaitingFromISR
是中断环境下查询队列消息数量的专用 API,核心价值在于安全、快速地获取队列负载状态,支持中断中的简单流量控制和任务唤醒决策。
使用时需注意中断优先级限制和返回值的瞬时性,其设计目标是在不影响中断响应速度的前提下,为中断处理提供队列状态参考,是 FreeRTOS 中断与任务通信中状态监控的重要工具。
uxQueueSpacesAvailable
uxQueueSpacesAvailable
是 FreeRTOS 中任务级的队列 API,用于查询当前队列中可用的空闲空间数量(即还能写入多少条消息)。它与 uxQueueMessagesWaiting
互补(后者查询已有的消息数),核心作用是判断队列是否有剩余空间供写入消息,常用于避免阻塞写入或实现流量控制。
一、函数原型
UBaseType_t uxQueueSpacesAvailable( QueueHandle_t xQueue );
- 参数:
xQueue
为目标队列的句柄(通过xQueueCreate
创建的有效队列)。 - 返回值:无符号整数(
UBaseType_t
),表示队列当前可容纳的新消息数量(0 表示队列已满)。
二、核心功能:查询队列的空闲空间
队列的 “可用空间” 由队列的最大长度(创建时通过 uxQueueLength
参数指定)和当前消息数共同决定:
可用空间 = 队列最大长度 - 当前消息数(即 uxQueueMessagesWaiting(xQueue))
例如:
- 队列最大长度为 10(最多存 10 条消息),当前有 3 条消息,则
uxQueueSpacesAvailable
返回 7(还能写入 7 条); - 若队列已满(10 条消息),则返回 0(无法再写入)。
三、使用场景
1. 避免阻塞写入(非阻塞发送前检查)
当任务希望 “有空间时才写入消息,无空间时做其他处理”(如丢弃消息、缓存到临时缓冲区),可先通过 uxQueueSpacesAvailable
检查空闲空间,再决定是否调用 xQueueSend
(避免阻塞)。
QueueHandle_t data_queue; // 数据队列句柄(最大长度10)void producer_task(void *param) {uint8_t data = 0;while(1) {data++; // 生成数据// 检查队列是否有可用空间if (uxQueueSpacesAvailable(data_queue) > 0) {// 有空间,非阻塞写入(超时0)xQueueSend(data_queue, &data, 0);USART1_SendString((uint8_t*)"消息写入成功\r\n");} else {// 无空间,执行备选操作(如丢弃或记录溢出)USART1_SendString((uint8_t*)"队列已满,消息丢弃\r\n");}vTaskDelay(pdMS_TO_TICKS(100));}
}
2. 批量写入消息(一次发送多条)
当需要发送批量数据时,可通过查询可用空间确定最大可写入数量,避免部分消息因队列满而失败。
void batch_producer_task(void *param) {uint8_t batch_data[5]; // 批量数据(最多5条)UBaseType_t available, send_count;while(1) {// 生成5条数据for (int i = 0; i < 5; i++) {batch_data[i] = i + 1;}// 查询可用空间available = uxQueueSpacesAvailable(data_queue);// 最多发送“可用空间”或“批量大小”中的较小值send_count = (available < 5) ? available : 5;// 批量写入for (UBaseType_t i = 0; i < send_count; i++) {xQueueSend(data_queue, &batch_data[i], 0); // 非阻塞}// 打印发送结果char buf[50];sprintf(buf, "批量发送:成功%d条,剩余空间%d条\r\n", send_count, available - send_count);USART1_SendString((uint8_t*)buf);vTaskDelay(pdMS_TO_TICKS(500));}
}
3. 监控队列空闲状态(调试与优化)
通过查询可用空间,可监控队列是否长期处于 “接近满” 的状态(如生产者速度远快于消费者),用于优化任务调度或调整队列长度。
void queue_monitor_task(void *param) {while(1) {UBaseType_t available = uxQueueSpacesAvailable(data_queue);UBaseType_t total_len = uxQueueGetQueueLength(data_queue); // 获取队列最大长度// 打印空闲率char buf[50];sprintf(buf, "队列空闲率:%d%%(可用%d/%d)\r\n", (int)(available * 100 / total_len), available, total_len);USART1_SendString((uint8_t*)buf);// 若空闲空间不足10%,报警(可能需要扩容队列)if (available * 10 < total_len) {USART1_SendString((uint8_t*)"警告:队列即将满!\r\n");}vTaskDelay(pdMS_TO_TICKS(1000));}
}
四、关键注意事项
任务级 API,不可在 ISR 中使用:
uxQueueSpacesAvailable
仅能在任务函数中调用。返回值的 “瞬时性”:由于队列可能被多个任务同时读写(如一个任务写入、一个任务读取),
uxQueueSpacesAvailable
返回的可用空间是 “调用瞬间” 的状态,可能在函数返回后立即变化(例如刚查询到有 3 个空间,下一刻被其他任务写入 2 条,实际只剩 1 个空间)。因此,它不能作为精确同步的依据,仅能作为参考。与队列长度的关系:返回值不会超过队列的最大长度(创建时
uxQueueLength
指定的值),且最小为 0(队列满时)。与
uxQueueMessagesWaiting
的关系:两者之和恒等于队列的最大长度(uxQueueSpacesAvailable + uxQueueMessagesWaiting = 队列最大长度
)。
总结
uxQueueSpacesAvailable
是任务级查询队列空闲空间的核心 API,主要用于:
- 非阻塞写入前检查空间,避免任务阻塞;
- 批量发送消息时确定最大可发送数量;
- 监控队列负载,优化系统性能。
需注意其返回值的瞬时性,且不可在 ISR 中使用。合理使用可提升队列写入的灵活性和系统稳定性。
xQueueIsQueueEmptyFromISR
xQueueIsQueueEmptyFromISR
是 FreeRTOS 中中断服务程序(ISR)专用的队列 API,用于在中断环境下快速判断队列是否为空(即是否没有等待被读取的消息)。它是任务级 API xQueueIsQueueEmpty
的中断适配版本,核心特点是支持中断安全调用,能在 ISR 中高效判断队列的空状态。
一、函数原型
BaseType_t xQueueIsQueueEmptyFromISR( const QueueHandle_t xQueue );
- 参数:
xQueue
为目标队列的句柄(通过xQueueCreate
或xQueueCreateStatic
创建的有效队列句柄)。 - 返回值:
pdTRUE
:队列当前为空(无等待读取的消息);pdFALSE
:队列当前非空(有至少一条消息)。
二、核心功能:中断中快速判断队列是否为空
与任务级的 xQueueIsQueueEmpty
功能一致,xQueueIsQueueEmptyFromISR
用于判断队列是否为空,但专为中断环境设计:
- 执行效率极高(仅检查队列的消息计数是否为 0,无需复杂计算);
- 内部通过中断安全的临界区保护队列状态,确保在中断中判断的准确性(避免与任务级队列操作冲突)。
三、使用场景:为何在 ISR 中需要判断队列是否为空?
中断服务程序(ISR)的核心诉求是 “快速响应、减少不必要的任务切换”,判断队列空状态的典型场景包括:
1. 仅在队列从空变为非空时唤醒处理任务
当中断向队列发送消息时,若队列原本为空(发送后变为非空),说明这是 “第一条消息”,需要唤醒阻塞在队列上的处理任务;若队列原本非空(已有消息),处理任务可能已被唤醒或即将处理,无需重复唤醒,减少任务切换开销。
QueueHandle_t uart_queue; // 串口数据队列句柄
TaskHandle_t uart_task_handle; // 串口处理任务句柄// 串口接收中断服务程序
void USART1_IRQHandler(void) {uint8_t rx_data = USART_ReceiveData(USART1); // 读取接收数据BaseType_t xHigherPriorityTaskWoken = pdFALSE;// 向队列发送消息(非阻塞)xQueueSendFromISR(uart_queue, &rx_data, &xHigherPriorityTaskWoken);// 判断队列发送前是否为空:若为空,说明是第一条消息,唤醒处理任务if (xQueueIsQueueEmptyFromISR(uart_queue) == pdFALSE) {// 发送后队列非空,且发送前为空(隐含判断:发送前为空,发送后非空)vTaskNotifyGiveFromISR(uart_task_handle, &xHigherPriorityTaskWoken);}// 触发任务切换(若需要)portYIELD_FROM_ISR(xHigherPriorityTaskWoken);USART_ClearITPendingBit(USART1, USART_IT_RXNE); // 清除中断标志
}
2. 避免在空队列上执行读取操作
虽然 ISR 中通常不读取队列(避免阻塞),但某些场景下若需在 ISR 中执行轻量读取(如紧急数据处理),可先判断队列是否为空,避免无效操作。
// 紧急数据处理中断
void EXTI1_IRQHandler(void) {uint8_t urgent_data;BaseType_t xHigherPriorityTaskWoken = pdFALSE;// 仅当队列非空时,读取一条紧急数据if (xQueueIsQueueEmptyFromISR(urgent_queue) == pdFALSE) {xQueueReceiveFromISR(urgent_queue, &urgent_data, &xHigherPriorityTaskWoken);// 处理紧急数据(ISR中轻量操作)process_urgent_data(urgent_data);}portYIELD_FROM_ISR(xHigherPriorityTaskWoken);EXTI_ClearITPendingBit(EXTI_Line1);
}
3. 中断中做简单状态判断(如调试日志)
在调试阶段,可通过判断队列是否为空,输出中断中的队列状态,辅助定位问题(如队列是否长期为空导致数据处理延迟)。
四、关键注意事项
中断优先级限制:调用该函数的 ISR 优先级必须 ≤
configMAX_SYSCALL_INTERRUPT_PRIORITY
(在FreeRTOSConfig.h
中定义)。若优先级过高,会绕过 FreeRTOS 的临界区保护,导致判断结果错误。返回值的 “瞬时性”:与其他队列状态查询函数一样,返回的 “空 / 非空” 状态是 “中断调用瞬间” 的结果。由于队列可能被其他任务或中断同时操作(如任务正在写入消息),状态可能在函数返回后立即变化(例如刚判断为空,下一刻被任务写入消息,实际已非空)。因此,它仅用于快速决策参考,不能作为精确同步依据。
与
uxQueueMessagesWaitingFromISR
的关系:uxQueueMessagesWaitingFromISR
返回队列中的消息数量(精确值);xQueueIsQueueEmptyFromISR
仅返回 “是否为空”(布尔值),执行效率更高(无需计算具体数量),适合仅需判断空状态的场景。
仅用于 ISR,不可在任务中使用:任务中判断队列是否为空需使用任务级。
总结
xQueueIsQueueEmptyFromISR
是中断环境下快速判断队列是否为空的专用 API,核心价值在于高效、安全地提供队列空状态参考,支持中断中基于空状态的轻量决策(如是否唤醒处理任务)。
使用时需注意中断优先级限制和返回值的瞬时性,其设计目标是在不影响中断响应速度的前提下,优化中断与任务的协作效率,减少不必要的任务切换。
xQueueIsQueueFullFromISR
xQueueIsQueueFullFromISR
是 FreeRTOS 中中断服务程序(ISR)专用的队列 API,用于在中断环境下快速判断队列是否已满(即是否没有可用空间容纳新消息)。它是任务级 API xQueueIsQueueFull
的中断适配版本,核心特点是支持中断安全调用,能在 ISR 中高效判断队列的满状态,避免无效的消息发送操作。
一、函数原型
BaseType_t xQueueIsQueueFullFromISR( const QueueHandle_t xQueue );
- 参数:
xQueue
为目标队列的句柄(通过xQueueCreate
或xQueueCreateStatic
创建的有效队列句柄)。 - 返回值:
pdTRUE
:队列当前已满(无可用空间,无法写入新消息);pdFALSE
:队列当前未满(有至少一个可用空间,可写入新消息)。
二、核心功能:中断中快速判断队列是否已满
与任务级的 xQueueIsQueueFull
功能一致,xQueueIsQueueFullFromISR
用于判断队列是否已满,但专为中断环境设计:
- 执行效率极高(仅检查队列的可用空间是否为 0,无需计算具体数量);
- 内部通过中断安全的临界区保护队列状态,确保在中断中判断的准确性(避免与任务级队列操作冲突)。
三、使用场景:为何在 ISR 中需要判断队列是否已满?
中断服务程序(ISR)的核心诉求是 “快速响应、减少无效操作”,判断队列满状态的典型场景包括:
1. 避免在满队列上执行写入操作(减少失败尝试)
当中断向队列发送消息时,若队列已满,非阻塞写入(xQueueSendFromISR
超时为 0)会失败。提前判断队列是否已满,可避免无效的写入尝试,直接执行备选逻辑(如丢弃消息、记录溢出计数),减少 ISR 执行时间。
QueueHandle_t sensor_queue; // 传感器数据队列句柄
uint32_t overflow_count = 0; // 溢出计数// 传感器采集中断服务程序(高频触发)
void TIM3_IRQHandler(void) {uint16_t sensor_data = read_sensor(); // 读取传感器数据BaseType_t xHigherPriorityTaskWoken = pdFALSE;// 判断队列是否已满:未满则发送,已满则记录溢出if (xQueueIsQueueFullFromISR(sensor_queue) == pdFALSE) {// 队列未满,发送数据(非阻塞)xQueueSendFromISR(sensor_queue, &sensor_data, &xHigherPriorityTaskWoken);} else {// 队列已满,记录溢出(轻量操作,避免ISR耗时)overflow_count++;}// 触发任务切换(若需要)portYIELD_FROM_ISR(xHigherPriorityTaskWoken);TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中断标志
}
2. 中断中动态调整消息发送策略
若队列接近满状态(可结合 uxQueueSpacesAvailableFromISR
判断),但尚未满,可优先发送关键数据;若已满,则仅丢弃非关键数据,确保核心消息不丢失。
// 多类型数据中断(包含关键和非关键数据)
void EXTI2_IRQHandler(void) {Data_t data = get_interrupt_data(); // 获取中断数据(含类型标记)BaseType_t xHigherPriorityTaskWoken = pdFALSE;// 判断队列是否已满if (xQueueIsQueueFullFromISR(data_queue) == pdTRUE) {// 队列已满:仅保留关键数据(如报警信息),丢弃非关键数据if (data.is_critical) {// 强制覆盖 oldest 消息(仅在允许时使用)xQueueOverwriteFromISR(data_queue, &data, &xHigherPriorityTaskWoken);}} else {// 队列未满,正常发送xQueueSendFromISR(data_queue, &data, &xHigherPriorityTaskWoken);}portYIELD_FROM_ISR(xHigherPriorityTaskWoken);EXTI_ClearITPendingBit(EXTI_Line2);
}
3. 调试与监控队列溢出状态
在调试阶段,通过判断队列是否已满,可实时监控队列的负载情况(如是否频繁满队列),辅助优化队列长度或任务处理效率。
四、关键注意事项
中断优先级限制:调用该函数的 ISR 优先级必须 ≤
configMAX_SYSCALL_INTERRUPT_PRIORITY
(在FreeRTOSConfig.h
中定义)。若优先级过高,会绕过 FreeRTOS 的临界区保护,导致判断结果错误。返回值的 “瞬时性”:与其他队列状态查询函数一样,返回的 “满 / 未满” 状态是 “中断调用瞬间” 的结果。由于队列可能被其他任务或中断同时操作(如任务正在读取消息释放空间),状态可能在函数返回后立即变化(例如刚判断为满,下一刻被任务读取一条消息,实际已未满)。因此,它仅用于快速决策参考,不能作为绝对的同步依据。
与
uxQueueSpacesAvailableFromISR
的关系:uxQueueSpacesAvailableFromISR
返回队列的可用空间数量(精确值);xQueueIsQueueFullFromISR
仅返回 “是否已满”(布尔值),执行效率更高(无需计算具体数量),适合仅需判断满状态的场景。
仅用于 ISR,不可在任务中使用:任务中判断队列是否已满需使用任务级 。
总结
xQueueIsQueueFullFromISR
是中断环境下快速判断队列是否已满的专用 API,核心价值在于高效、安全地提供队列满状态参考,支持中断中基于满状态的轻量决策(如是否发送消息、是否记录溢出)。
使用时需注意中断优先级限制和返回值的瞬时性,其设计目标是在不影响中断响应速度的前提下,优化中断消息发送的有效性,减少无效操作和数据丢失风险。