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.

[参考译文] CC3220SF-LAUNCHXL:CC3220SF-LAUNCHXL

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1270639/cc3220sf-launchxl-cc3220sf-launchxl

器件型号:CC3220SF-LAUNCHXL
主题中讨论的其他器件:CC3220SF

大家好!

我们正在使用 CC3220SF MCU、该器件可以正常工作、但问题是 它使用几天或几周后就会停止工作。 代码好像会在什么地方卡住。 我们还实现了看门狗、以便器件在挂起时可以复位。 但在这种情况下、即使看门狗也不会使器件复位。 我们必须对其进行完整的下电上电、以使其能够再次工作。 我们在项目中使用消息队列、并通过 MQTT 将数据传输到服务器。 是否有可能内存在一段时间内被泄露? 但是、在这种情况下、看门狗为什么会停止工作呢? 看门狗应该已恢复了该器件。 有人能帮助我吗?

谢谢。此致、

Snehal。

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

    尊敬的 Snehal:

    这绝对是一种奇怪的情况、我需要更多信息来开始解决此问题。  

    *你看到它挂起了什么功能吗?

    *您是否按照驱动程序下 SDK 中的看门狗示例进行操作? 如果是、看门狗句柄也许在一个中断内部、并且正在复位超时值。

    *当设备卡住时,您检查堆信息了吗? (运行它并连接到调试器)您说这可能需要几天、因此可能更难检查。

    此致、

    罗格利奥

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

    您好:Rogelio、

        目前、我们正在着手捕获日志以监控堆栈和堆使用情况。 在2种情况下、大多数情况下会在器件挂起时观察到。  

    案例1:-我们已经创建了一个用于重新启动 CC3220SF 的函数。 我们已经观察到,有时设备进入这个功能,但不重新启动它,它被卡住. 功能如下:

    int32_t system_reboot() {
    
        log_info("Rebooting system");
        sl_Stop(100);
        sleep(1);
        MAP_PRCMHibernateIntervalSet(330);
        MAP_PRCMHibernateWakeupSourceEnable(PRCM_HIB_SLOW_CLK_CTR);
        MAP_PRCMHibernateEnter();
        return 0;
    }

    案例2:-当我们尝试发送 MQTT 数据时。 功能如下:

    void mqtt_send(MqttEvent_t evt, uint16_t size, char *fmt, ...) {
    
    
        if(!g_MqttEvtQueue) {
            log_error("Mqtt Send failed - Event Queue does not exist!");
            return;
        }
    
        log_info("%s %d malloc %d", __FILE__, __LINE__, size);
    
    
    
        char *payload = (char *)malloc(size);
        add_mem_alloc(__FILE__, __LINE__, size, (void *)payload);
        if (payload == NULL) {
            log_error("OUT OF MEMORY. Could not malloc payload with size: %d", size);
            return;
        }
        MqttEventPayload_t mqttEvt;
    
        memset(payload, 0x00, size);
    
        va_list va;
        va_start (va, fmt);
        vsprintf (payload, fmt, va);
        va_end (va);
    
        mqttEvt.event = evt;
        mqttEvt.msgPtr = payload;
        mqttEvt.msgLen = strlen(payload);
        event_queue_emit_mqtt(&mqttEvt);
    }
    
    
    
    
    
    void * Mqtt_clientRun(void *pvParameters)
    {
        MqttEventPayload_t queueElemRecv;
        struct mq_attr mqstat;
        long lRetVal;
    
        log_info("%d %s Starting Mqtt_clientRun", __LINE__, __func__);
    
        /*handling the signals from various callbacks including the push button  */
        /*prompting the client to publish a msg on PUB_TOPIC OR msg received by  */
        /*the server on enrolled topic(for which the on-board client ha enrolled)*/
        /*from a local client(will be published to the remote broker by the      */
        /*client) OR msg received by the client from the remote broker (need to  */
        /*be sent to the server to see if any local client has subscribed on the */
        /*same topic).                                                           */
        for(;; )
        {
            /*waiting for signals                                                */
            mq_receive(g_MqttEvtQueue, (char*) &queueElemRecv, sizeof(MqttEventPayload_t),
                       NULL);
    
            log_debug("%d Processing Mqtt Event Queue, Event = %d  %s", __LINE__, queueElemRecv.event, get_mqtt_event_str(queueElemRecv.event));
    
    
            if(mq_getattr(g_AppEvtQueue, &mqstat) == 0)
            {
                log_error("%d Queue left g_AppEvtQueue, Msgs: %d  Max: %d", __LINE__, mqstat.mq_curmsgs, mqstat.mq_maxmsg);
            }
    
            switch(queueElemRecv.event)
            {
            case PUBLISH_CMD_DATA: {
                log_info("PUSH Command Data %s", PUBLISH_CMD_TOPIC);
                log_info("PAYLOAD(%d): %s", queueElemRecv.msgLen, queueElemRecv.msgPtr);
                lRetVal = MQTTClient_publish(gMqttClient, (char*) PUBLISH_CMD_TOPIC, strlen((char*)PUBLISH_CMD_TOPIC),
                                             queueElemRecv.msgPtr, queueElemRecv.msgLen, MQTT_QOS_2 |
                                             ((RETAIN_ENABLE) ? MQTT_PUBLISH_RETAIN : 0));
                if(lRetVal < 0) {
                    log_error("Could not PUSH to %s - Error: %d", PUBLISH_CMD_TOPIC, lRetVal);
                    mqtt_handle_error(lRetVal);
                }
    
                free_mem_alloc(__FILE__, __LINE__, (void *)queueElemRecv.msgPtr);
                free(queueElemRecv.msgPtr);
                break;
            }
            case PUBLISH_PINGPONG_PONG: {
                log_info("PUSH Pong %s", PUBLISH_PONG_TOPIC);
                log_info("PAYLOAD(%d): %s", queueElemRecv.msgLen, queueElemRecv.msgPtr);
                lRetVal = MQTTClient_publish(gMqttClient, (char*) PUBLISH_PONG_TOPIC, strlen((char*)PUBLISH_PONG_TOPIC),
                                             queueElemRecv.msgPtr, queueElemRecv.msgLen, MQTT_QOS_2 |
                                             ((RETAIN_ENABLE) ? MQTT_PUBLISH_RETAIN : 0));
                if(lRetVal < 0) {
                    log_info("Could not PUSH to %s - Error: %d", PUBLISH_PONG_TOPIC, lRetVal);
                    mqtt_handle_error(lRetVal);
                }
    
                free_mem_alloc(__FILE__, __LINE__, (void *)queueElemRecv.msgPtr);
                free(queueElemRecv.msgPtr);
                break;
            }
    
            /*On-board client disconnected from remote broker, only      */
            /*local MQTT network will work                               */
            case CLIENT_CONNECT_REQ:
            {
                log_info("Processing CLIENT_CONNECT_REQ");
    
                int32_t res = MqttClient_start();
                if(res < 0)
                {
                    log_info("%s  reconnections - %d", __func__, mqtt_init_fail_count);
    
                    mqtt_init_fail_count++;
                    sleep(1);
                    if(mqtt_init_fail_count >= MAX_CONNECTION_ATTEMPT)
                    {
                        log_info("Reconnection attempts exceeded");
                        radmod_tx_reset_issues();
                        system_reboot();
                    }
                    log_error("MQTT Client initialization failed");
                    MqttEventPayload_t evt;
                    evt.event = CLIENT_CONNECT_REQ;
                    event_queue_emit_mqtt(&evt);
                }
                else
                {
                    log_info("Processing CLIENT_CONNECT_REQ - Error %d", res);
    
                    sys_mqtt_connection_created(); //new-change
                    mqtt_init_fail_count = 0;
                }
    
                break;
            }
            case CLIENT_DISCONNECTED: {
                log_info("Send mqtt client connect request");
    	    sys_mqtt_disconnected();	//new-change
    
                MqttEventPayload_t evt;
                evt.event = CLIENT_CONNECT_REQ;
                event_queue_emit_mqtt(&evt);
    
                break;
            }
            case THREAD_TERMINATE_REQ:
                pthread_exit(0);
                return(NULL);
    
            default: {
                sleep(1);
                break;
            }
            }
        }
    }
    

    这里附加的代码有什么问题吗?  

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

    您好!

    这只是一个简短的评论。

    在堆栈溢出的情况下、重新启动函数可能不可靠。 尤其是睡眠(1)在这一点是非常危险的。 调用 sl_Stop (100)也可能会有问题。 以防 simplelink 驱动程序因堆栈溢出而崩溃。

    1月

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

    您好!

     那么、重启设备的最佳方式是什么?? 您能帮助我吗?

    谢谢。此致、

    斯内哈尔

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

    尊敬的 Snehal:

    在休眠模式下执行代码就非常好。 如果您希望从正常条件复位、应使用 NWP 停止。 但是、如果您希望从故障状态(如堆栈溢出)复位、您应该从复位例程中删除所有不必要的代码。

    1月

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

    大家好、Jan、

     因此、如果我将函数更改为以下函数、

    int32_t system_reboot(){

      log_info ("重启系统");
       
      MAP_PRCMHibernateIntervalSet (330);
      MAP_PRCMHibernateWakeupSourceEnable (PRCM_HIB_SLOW_CLK_CTR);
      MAP_PRCMHibernateEnter();
      返回0;

    音频正常吗?

    此致、
    斯内哈尔

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

    尊敬的 Snehal:

    这看起来不错,但甚至代码 log_info()也可能是危险的,这取决于该函数内代码的外观。

    1月

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

    大家好、Jan、

        好的、明白了。 我还将删除 log_info。 我还注意到、当我尝试通过 MQTT_send 函数发送 MQTT 时设备挂起。 我的函数是否导致堆栈溢出?  

    谢谢。此致、
    斯内哈尔

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

    尊敬的 Snehal:

    我认为,函数 log_info()不可能导致卡住,但为了更有信心,可以合理地删除它。

    谁知道你的情况发生了什么。 若要对 RTOS 进行更深入的调试、您可以使用ROV下面是有关调试 TI-RTOS 常见应用问题的精彩视频。

    1月