查询FreeRTOS中xQueueSendToBackFromISR()在Azure RTOS ThreadX的等效函数
FreeRTOS xQueueSendToBackFromISR() 对应 Azure RTOS ThreadX 的等效实现
Azure RTOS ThreadX 没有专门后缀为"FromISR"的队列发送函数,其队列API设计默认支持中断上下文调用,对应 xQueueSendToBackFromISR() 的操作可通过以下方式实现:
核心等效方法
使用 tx_queue_send() 函数,并将等待时间参数设置为 TX_NO_WAIT:
- ThreadX 的
tx_queue_send()默认将数据添加到队列尾部,和 FreeRTOSxQueueSendToBack()/xQueueSendToBackFromISR()的行为完全一致 TX_NO_WAIT确保在ISR中不会发生阻塞(ISR上下文不允许挂起等待)
示例代码(ISR中使用)
#include "tx_api.h" // 假设已提前创建好队列:tx_queue_create(&my_queue, "My Queue", sizeof(MY_DATA_TYPE), queue_buffer, QUEUE_SIZE * sizeof(MY_DATA_TYPE)); TX_QUEUE my_queue; typedef struct { UINT value; } MY_DATA_TYPE; void my_isr_handler(void) { UINT status; MY_DATA_TYPE tx_data; // 填充要发送的数据 tx_data.value = 0x1234; // 向队列尾部发送数据(ISR安全) status = tx_queue_send(&my_queue, &tx_data, TX_NO_WAIT); // 处理发送结果 switch(status) { case TX_SUCCESS: // 发送成功 break; case TX_QUEUE_FULL: // 队列已满,处理溢出逻辑 break; default: // 其他错误情况 break; } }
关键注意事项
- 所有ThreadX队列操作API在ISR中使用时,必须指定
TX_NO_WAIT作为等待时间,禁止使用任何非零的等待值(会导致未定义行为) - 发送失败的状态码与FreeRTOS对应:
TX_QUEUE_FULL对应 FreeRTOS 的errQUEUE_FULL - ThreadX 的队列API本身已经做了中断安全设计,无需额外的临界区保护(底层已通过硬件中断屏蔽或原子操作实现)
内容的提问来源于stack exchange,提问作者user21288868
相关产品推荐
相关产品推荐

