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.

[参考译文] BOOSTXL-CC2650MA:额外的 SYS/BIOS 任务意外终止

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1044555/boostxl-cc2650ma-additional-sys-bios-task-terminating-unexpectedly

器件型号:BOOSTXL-CC2650MA
Thread 中讨论的其他器件:SYSBIOS

从 Github 更新的 SPP_BLE_Server 示例开始,我添加了两个单独的任务,其中一个是 Task_sleep()的可变延迟循环,它在末尾阻止了一个位  每次执行时、它都会检查静态文件范围标志、以查看连接状态是否已更改。

当 sppbleserver.c:SPPBLEServer_processStateChangeEvt()获取 GAPROLE_CONNECTED 案例时,它会调用一个设置上述标志的函数。  完成此操作后、根据经典 ROV、相关任务进入"已终止"状态。

我最初忘记了使 FLAG 变量变为易失性、但纠正这一问题没有帮助、并且调试器开始在断点处抱怨"Cortex_M3_0:错误:(错误-1170 @ 0x0)无法访问 DAP。"  我还尝试对信息进行排队以实现更好的同步、但在调用"flag"函数后停止时、我在"Debug"面板中看到的所有内容是:

* ti_sysbios_hal_hwi_HwiProxy_Object__delete_s_S_man翻转__()、

* ti_sysbyos_KNL_Task_SupportProxy_swap_E__man翻转_()、

它现在是 SPPBLESERVER_taskFxn、它是终止的。

此外、根据 ROV、stackPeak 不超过 STACKSIZE、所以我有点困惑。  TI-RTOS 环境仍然不熟悉、因此不确定要预先提供哪些附加信息。

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

    您好!

    是否要共享任务的代码片段、该代码片段意外终止?  

    您能否指定新堆栈是否访问 BLEStack (即调用一些 ICall 函数)?

    此致、

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

    您好、Cl é ment、

    通过调用 SerialPortService_SetParameter()和 SDITASK_sendToUART(),新堆栈确实包括 iCall 函数。  任务本质上是 UART 和 BLE 接口之间的一个垫片- 它通过 BLE 接收 ASCII 命令(由我提到的另一个任务在环形缓冲区中收集)、通过 UART 查询"主"微控制器、在信号量上发送响应、并格式化 ASCII 响应并通过 BLE 报告。

    在循环开始之前,我确实调用 iCall_registerApp(),但实际上我没有使用传递给它的任何一个结构。

    我应该能够轻松分享要点:

    // This is called by SPPBLEServer_processStateChangeEvt() on GAPROLE_ADVERTISING or GAPROLE_CONNECTED cases
    
    void ui_connect_notify(bool b_connected)
    {
        connstat.b_connected_status = b_connected;
        Queue_enqueue(connstat_q, &(connstat.elem));
    }
    
    
    void ui_update (UArg arg0, UArg arg1)
    {
    
    
        ICall_registerApp(&ui_entity, &ui_sem);
    
    
        for(;;)
        {
            b_waiting = false;
            set_ms_delay(100);  // default value for Task_sleep() at end of loop
    
            if (!Queue_empty(connstat_q))
            {
                p_connstat = Queue_dequeue(connstat_q);
                b_connected_status = p_connstat->b_connected_status;
    
                if (b_last_connect_status != b_connected_status)
                {
                    b_substate_reset = true;
                    bt_state = b_connected_status ? BT_STATMSG : BT_IDLE;
                    b_last_connect_status = b_connected_status;
                    
                    if (b_connected_status)
                    {
                        Task_sleep(1000 * TICKS_PER_MS);
                    }
                }
            }
    
            if (!b_waiting)
            {
                b_state_changed  = (bt_state != current_state);
                current_state    = bt_state;
                
                switch (bt_state)
                {
                    case BT_IDLE:
                    {
                    }
                    break;
    
                    case BT_STATMSG:
                    {
                        bt_state = bt_status_message();
                    }
                    break;
                    
                    default:
                    break;
                }
            }
            
            // the full function has other cases that may modify sleep_delay via set_ms_delay()
            Task_sleep(sleep_delay);
        }
        
        
    static bt_state_t bt_status_message(void)
    {
        static uint8_t  msgnum = 0;
        uint16_t        iter   = 0;
    
        bt_state_t next_state = BT_STATMSG;
    
        if (b_state_changed)
        {
            msgnum = 0;
        }
    
        switch (msgnum)
        {
            case 0:
            {
                // Calls to comctl_get_set configure a packet sent over UART via SDITask_sendToUART(), and pend on a semaphore for the response.
                // The return value is a union of all used sizes of signed/unsigned ints, and pointers thereto
                uint8_t sysmode = comctl_get_set(ATT_SYSMODE, ATT_SYSMODE_MODE, NULL, 0, false).u08;
    
                //capitalize "mode" when authorized
                sprintf(g_uartTXBuf, "%code: ", (BTauth != 0) ? 'M' : 'm');
    
                sprintf(&g_uartTXBuf[6], 
                        ((sysmode < NUM_SYS_MODES) ? &s_sysmode[sysmode][0] : (const uint8_t *) "Undefined\r\n"));
                ble_transmit_string(&g_uartTXBuf[0]);
                msgnum = (SYS_MODE_ERROR == sysmode) ? 1 : 0;
                set_ms_delay((msgnum != 0) ? 300 : 1000);
            }
            break;
    
            case 1:
            {
                uint32_t widemap = 0;
                bool b_code_found = false;
                static uint8_t mask_index = 0;
    
                widemap = comctl_get_set(ATT_FAULTS, ATT_FAULT_ACTIVE, NULL, 0, false).u32;
    
                if (0 == widemap) // in error mode, but no flags
                {
                    sprintf(g_uartTXBuf, "Unspecified error\r\n");
                    ble_transmit_string(g_uartTXBuf);
                    mask_index = NUM_ERRCODES;
                }
                else
                {
                    for (iter = 0; iter < NUM_ERRCODES; ++iter)
                    {
                        if ((fault_bitmask[iter] & widemap) != 0)
                        {
                            sprintf(g_uartTXBuf, "Error: %s\r\n", s_errorcode[iter]);
                            error_details_append(iter, g_uartTXBuf);
                            ble_transmit_string(g_uartTXBuf);
                        }
                    }
                }
    
                set_ms_delay(1000);
                mask_index = 0;
                msgnum = 0;
            }
            break;
    
            default:
            {
                msgnum = 0;
            }
            break;
        }
    
        return next_state;
    }
    
    static void ble_transmit_string(uint8_t * p_data)
    {
        int32_t len = strlen((const char *) p_data);
    
        if (len > RX_BUFFER_LENGTH)
        {
            len = RX_BUFFER_LENGTH;
        }
    
        if (SerialPortService_SetParameter(SERIALPORTSERVICE_CHAR_DATA, len, p_data) == 0)
        {
    #if 0
            SerialPortService_AddStatusTXBytes(len);
    #endif
        }
    }

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

    UI_UPDATE ()是有问题的任务,我包含了一个用于附加上下文的完全版 bt_STATUS_MESSAGE()。

    有趣的是、实际发生的任何事情都有一定程度的延迟。  单步执行代码后,任务终止在 ui_connect_notify ()执行后发生,但保持正常速度运行,状态案例0执行并输出到 BLE,状态案例1在 UART 上传输查询,但停止通过 BLE 输出结果。

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

    此外、这最初是在我打开#3861641之前开始工作的、当时我可以完成链接。  该 TT 中的解决方案的一部分是升级编译器、但恢复到原始代码不会恢复项目所需的行为。

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

    尊敬的 James:

    您所指的 TT 编号是什么? 您能否提供链接?

    最棒的

    不需要

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

    e2e.ti.com/.../3861641

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

    如果我可以提供任何其他信息、请告诉我。

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

    几乎一周内没有听到任何声音;我是否错过了任何内容、或者忽略了要求我提供的任何信息?

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

    您好、Nathan、

    在两周内没有听到 TI 的声音;不知道我是否已经滑倒过裂缝或什么。

    我恢复到项目的最后一个工作版本、修复了导致链接问题的省略文件、而没有该 TT 中的任何其他更改、并且它可以正常工作。

    但是、这不是第一次出现这些症状、我想了解发生了什么或下次出现故障时如何进行故障排除。

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

    尊敬的 James:

    我对延迟回复表示歉意。 这肯定会从裂缝中滑出。 但是、您修复了另一个文件以使器件正常工作、这一事实向我表明问题可能在其他地方。 让我与我的同事交流、并在明天回复您。

    最棒的

    不需要

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

    尊敬的 James:

    在回顾该主题后、我们的专家认为它可能与创建其他支持 iCall 的任务与非支持 iCall 的任务相关(例如、在堆栈回调函数上下文中通过 iCall 进行 API 调用)。 此任务是否可能未在 iCall 中注册? 如果是、则无法在其上下文中调用 iCall 函数。

    同时、这也可能与内存问题有关、请查看 Jeff 的以下帖子:

    https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/429180/sensortag-2015-loop/1533668#1533668

    如果您有兴趣并愿意、请随时向我们发送您的完整项目(设置为在 LaunchPad 上运行)、我们将对此进行介绍。

    最棒的

    不需要

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

    ICall 注册是我在开始使用 TI-RTOS 环境后首先学习的课程之一、从那时起就没有任何问题。

    当时、我认为可能会出现您刚才链接的 TT 中所述的溢出、但无法确定是否发生了这种情况。  当然、我也遵循了编程指南中的提示、但如果有需要、我会再次进行回顾。

    在 Git 中可能有一个重现问题的修订版、但我必须找到它、或者将其缩减为我可以分享的内容、或者建立 NDA、很遗憾、我现在没有这两个方面的带宽。