开发中,经常遇到初学者把SOTA和Overlay两个功能搞混淆,因此随便总结总结,有不对的地方大家指出来
1、功能对比
功能 | SOTA | Overlay |
功能描述 | 使能SOTA功能,将整个Flash分为两块,可实现A区运行程序,同时刷写新程序到B区 | 将所要访问的数据(通常存放在Flash)重定向到所选overlay内存(通常为RAM区域) |
应用场景 | 不连接烧写器的情况下,通过CAN、串口、以太网等通讯方式,实现应用程序的更新 | 在程序运行时实时在线进行标定工作 |
相关寄存器 | CU_SWAPCTRL, DMU_HF_PROCONTP.SWAPEN | CPU_OSEL, CPU_RABR, CPU_OTAR, CPU_OMASK |
相关章节 | TC3xx_Part1-UsermManual-v1.00 1.5 Software over the air | TC3xx_Part1-UsermManual-v1.00 5.3.9 Data Access Overlay |
总结 | 1、SOTA用于OTA程序升级,Overlay用于汽车控制器标定技术,二者应用场景不同 2、SOTA关联TC3xx模块为:SCU和DMU,Overlay关联TC3xx模块:CPU 3、SOTA关注Flash的A/B分区和地址映射,Overlay关注flash重定向到ram |
2、SOTA功能描述
核心逻辑:使能SWAP功能,使两块不同的物理区域可以映射到相同逻辑地址
以TC39x为例,该芯片有两种Address map方式:
(1)Standard Address map

(2)Alternate address map

标准地址映射,A0000000-A0BFFFFF 对应物理BANK 为(PF0、1)(简称A)、(PF2、3)(简称B)
备用地址映射,A0000000-A0BFFFFF 对应物理BANK 为(PF2、3)(B)、(PF0、1)(A)

以上述为例,用户使用A000 0000 - A05F FFFF作为工程的运行区(不关心实际对应哪一块物理BANK),用A060 0000 - A0BF FFFF作为OTA升级的程序刷写区;
当需要OTA升级时,将代码写到程序刷写区后,检查当前地址映射模式,配置寄存器切换到另一种地址模式,MCU重启后刷写区对应的物理bank会映射到运行区,开始运行新的程序;后续OTA升级以此类推。
3、Overlay功能描述
核心逻辑:通过配置Overlay寄存器,CPU访问Flash地址,但实际重定向访问RAM中内容

应用场景举例:在汽车制动中,假设制动力大小与制动踏板的数学模型
Y = aX+b
其中,Y是制动力,X是制动踏板开度,a、b为模型系数;
通常情况下,a、b是作为常量存储在Flash
现在标定工程师开发过程中,想要在某个固定制动踏板位置下,修改a、b参数来调节制动力大小,
如果是修改flash,从时间和安全角度是不现实的。
因此需要把a、b的值拷贝到RAM,通过访问修改ram中a、b值来达到上述目的。
Overlay功能举例说明:
假设想把PFlash0(0x8000 1000)(128byte)重定向到CPU0DSPR(0x70011000)
定义一个常量,存储在PF中,如下


定义一个变量,存储在RAM中,如下

Overlay是针对CPU的,由于debug是走bypass,因此如果直接去memory看overlay flash值,必定还是原flash的值。
需要一个中间变量来承接,定为Test_Algo_Update

开启overlay功能,要达到的目的为:通过cpu0去读取被重定向flash里的值,实际读到的应该是RAM中的值
