You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

查询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() 默认将数据添加到队列尾部,和 FreeRTOS xQueueSendToBack()/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:42:48