主题中讨论的其他器件: UNIFLASH、 SIMPLELINK-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?
谢谢你。