大家好:
我想获得专家的反馈、了解在正常工作条件下(假设没有意外复位或功率损耗)、以下运行时闪存复制方法在**CC26x2**器件系列中是否**安全可靠**。
——
###**目标**
我们的目标是将更新的**BIM 图像**和**CCFG**区域以及更新的**certificate 块**从闪存中的临时暂存区域 (`0x34000`) 复制到其最终目的地 (`0x54000–0x57FFF`)、并在运行时由** CAN 消息**触发。
——
###**系统环境**
-器件:** TI CC26x2**(运行 TI-RTOS)
-使用 TI **闪存 API (Driverlib)**执行的闪存操作
-暂存区 (`0x34000–0x35FFF`) 由**OTA update**编写为准备运行的二进制映像。
-结构如下:
-`0x34000`→证书页
-`0x35000`→新的 BIM + CCFG 映像
-最终目的地:
-`0x54000`→证书(最终副本)
-`0x56000`→BIM + CCFG(最终副本)
-在此过程中,BIM/CCFG 区域的写保护为**不*启用。
——
###**代码概览**
此函数在运行时由 CAN 消息触发。
到目前为止、它已成功运行、没有出现错误或意外行为。
```c
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 字节缓冲区
UINT 键= Hwi_disable();
if (isTaskRunning)
task_disable();
// 1。 擦除目标页面(包括 CCFG)
IF (FlashSectorErase (0x54000)!= FAPI_STATUS_SUCCESS)
返回 false;
IF (FlashSectorErase (0x56000)!= FAPI_STATUS_SUCCESS)
返回 false;
// 2. 以 128 字节块进行复制
适用于 (i = 0;i < 0x4000;i += sizeof (dataBuf))
{
uint32_t j;
对于 (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)
返回 false;
}
对于 (I = 0;I < 100000;I++){}//小延迟
if (isTaskRunning)
task_enable ();
Hwi_restore (KEY);
返回 true;
}
```μ s
根据将该函数放入 RAM 中:
1 μ s ```
.ti_ram_code:{
*(.TI_ram_code)
}> SRAM
```μ s
——
###**设计原理**
在擦除和编程操作期间、CC26x2 上的闪存操作会阻止 CPU 访问闪存、因此会将此函数显式移动至** RAM**以避免指令提取冲突。
此外:
-** Hwi_disable()**和**Task_disable()**在编程期间阻止从系统的其他部分访问闪存或抢占。
-所有操作都按顺序(擦除→编程)在小块中完成,以最大程度地减少内存使用。
——
###**问题**
在这些条件(正常运行,无电源故障场景)下、此方法是否被视为**安全且符合 TI 的闪存编程要求?
具体来说:
1.在运行时执行此代码而暂时禁用其他任务时、是否存在**隐藏风险**?
2.在多任务 RTOS 环境中从 RAM 执行闪存操作时、TI 是否建议**额外同步**或预防措施?
3.这是否是动态更新 BIM 和 CCFG 区域(无需重新启动到专用引导加载程序上下文)的**首选方法?
目前、这种实施在实践中运行良好、没有发现崩溃、验证失败或闪存损坏、但我想从架构的角度确认其正确性和潜在的限制。
——
感谢您提供任何见解、文档参考或示例。
此致、
*Yusuf Ünlü