SoC上電後,不同架構的處理器,代碼執行的初始位置不同。
下邊,根據最近的一個項目來做出說明,整體的邏輯規劃是這樣的:
*上電判斷啓動方式,即用戶選擇是否選擇更新程序;
若是,則判斷是通過SD卡還是通過串口進行更新;
*若用戶不曾選擇進行程序更新,則在跳轉到flash,執行既有代碼;
以上就是bootloader實現的主要功能。
此處上電執行的地址是0x00000000。(此處放置中斷向量表)
1----- 此處第一句Reset/NMI中斷 (跳轉到SOC運行環境初始化函數(CPU初始化、堆棧初始化、內存初始化、跳轉到main)(前三步驟涉及到更底層的硬件暫且不作說明)),
其後放置的是其他的中斷向量表的內容;
2----- 在main函數:
2.1 初始化硬件設備驅動(UART 、 FLASH 、I2C、GPIO、SD card等等,根據設計不同,需要初始化的硬件驅動不同)
2.2 判斷啓動設置( SD卡 或者 USB_Serial 或者 執行flash中原有的程序(位置0x80000000))
通過板級的跳線或者按鍵的選擇,來判斷此次啓動的方式:
a、首先,判斷是否有SD卡、並進一步判斷SD卡中是否有可用的更新程序,如果有則將新的程序複寫到0x80000000的位置;
b 、若a未能進行,則判斷是否通過USB_Serial進行程序更新,即通過PC上位機將新的程序複寫到0x80000000的位置;
c、 經過判斷,若沒有選擇a、b兩種方式,則跳轉到flash的0x80000000位置開始執行,但是 當0x80000000位置存放的代碼有誤的時候(由於某種原遭到破壞),則自動執行b過程,等待上位機對SOC進行 代碼更新;
3------ 當程序更新完畢或者未進行更新直接跳轉到0x80000000位置執行,均意味着BootLoader的一次使命完整結束了。
需要說明的是,更新成功後,可以選擇進入原處循環等待也可以選擇稍後跳轉到0x80000000執行新的程序
-----------------------------------
在BootLoader中,SOC也可以響應其他中斷,具體能夠響應哪些根據向量表中的不同的設置實現。