国产MCU A\B SWAP原理及实操
看到有读者留言说还是没理清A\B SWAP的原理。
今天就以某国产MCU为例,实际演示一番,看看大家在芯片设计时思路是什么。
我们首先回顾下SWAP的基本思想。
SWAP的基本思想是将PFLASH分成两组Bank,Bank A(假设是active)和Bank B(假设是inactive)。
当前版本APP在active Bank运行时,刷写新程序到inactive的Bank,这需要Flash Interface支持RWW(Read While Write)属性。编程完成后进行Bank切换。
在芯片下次启动时,以前inactive bank将变为active,新的APP就开始运行了。
更重要的是SWAP机制可以保证APP始终从相同的地址执行,也就是说咱们只需要维护一个链接脚本,做好工程版本记录即可。
以某国产MCU为例,M4内核,2M Flash,支持SWAP,如下:
测试工程也很简单,定义vector table 就在0地址,代码中判断如果是SWAP OFF就进行SWAP ON(类似UCB刷写),否则就SWAP OFF。除了log,其余代码配置全部相同。
工程A的输出打印为:"Image running at bank A,PC = 0x%x .\r\n",get_pc()"
工程B的输出打印为:"Image running at bank B,PC = 0x%x .\r\n",get_pc()"。
最后各自编译得到bin。
现在我们将image A下载到0地址,将Image B下载到0x100000地址,
我们不停cold reset来观察log,如下:
可以看到,即使在不同Bank上的程序,CPU始终都使用的相同的地址去取指。
那这是怎么做到的呢?
原理应该不难,CPU从Flash进行取指,势必需要经过Flash Contorller进行响应,那么设计时首先在这一层级维护两个状态机:Read 、Program/Erase,这样就能支持不同Bank的RWW;其次在这一层级去判断SWAP是否使能,在进行地址切换即可。
你仔细观察上面两个CASE,它的reset handle都没变。
所以一个小结论:CPU其实不知道SWAP是否打开了,它所有数据、指令访问都是逻辑地址,还需要Flash Controller再翻译一次找到对应的物理BANK,SWAP就在这一层进行处理;
现在您能理解,为什么TC3在使用SOTA时需要关闭CPUx和Flash的直连取指接口了吧。