但是、仍然存在错误。 正如所写的、即使比较正确、OTA 库的 FSM 也不会正确地进展到其他存档。 解决方法是执行以下操作:
在 OtaLib.c 中、注释掉以下行:
案例 OTA_State_check_archive_new_update:
{
uint8_t *pVersionFileName;
_SlOtaLibTrace (("ota_run:CdnClient_GetNextDirFile\r\n"));
pOtaLib->pOtaFileName = CdnClient_GetNextDirFile (pCdnClient、&pOtaLib->OtaFileSize);
/*检查列表中的最后一个文件是否仍然没有 tar 文件*/
if (pOtaLib->pOtaFileName =NULL)
{
/*未找到 tar 文件,不返回更新*/
_SlOtaLibTrace (("ota_run:错误 CdnClient_ReqOtaDir -找不到 tar、没有更新\r\n);
pOtaLib->ConseciveOtaErrors = 0;
pOtaLib->State = OTA_State_Idle;
_OtaCleanToIdle (pOtaLib);
返回 OTA_RUN_STATUS_NO_updates;
}
_slOtaLibTraceTM (("ota_run:CdnClient_GetNextDirFile:file=%s、size=%ld、r\n"、pOtaLib->pOtaFileName、pOtaLib->OtaFileSize);
if (strstr ((const char *) pOtaLib->pOtaFileName、".tar")=NULL)
{
_slOtaLibTrace (("ota_run:警告、不是 tar 文件、fileName=%s\r\n"、pOtaLib->pOtaFileName));
/*保持打开状态,检查下一个文件版本*/
pOtaLib->State = ota_State_check_archive_new_update;
返回 OTA_RUN_STATUS_CONTINUE;
}
/*继续,用户应用程序可以覆盖此决定*/
//注释出此行
//pOtaLib->State = OTA_State_Req_file_URL;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
/*插入 Tar 解析器模块*/
OtaArchive_init (&pOtaLib->OtaArchive);
2.在 OTA_SET 中添加:
案例 EXTLIB_OTA_SET_OPT_ACCEP_UPDATE:
/*检查 OTA_State_check_archive_new_update 状态之后是否*
if (pOtaLib->State!= ota_State_check_archive_new_update)
{
_SlOtaLibTrace (("ota_set:错误 EXTLIB_OTA_SET_OPT_ACCEP_UPDATE 处于错误状态=%d\r\n"、pOtaLib->State));
返回 OTA_OPT_ERROR_ERROR_STATE;
}
pOtaLib->State = OTA_State_Req_file_URL;
中断;
3.如果您希望拒绝更新、请不要调用 Ota_set、只需执行任何操作即可。
这些更改将使 FSM 能够进行。
如果有一种机制来执行该操作、则很乐意发送修补程序。
