大家好:
我希望获得以下运行时闪存复制方法的专家反馈 安全可靠 在上 CC26x2 正常工作条件下的器件系列(假设没有意外复位或功率损耗)。
目标
我们的目标是复制更新的 BIM 映像 和 CCFG 区域、并进行了更新 证书块 、从闪存0x34000 () 中的临时暂存区域到其最终目的地0x54000–0x57FFF ()、由触发 CAN 消息 至关重要。
系统环境
-
器件: TI CC26x2 (运行 TI-RTOS)
-
使用 TI 执行的闪存操作 闪存 API (driverlib)
-
暂存区
0x34000–0x35FFF() 是由之前编写的 OTA 更新 即用型二进制映像。 -
该结构如下:
-
0x34000→证书页 -
0x35000→新的 BIM + CCFG 映像
-
-
最终目的地:
-
0x54000T Ü V→(最终副本) -
0x56000→BIM + CCFG(最终副本)
-
-
为何种保护 不会 在此过程中为 BIM/CCFG 区域启用。
代码概述
此函数在运行时由 CAN 消息触发。
到目前为止、它已成功运行、没有出现错误或意外行为。
uint8_t res = copyBimToFinal(true);
__attribute__((section(".ti_ram_code")))
bool copyBimToFinal(bool isTaskRunning)
{
uint8_t* src = (uint8_t*)0x34000;
uint8_t* dst = (uint8_t*)0x54000;
uint32_t i;
uint32_t dataBuf[32]; // 128-byte buffer
UInt key = Hwi_disable();
if (isTaskRunning)
Task_disable();
// 1. Erase destination pages (including CCFG)
if (FlashSectorErase(0x54000) != FAPI_STATUS_SUCCESS)
return false;
if (FlashSectorErase(0x56000) != FAPI_STATUS_SUCCESS)
return false;
// 2. Copy in 128-byte chunks
for (i = 0; i < 0x4000; i += sizeof(dataBuf))
{
uint32_t j;
for (j = 0; j < sizeof(dataBuf); j++)
{
((uint8_t*)dataBuf)[j] = src[i + j];
}
if (FlashProgram((uint8_t*)dataBuf, (uint32_t)(dst + i), sizeof(dataBuf)) != FAPI_STATUS_SUCCESS)
return false;
}
for (i = 0; i < 100000; i++) {} // Small delay
if (isTaskRunning)
Task_enable();
Hwi_restore(key);
return true;
}
根据将该函数放入 RAM 中:
.ti_ram_code : {
*(.ti_ram_code)
} > SRAM
设计原理
在擦除和编程操作期间、CC26x2 上的闪存操作会阻止 CPU 访问闪存、因此该函数被显式移动至 RAM 以避免指令提取冲突。
此外:
-
hwi_disable() 和 task_disable () 在编程期间防止闪存访问或抢占系统其他器件。
-
所有操作都按顺序(擦除→编程)小块完成、以尽可能减少内存使用。
问题
在这些条件下(正常运行,无电源故障场景)、是否考虑了此方法 安全且合规 是否满足 TI 的闪存编程要求?
具体来说:
-
有任何问题 隐藏风险 暂时禁用其他任务时、如何在运行时从 RAM 执行此代码?
-
TI 是否建议使用 额外同步 在多任务 RTOS 环境中从 RAM 执行闪存操作时、是否有预防措施?
-
是这样 首选方法 动态更新 BIM 和 CCFG 区域(无需重新启动到专用引导加载程序上下文)?
目前、这种实施在实践中运行良好、没有发现崩溃、验证失败或闪存损坏、但我想从架构的角度确认其正确性和潜在的限制。
感谢您提供任何见解、文档参考或示例。
此致、
Yusuf Ünlü ó n