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.

CC3235S OTA升级后重启卡死

你好,我们在OOB工程中加了自己的程序,并且程序正常可用,但是在OTA软件升级并且软件重启 后,程序会就卡死,如果要解决这个问题,可以掉电重启,掉电重启后不会卡死。请问有什么办法可以解决不掉电直接软件重启并不卡死嘛?

  • 是否有信息输出,查看具体卡在哪一步?
  • 无法仿真,面看不到具体卡在哪里。开了看门狗,但是看门狗好像没有起作用

    void WatchCallbackFxn(Watchdog_Handle watchdogHandle)
    {
        Watchdog_clear(watchdogHandle);
    }   
    watchdog_Init()
    {
        watchdog_init();
        Watchdog_Params_init(&params);
        params.resetMode = Watchdog_RESET_ON;
        params.callbackFxn = (Watchdog_Callback) WatchCallbackFxn;
        watchdogHandle = Watchdog_open(CONFIG_WATCHDOG_0,&params);
                            if( watchdogHandle == NULL )
                            {
                                usleep(1);
                            }
    }
    
    void * controlTask(void *pvParameters)
    {
        ........
    Watchdog_setReload(watchdogHandle, 150000);
    }
    
    
    

  • "如果要解决这个问题,可以掉电重启,掉电重启后不会卡死" 重启过后的程序是更新前还是更新后的?
  • 请问你使用的是TI launchpad还是自制板?

    在OTA时推荐用bootloader来使用看门狗,需要写入"/sys/mcubootinfo.bin" 文件并且设置sBootInfo.ulStartWdtTime。请参考一下下面的代码【来自CloudOTA example】。在reset后【即系统文件已就位】,boot loader会在运行新image之前设置WDT。假如WDT超时【新image没有正确提交】,bootloader即返回到原先的image

    int32_t Platform_CommitWdtConfig(int32_t TimeoutInSeconds)
    {
    #ifdef CC32XX
        int32_t lFileHandle;
        uint32_t ulToken = 0;
        sBootInfo_t sBootInfo;
        int32_t lRetVal;
    
        lFileHandle = sl_FsOpen(
            (unsigned char *)"/sys/mcubootinfo.bin",
            SL_FS_CREATE | SL_FS_OVERWRITE |
            SL_FS_CREATE_MAX_SIZE(
                sizeof(sBootInfo)) |
            SL_FS_CREATE_SECURE | SL_FS_CREATE_PUBLIC_WRITE |
            SL_FS_CREATE_NOSIGNATURE,
            (_u32 *)&ulToken);
    
        if(0 > lFileHandle)
        {
            //OTA_DBG_PRINT("OtaWatchDog: Error opening bootinfo file
          //        : %d\n\r",lFileHandle);
            return(-1);
        }
    
        memset(&sBootInfo,0,sizeof(sBootInfo_t));
        /* max 104 seconds */
        sBootInfo.ulStartWdtTime = 40000000 * TimeoutInSeconds; 
        sBootInfo.ulStartWdtKey = APPS_WDT_START_KEY;
        lRetVal =
            sl_FsWrite(lFileHandle, 0, (uint8_t*)&sBootInfo, sizeof(sBootInfo_t));
        lRetVal = sl_FsClose(lFileHandle, 0, 0, 0);
        if(0 != lRetVal)
        {
            //OTA_DBG_PRINT("OtaWatchDog: Failed to close the bootinfo file");
            return(-1);
        }
    #endif
        //Enable WDT - done by PRCMCC3200MCUInit
        //HWREG(0x4402E188) |= 0x00000020;
        return(0);
    }

    在MCU reset之前,确保先调用"sl_Stop()"

    假如还有问题,请把整个OTA过程的log信息传上来【在otauser.h中,使能 "SL_ENABLE_OTA_DEBUG_TRACES",即可获取OTA lib的log信息】