当前位置: 首页 > news >正文

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));}
}

四、关键注意事项

  1. 任务级 API,不可在 ISR 中使用uxQueueMessagesWaiting 是任务级函数,若需在中断服务程序(ISR)中查询消息数量,需使用中断专用版本 uxQueueMessagesWaitingFromISR

  2. 返回值的 “瞬时性”:由于队列可能被多个任务同时操作(如一个任务写入,一个任务读取),uxQueueMessagesWaiting 返回的数量是 “调用瞬间” 的状态,可能在函数返回后立即变化(如刚查询到有 3 条消息,下一刻被其他任务读取 1 条,实际只剩 2 条)。因此,它不能作为同步依据,仅能作为参考。

  3. 队列未创建或无效句柄:若 xQueue 是无效句柄(如未初始化、已删除),函数行为未定义(可能返回 0 或垃圾值),需确保句柄有效。

  4. 与队列长度的关系:返回值不会超过队列的最大长度(创建时 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. 中断中区分 “首条消息” 与 “后续消息”

对于批量到达的中断(如连续按键触发),可通过消息数量判断是否为 “首条消息”,仅在首条消息时唤醒任务(后续消息让任务处理时批量读取),减少任务切换次数。

四、关键注意事项

  1. 中断优先级限制:调用该函数的 ISR 优先级必须 ≤ configMAX_SYSCALL_INTERRUPT_PRIORITY(在 FreeRTOSConfig.h 中定义)。若优先级过高,会绕过 FreeRTOS 的临界区保护,导致队列状态查询错误或系统异常。

  2. 返回值的 “瞬时性”:与任务级版本一样,返回的消息数量是 “中断调用瞬间” 的状态。由于队列可能被其他任务或中断同时操作(如任务正在读取消息),返回值可能在函数返回后立即变化(例如刚查询到有 3 条消息,下一刻被任务读取 1 条,实际只剩 2 条)。因此,它不能作为精确同步的依据,仅能作为参考。

  3. 仅用于查询,不影响队列状态:该函数仅读取消息数量,不会修改队列(如不会删除或添加消息),也不会影响任务对队列的阻塞等待状态。

  4. 与任务级版本的区别

    特性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));}
}

四、关键注意事项

  1. 任务级 API,不可在 ISR 中使用uxQueueSpacesAvailable 仅能在任务函数中调用。

  2. 返回值的 “瞬时性”:由于队列可能被多个任务同时读写(如一个任务写入、一个任务读取),uxQueueSpacesAvailable 返回的可用空间是 “调用瞬间” 的状态,可能在函数返回后立即变化(例如刚查询到有 3 个空间,下一刻被其他任务写入 2 条,实际只剩 1 个空间)。因此,它不能作为精确同步的依据,仅能作为参考。

  3. 与队列长度的关系:返回值不会超过队列的最大长度(创建时 uxQueueLength 指定的值),且最小为 0(队列满时)。

  4. 与 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. 中断中做简单状态判断(如调试日志)

在调试阶段,可通过判断队列是否为空,输出中断中的队列状态,辅助定位问题(如队列是否长期为空导致数据处理延迟)。

四、关键注意事项

  1. 中断优先级限制:调用该函数的 ISR 优先级必须 ≤ configMAX_SYSCALL_INTERRUPT_PRIORITY(在 FreeRTOSConfig.h 中定义)。若优先级过高,会绕过 FreeRTOS 的临界区保护,导致判断结果错误。

  2. 返回值的 “瞬时性”:与其他队列状态查询函数一样,返回的 “空 / 非空” 状态是 “中断调用瞬间” 的结果。由于队列可能被其他任务或中断同时操作(如任务正在写入消息),状态可能在函数返回后立即变化(例如刚判断为空,下一刻被任务写入消息,实际已非空)。因此,它仅用于快速决策参考,不能作为精确同步依据。

  3. 与 uxQueueMessagesWaitingFromISR 的关系

    • uxQueueMessagesWaitingFromISR 返回队列中的消息数量(精确值);
    • xQueueIsQueueEmptyFromISR 仅返回 “是否为空”(布尔值),执行效率更高(无需计算具体数量),适合仅需判断空状态的场景。
  4. 仅用于 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. 调试与监控队列溢出状态

在调试阶段,通过判断队列是否已满,可实时监控队列的负载情况(如是否频繁满队列),辅助优化队列长度或任务处理效率。

四、关键注意事项

  1. 中断优先级限制:调用该函数的 ISR 优先级必须 ≤ configMAX_SYSCALL_INTERRUPT_PRIORITY(在 FreeRTOSConfig.h 中定义)。若优先级过高,会绕过 FreeRTOS 的临界区保护,导致判断结果错误。

  2. 返回值的 “瞬时性”:与其他队列状态查询函数一样,返回的 “满 / 未满” 状态是 “中断调用瞬间” 的结果。由于队列可能被其他任务或中断同时操作(如任务正在读取消息释放空间),状态可能在函数返回后立即变化(例如刚判断为满,下一刻被任务读取一条消息,实际已未满)。因此,它仅用于快速决策参考,不能作为绝对的同步依据。

  3. 与 uxQueueSpacesAvailableFromISR 的关系

    • uxQueueSpacesAvailableFromISR 返回队列的可用空间数量(精确值);
    • xQueueIsQueueFullFromISR 仅返回 “是否已满”(布尔值),执行效率更高(无需计算具体数量),适合仅需判断满状态的场景。
  4. 仅用于 ISR,不可在任务中使用:任务中判断队列是否已满需使用任务级 。

总结

xQueueIsQueueFullFromISR 是中断环境下快速判断队列是否已满的专用 API,核心价值在于高效、安全地提供队列满状态参考,支持中断中基于满状态的轻量决策(如是否发送消息、是否记录溢出)。

使用时需注意中断优先级限制和返回值的瞬时性,其设计目标是在不影响中断响应速度的前提下,优化中断消息发送的有效性,减少无效操作和数据丢失风险。

http://www.dtcms.com/a/516346.html

相关文章:

  • 医院数字IP广播系统:基于内部局域网的分布式数字化医院IP广播
  • 中山骏域网站建设专家西部网站邮箱登录
  • FFmpeg --14-视频解码:h264解码为yuv
  • PixelShuffle原理
  • 昆明做网站价格网站屏蔽省份
  • 创建网站需要学什么知识2017民非单位年检那个网站做
  • LABVIEW依赖关系显示文件删除、移动或重命名,每次打开都要指定很多路径【解决方案】
  • 东莞网站建设seo浙江住房和城乡建设厅网站首页
  • MLOps 的CI/CD VS DevOps 的CI/CD
  • spark组件-spark sql-读取数据
  • 网站开发大致需要哪些步骤可视化开发工具推荐
  • zabbix实现配置监控Windows设备、SNMP协议设备的全流程实操教程
  • 天津做网站找哪家公司好建设网站公司哪里好相关的热搜问题解决方案
  • 友情链接价格seo官网制作规划
  • 桦甸市城乡建设局网站技术外包网站
  • 英文网站设计网络广告策划方案怎么做
  • go前后端项目的启动 、打包和部署
  • redis三主三从集群升级6.2.20, 保留数据
  • 导入部署天机AI助手智能体的全流程(详细图解,包含导入虚拟机后无法ping通百度的解决办法)
  • 物联网运维中的容器化服务部署与弹性扩展技术
  • cms建站程序免费个人网站建站能上传视频吗
  • 「用Python来学微积分」8. 极限的概念
  • GJOI 10.17/10.18 题解
  • CAN总线的物联网桥梁:以太网网关如何赋能工业4.0
  • C语言需要掌握的基础知识点之递归
  • 建设网站学什么wordpress zip格式
  • RFSoC在射频阵列信号采集分析中的应用
  • [Agent可视化] 会话管理 | Redis缓存 | PostgreSQL持久化 | 智能上下文处理
  • [Agent可视化] 编排工作流(Go) | Temporal引擎 | DAG调度器 | ReAct模式实现
  • 自定义时间服务器主机的时间通过ntp.aliyun.com主机同步时间