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.

[参考译文] 本地 OTA 更新 — sl_FsOpen 错误–10322(空间不足?)

Guru**** 2468610 points
Other Parts Discussed in Thread: CC3220SF, UNIFLASH

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/1529389/local-ota-update---sl_fsopen-error--10322-out-of-space

器件型号:CC3220SF
主题中讨论的其他器件: UNIFLASHSIMPLELINK-CC32XX-SDK

工具/软件:

您好 TI 社区、

我正在使用 CC3220SF 和 SimpleLink CC32xx SDK v6.10.00.05 来处理一个工程、但 我尝试实施本地 OTA 更新。

在我的设置中、器件在中运行 接入点 (AP) 模式 。 更新过程如下:首先、通过 HTTP Put 请求将 update.tar 文件上传到 SD 卡。 上传完成后、通过向/ota/start 端点发送单独的 POST 请求触发更新。 此 POST 请求调用 startOtaUpdate() 函数、该函数然后从 SD 卡读取 update.tar 文件以开始 OTA 过程。

以下是startOtaUpdate()函数的相关代码:

void printStorageInfo(void) {
    SlFsControlGetStorageInfoResponse_t storageInfo;
    int32_t ret;

    ret = sl_FsCtl(SL_FS_CTL_GET_STORAGE_INFO, 0, NULL, NULL, 0, (uint8_t *)&storageInfo, sizeof(storageInfo), NULL);

    if (ret == 0) {
        uint32_t freeBlocks = storageInfo.DeviceUsage.NumOfAvailableBlocksForUserFiles;
        uint32_t freeBytes = freeBlocks * 4096;  // fixed block size at 4096 bytes
        debug_printf("Free: %lu bytes (%lu blocos)\n", freeBytes, freeBlocks);
    } else {
        debug_printf("Error getting storage info: %ld\n", ret);
    }
}

bool startOtaUpdate(void) {

     int status;
     FILE *fp;
     uint8_t buffer[1024];
     size_t bytesRead;
     int16_t bytesProcessed;
     OtaArchive_t ota;
     const char *filename = "fat:/UPDATE.TAR";
     int16_t fsStatus;

     debug_printf("printStorageInfo: \r\n");
     printStorageInfo();

     debug_printf("Starting OTA update...\r\n");

     // Start OTA
     status = OtaArchive_init(&ota);
     if (status < 0) {
         debug_printf("Start OTA error: %d\r\n", status);
         return false;
     }

     // Open file using FatFS
     fp = fopen(filename, "rb");
     if (!fp) {
         debug_printf("Error opening file: '%s'\r\n", filename);
         return false;
     }

     // Reads and processes the contents of the file
     do {
         bytesRead = fread(buffer, 1, sizeof(buffer), fp);
         if (bytesRead <= 0) break;

         status = OtaArchive_process(&ota, buffer, bytesRead, &bytesProcessed);
         if (status < 0) {
             debug_printf("Error in OTA processing: %d\r\n", status);
             fclose(fp);
             return false;
         }
     } while (status == ARCHIVE_STATUS_CONTINUE || status == ARCHIVE_STATUS_FORCE_READ_MORE);

     fclose(fp);

     if (status == ARCHIVE_STATUS_DOWNLOAD_DONE) {
         debug_printf("Download done. Rebooting...\r\n");
         remove(filename);  // Delete file from SD
         PRCMHibernateCycleTrigger();  // Reboot to apply new image
         return true;
     }
 }

问题:

执行该函数时、我会在调试控制台上看到以下输出:

可用空间:139264 字节(34 块)
正在启动 OTA 更新...
Ota Archive_Init:OTA 存档版本= OTA_ARCHIVE_2.0.0.4
Ota Archive_Run ParseTar:解析归档文件头
Ota FileType=0、filename=ota.cmd、Archive_Run Size=166
Ota Archive_Run ParseTar:解析归档文件头
Ota Archive_Run ParseTar:FileType=0、filename=mcuimg.bin、FileSize=217800
创建/打开写入文件 mcuimg.bin
来自 sl_FsOpen 的 Ota Archive_Run ParseTar 错误、状态=–10322
Ota Archive_Rollback:错误 sl_FsCtl、状态=–10282
OTA 处理错误:–20106

通过 Uniflash 检查器件(图 1)、我看到有 136KB 可用于用户文件。 我怀疑问题与固件 (mcuimg.bin) 的大小有关、因为该文件大于可用空间。

图 1:

为了解决该问题、我显著减少了固件功能、只保留了待提交和提交操作所需的基本 OTA 逻辑。 这会将 mcuimg.bin 大小减小至大约 48 KB 。 在这些情况下、OTA 下载成功完成、但重新启动后、器件恢复到之前的固件映像(发生回滚)。

OtaArchive.c: e2e.ti.com/.../OtaArchive.c

我的问题
1) 为什么“可用于用户文件“空间在 4MB 闪存设备上只有 136KB ? 是否可以重新配置闪存布局以分配更多空间用于 OTA 分级?
2) 鉴于这些限制、TI 建议采用什么方法来在固件映像较大且接近默认文件系统配置的限制时可靠执行 OTA?

谢谢你。

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

    您好、

    如果 MCU 映像恢复到之前的状态、则可能在固件启动后缺少提交。 如需详细了解如何使用带手动操作的集成 TI OTA、请参阅我的指南。 您可以在串行闪存指南中找到一些典型的存储器布局

    为了成功实现 OTA、MCU 映像需要处于文件安全模式。 这意味着、如果您有完整的 1MB XIP 闪存、则 sFlash 需要 2MB 的闪存。 但是、如果在 产品的生命周期内不希望 XIP 映像超过 700kB、您可以减少 sFlash 中 MCU 映像的尺寸。  其他用户文件是否将处于失效防护模式、具体取决于您的需要。 如果在 sFlash 中仍然没有足够的空间、则应检查用户文件的大小以及 是否已启用出厂默认功能。 因为 出厂默认功能占用了很大一部分 sFlash。

    1 月

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

    您好、

    很难说你的情况下会有什么问题。 但我总是在生产模式下使用具有真实代码签名证书的器件。 有 操场证书,它可能工作,但我从来没有测试过这个. 您是否确定更新过程中的映像下载过程已成功完成?  未返回错误? 如果您需要有关 OTA 下载的更多信息、可以使用调试标志构建 OTA 库。

    我认为您的 Uniflash 版本存在拼写错误、因为据我所知、版本 3.x 不支持 CC3220 器件。

    1 月

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

    您好、

    我们已经在调试模式下构建了它、并将每个状态记录到一个 txt 文件中。 下载过程中没有错误代码。 抱歉、我们所使用的 uniflash 版本中会出现错误  9.2.0.5300.在我可以测试待处理提交之前、似乎有一个“幻影“回滚。

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

    您好、

    是否使用 Uniflash 对原始映像进行了编程?

    1 月

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

    不可以、原始映像完全是使用 Code Composer 创建的。 它是在不使用 UniFlash 的情况下编译和刷写的。

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

    您好、

    您是否可以尝试使用 Uniflash 对初始映像进行编程?

    1 月