This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CC1310:因未知原因阻止任务

Guru**** 2468460 points
Other Parts Discussed in Thread: SYSBIOS

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/wireless-connectivity/sub-1-ghz-group/sub-1-ghz/f/sub-1-ghz-forum/1467443/cc1310-tasks-blocking-for-unknown-reasons

器件型号:CC1310
Thread 中讨论的其他器件:SYSBIOS

工具与软件:

我的应用使用 SimpleLink 4.20.2.07和 TI-RTOS、其中有2项任务、一项任务是使用 I2C 从传感器读取数据、处理数据并根据传感器读数发送射频数据、另一项任务是处理其他系统事件。 当我启动应用程序时、代码运行时不会出现明显错误、并且按照设计执行、但是经过一些随机时间(范围在5分钟和1小时之间)、系统陷入空闲任务、我的任务始终被阻止。 我还将使用传感器控制器、以允许使用传感器的中断引脚读取传感器、但即使传感器控制器不允许读取处理一般事件的任务仍应运行。

我检查了以下内容:

  1. 无堆栈溢出;
  2. 无信号量/事件会阻塞任务;
  3. 定时器/时钟保持正常工作;
  4. 传感器控制器保持正常工作;

什么原因可能导致这种行为?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Francisco:

    如果器件在空闲状态下"卡住"、通常意味着在其他任务中没有剩余的事情可以处理。 您预期会发生什么? 例如、来自计时器的事件或信标。 这些是代码中放置断点的好位置、用于查看逻辑的哪个部分不起作用。

    您说不存在堆栈溢出、您可以对动态内存分配进行相同检查吗? 例如、如果你正在对 I2C 消息使用堆、如果堆分解一切、一切都将停止。

    BTW 发生这种情况时、您是否暂停了调试会话? 您能否发布呼叫堆栈的屏幕截图?

    谢谢、

    Marie H.

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Marie:

    处理系统事件的任务不应停止、因为它每个周期都会侦听射频数据包、并且有一个计时器每10秒触发一次事件、并且每10秒调用一次事件、但由于事件被阻止、因此事件永远不会在任务上完成。

    我的 I2C 在传输前分配内存以格式化 TX 缓冲区、TX[0]是寄存器、剩余的缓冲区分配数据、传输后该缓冲区被释放。 我使用静态缓冲区来读取数据。  

    我对我的代码进行了一些更改、从传感器读取任务中删除了射频传输、并将所有射频传输放在事件处理任务上、现在这是唯一被阻止的。 为了进行测试、我将射频传输代码替换为控制台的日志、任务从未被阻止、因此可能与射频相关。

    是的、我在发生调试时暂停、代码位于"ti_sysbios_KNL_Idle_LOOP__E ()"、"ti_sysbios_KNL_Task_restore_E ()"或"ti_sysbios_KNL_Idle_run_E ()"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我刚刚修复了这个问题、我刚刚将"rf_cmdStop.startTrigg.triggerType = trig_now;"行中的 RF_cmdPropTx 更改为 RF_cmdNop

    static bool radio_controller_send(radio_packet_cmd_type_t cmd, radio_payload_t *ack_payload) {
        tx_payload.dst_addr = *(uint64_t *)filter_address;
        tx_payload.cmd = cmd;
    
        RF_cmdNop.startTrigger.triggerType = TRIG_NOW;
    
        // Send packet with listen before talk
    #if ACK_MODE == true
        RF_EventMask terminationReason = RF_runCmd(rf_handle, (RF_Op*) &RF_cmdNop, RF_PriorityNormal,
                radio_controller_tx_done_cb, (RF_EventCmdDone | RF_EventRxEntryDone |
                RF_EventLastCmdDone));
    #else
        RF_EventMask terminationReason = RF_runCmd(rf_handle, (RF_Op*) &RF_cmdPropTx, RF_PriorityNormal, NULL, 0);
    #endif
    
        // Command status
        uint32_t cmdStatus = ((volatile RF_Op*) &RF_cmdPropTx)->status;
        uint32_t cmdRXStatus = ((volatile RF_Op*) &RF_cmdPropRxAdv)->status;
    
        // Reset status
        RF_cmdNop.status = IDLE;
        RF_cmdPropCs.status = IDLE;
        RF_cmdCountBranch.status = IDLE;
        RF_cmdPropTx.status = IDLE;
        RF_cmdCountBranch.counter = CS_RETRIES_WHEN_BUSY;
    
        // If command terminate OK
        if (cmdStatus == PROP_DONE_OK && cmdRXStatus == PROP_DONE_OK && terminationReason == RF_EventLastCmdDone) {
            // If packet is from the type ACK
            if (rx_payload.cmd != cmd_type_ack) {
                return false;
            }
    
            *ack_payload = rx_payload;
    
            return true;
        }
    
        return false;
    }