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:OTA 自检后的 PRCMPeripheralReset (PRCM_WDT)行为

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1177257/cc3220sf-launchxl-prcmperipheralreset-prcm_wdt-behavior-after-ota-self-test

器件型号:CC3220SF-LAUNCHXL
主题中讨论的其他器件:CC3220SF
您好!
我将为我的应用使用以下模块。
Amazon FreeRTOS -> 202107  
FreeRTOS 内核 V10.4.3
AWS IoT 无线更新 v3.0.0
SL 主机驱动程序版本2.0.1.27
Service Pack 版本 sp_3.14.0.0_2.0.0.0_2.2.0.7.bin
  
  
根据我的理解、在 OTA 自检案例中、引导加载程序控制 WDT。
OTA_PAL.c 下-> WDT Start 将通过以下代码片段调用
prvCreateBootInfoFile
{
    sBootInfo.ulStartWdtTime = CC3220_WDT_CLOCK_HZ * OTA_WDT_TIMEOUT;
    sBootInfo.ulStartWdtKey = CC3220_WDT_START_KEY;
}
 
  
 
OTA_PAL.c 下->复位将通过以下代码片段调用
otaPal_SetPlatformImageState
{
    PRCMPeripheralReset( ( _u32 ) PRCM_WDT );
}
 
 
问题:
OTA 映像提交成功后、我的应用程序仍应发送更多传感器数据并必须进入休眠模式(无需重新引导成功的 OTA 映像提交)。在这种情况下、我面临设备挂起、WDT 未恢复、请阐明以下内容以解决我的问题。
 
1.   PRCMPeripheralReset ((_u32) PRCM_WDT)-->这意味着 WDT 正在停止? (如果是、这是 WDT 复位后 WDT 不可恢复的原因、则现在的预期行为)请对此进行澄清。
 
2. 如果我在发布传感器数据时提交、在 OTA Agent 中注释 PRCMPeripheralReset 函数调用。 (如果器件挂起、WDT 也能恢复正常工作)。
   通过移除此 API 调用并将器件直接保持在休眠状态、是否会对 OTA 产生任何其他影响? 是否建议执行此操作以恢复器件?  
 
 
没有  PRCMPeripheralReset (_u32) PRCM_WDT 直接调用 Hibernate 函数可以停止 WDT? 请参阅以下 Hibernate 函数调用(我是说 sl_Stop()将停止 WDT?)。
  
 
void CC3220SF_Hibernate (void)
{
    sl_Stop(SL_STOP_TIMEOUT);
    Board_setBurstMode();
    usleep(SLEEP_BEF_HIB_RESET);

    parkPins();
    Power_shutdown(0x0, shutdownTime);
}
 
 
此致、
Suresh
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    WDT 值(prvCreateBootInfoFile)被写入一个文件(/sys/mcubootinfo.bin)。 这种情况可能会在离线甚至在工厂中发生。  

    成功完成 OTA 并调用 sl_Stop 后、器件进入"测试模式"。

    在该模式下通过复位加电时、引导加载程序将自动设置 WDT 并运行新映像。

    仅 在执行提交时才会重置 WDT (这应该在应用程序验证新映像后发生)。 WDT 回调(在计时器到期时调用)或手动复位而不提交会复位器件并恢复到之前的工作映像。

    OTA 完成后、您要尝试执行什么操作?

     应在 OTA 成功后使用 MAP_PRCMHibernateCycleTrigger。 由于器件的内部(OTA)状态、其他 PRCM API 可能会导致问题。   

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

    您好、Kobi、

      

    非常感谢您的回答。

     

    [引用 userid="132163" URL"~/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1177257/cc3220sf-launchxl-prcmperipheralreset-prcm_wdt-behavior-after-ota-self-test/4431810 #4431810"] OTA 完成后、您尝试执行的操作是什么?

    成功提交映像后、我尝试将数据发布到云。 有时、在这个阶段发布数据(提交后)时、我们会观察到器件不可恢复的挂起、此时 WDT 未被触发(如果我按原样保留 OTA 代理代码中的 PRCMPeripheralReset (PRCM_WDT) API 调用)。

      

    如果我尝试在 OTA Agent 中提交映像之前避免调用 PRCMPeripheralReset (PRCM_WDT)、则在观察到发布数据挂起时 WDT 能够重置器件。 请参阅下面的代码片段以供您参考。

        if( eState == OtaImageStateAccepted )
        {
            PRCMPeripheralReset( ( _u32 ) PRCM_WDT );  /* <<<<<----- Here */ 
            lResult = sl_FsCtl( SL_FS_CTL_BUNDLE_COMMIT, ( _u32 ) 0, ( _u8 * ) NULL, ( _u8 * ) &FsControl, ( _u16 ) sizeof( SlFsControl_t ), ( _u8 * ) NULL, ( _u16 ) 0, ( _u32 * ) NULL );
    
            if( lResult != 0 )
            {
                LogWarn( ( "Accepted final image but commit failed (%d).", lResult ) );
                mainErr = OtaPalCommitFailed;
                subErr = lResult;
            }
            else
            { /* Success. */
                LogInfo( ( "Accepted and committed final image." ) );
                mainErr = OtaPalSuccess;
            }
        }
    

    如果在没有挂起的情况下(成功情况、将数据发送到云后)、我将使用上面提到的代码片段(CC3220SF_Hibernate)中的休眠功能。  

      

    我是说我直接使用  CC3220SF_Hibernate API 调用,而不使用 任何方法来停止 WDT (MAP_PRCMHibernateCycletTrigger 、 PRCMPeripheralReset )。  

    这是否起作用? 我的流程是否正确、请澄清。

     

     

    此致、

    Suresh

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

    下载完成后不应提交。 您应首先执行 sl_Stop 并 重置 (将器件置于"测试模式"并运行新代码)、并且仅在新代码正在运行并已验证时-应调用提交。 您应在此处将响应发送到云(在验证更新后)。

    在您的情况下、似乎您正在尝试执行未经验证的序列、不建议执行该序列。 在我看来、您正在执行的提交 (当您未 重置 WDT 时)将 不会执行该操作、您最终将使用旧代码(除非您在 MCU 重置后再次提交、否则可能会起作用)。  

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

    您好、Kobi、  

    再次感谢您的支持。

     

    OTA 过程、我们完全没有更改。  

    如您所述、代码流与下面的代码流相同。(在 OTA 提交过程中、我不会遇到任何问题。 提交总是会成功)。

     

    1.获取 OTA 作业->2.OTA 下载-> 3.重新启动 MCU -> 4.selest -> 5.PRCMPeripheralReset (PRCM_WDT) -> 6.COMMIT >> 7.发布大量传感器数据(~137KB)-> 8.Hibernate

     

     在第7阶段 发布大量传感器数据时 、我观察到设备无限挂起问题。 (WDT 未恢复)。  

       

    因此、如果没有 直接  执行 1、2、3、4、6、7、8步(移除了第5步)的 STEP-5 (PRCMPeripheralReset (PRCM_WDT)) 、器件就能够使用 WDT 进行恢复。  此时、根据流 OTA 端提交 OTA 映像不会出现问题。 我唯一的问题是 避免 WDT 复位(步骤5)会导致任何问题?

     

    1.获取 OTA 作业->2.OTA 下载-> 3.重新启动 MCU -> 4.selest ->  5.PRCMPeripheralReset (PRCM_WDT) -> 6.COMMIT >> 7.发布大量传感器数据(~137KB)-> 8.Hibernate

     

    此致、

    Suresh

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

    如果您不会重置 WDT、它将在超时到期时重置器件。 它由引导加载程序启动、仅用于在"测试模式"下保护映像。 如果新代码甚至无法启动或在提交前失败。  

    如果您的应用程序中需要 WDT (即提交后-我不确定器件为何卡在那里-您可能需要检查新代码)、您可以从应用程序启动看门狗。 使用看门狗时、您需要定期对其进行复位。