ARM cortex m IAP公升級小記

2021-10-22 10:32:54 字數 1911 閱讀 5751

這篇文章主要針對arm cortex-m3/m4,硬體環境使用stm32f系列,軟體環境為keil mdk5。

硬體**

想要搞通arm 的iap公升級,首先要搞懂arm晶元一些硬體原理,arm晶元採用馮。諾依曼架構,**和資料儲存在相同儲存體中(只是儲存在邏輯上相同的儲存體中,不一定儲存在同乙個儲存體,有一些手段可以實現**資料分離,這裡不對此做過度延伸)。arm晶元啟動後起始執行位置取決於具體晶元,例如nxp lpc預設從0開始,stm32預設從0x08000000開始,起始位置的前端部分存放的是程式中斷向量表,其中第乙個位置存放堆疊初始化函式位址,第二個中斷向量存放的是reset_handler,這也就決定了晶元啟動後會首先初始化堆疊,然後執行晶元復位流程,隨後再切入main函式。

啟動流程

我們以stm32f1的startup.s為例簡單了解一下arm晶元啟動流程。

如圖是第乙個向量就是startup.s中存放的中斷向量表,第乙個是__initial_sp,第二個就是reset_handler。

堆疊初始化我們不需理會,我們來看看reset_handler做了什麼

復位控制代碼同樣在startup.s中,reset_handler首先把systeminit函式放入r0中,隨後執行systeminit,初始化後就跳轉main函式,開始執行主函式。

systeminit主要就是初始化各種時鐘,包括內建rc外接晶振主pll外設時鐘等等雜七雜八的一些,比較重要的是最後幾行。

最後幾行實際上只執行了乙個功能:初始化中斷向量表基址,這個基址實際上就是我們之前提到的程式的實際起始位置,在stm32中就是0x08000000。

之後就是執行main函式了,不再累述。

iap實現原理

除此之外,還有乙個是中斷問題,中斷在iap過程中是乙個要十分謹慎處理的部分,處理不好可能出現各種嚴重事故和各種難以追蹤到的bug(相信我,你不會想在各種隨緣復現的錯誤中找bug的)。

bootloader實現

注意,下面是重點中的重點,搞懂了下面的部分,iap就不是問題了

核心函式: iap_jumpto,進入函式後首先判斷所給出的程式位址是否可能是有效的,即位址中第一組值是否是乙個有效的記憶體值,若是,則正式開始跳轉。

首先遮蔽所有中斷,防止跳轉前的預處理過程被打擾。

設定指標

關閉所有外設中斷,所有的外設中斷都要在這個函式裡關掉,另外注意,滴答定時器的中斷是沒法通過正常的關中斷方式關閉的,因此要單獨處理,呼叫systick_deinit直接把滴答定時器關掉。

設定psp和msp,其中psp不是必須的,在沒有使用rtos的程式中可以不用管。

重定位中斷向量表,這一步對應中斷處理函式位址問題。

設定

glibc 公升級 gcc公升級

install tar xvf version.tar cd version mkdir tmpbuild cd tmpbuild configure prefix usr make make install gcc公升級 centos 4.8下手動安裝gcc4.5.0 gcc編譯目前的最新版本是 ...

版本公升級 Harbor版本公升級

本文只適用於harbor的版本大於v1.10.x到最新版本的公升級遷移,docker compose啟動的harbor。主要參考了官網的公升級指南,根據實際情況我稍微調整了下步驟。詳情請參考 此次測試是從版本v2.0.1公升級到v2.1.2 cd root wget2.解壓檔案到當前目錄 tar x...

android OTA 公升級包含增量公升級

ota 全稱over the air ota 公升級是android 系統提供的標準軟體公升級方式。它功能強大,提供了完全公升級 增量公升級模式,可以通過 sd 卡公升級,也可以通過 網路公升級。這裡,首先介紹sd卡公升級,網路公升級原理和sd卡大致一樣.下面我們將介紹這一過程.在公升級前,我們要準...