看到有讀者留言說還是沒理清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的直連取指接口了吧。