mcu整體工作流程可總結如下:上電——>主時鐘起振——>啟動**——>使用者程式(main函式)。對於我們應用開發來說,大部分工作重點是在應用程式編寫這塊。特別是高階mcu的出現,如arm系列的stm32、lpc等32位mcu,以及晶元原廠的完善底層**,啟動**已經固化在晶元內部flash(稱為bootloader),或者已經提供完整的彙編啟動原始碼。因此,啟動過程這塊,我們比較陌生,但基本的原理還需了解,不排除面試或者使用到實時系統(rtos)時需要修改啟動彙編**。
mcu上電(復位)時,從固定的位址啟動,一般是位址0x00000000,如arm7;個別特殊的如stm32預設啟動位址為0x8000000(flash區啟動)。啟動過程主要完成兩部分工作,乙個是硬體執行環境,如中斷向量表、暫存器、看門狗等,另乙個是軟體環境,如c庫環境、zi(未初始化的記憶體變數)等。
一.硬體環境工作
1.初始時鐘
初始化核心時鐘,主時鐘,各個外設的時鐘。
2.關閉看門狗
看門狗是用來監控應用程式的異常跑飛而復位cpu,在初始化階段,由於沒有「餵狗」這一動作,有可能導致cpu不斷復位,因此,首先會關閉看門狗,初始化完,再開啟。
3.建立中斷向量表4.初始化堆疊暫存器
堆疊的作用乙個就是儲存現場(上下文),如函式呼叫或者中斷傳送時,將當前執行位址壓棧,呼叫完成再返回此處執行程式。另乙個作用就是儲存引數,如臨時變數。因此,在啟動階段需初始化堆疊暫存器、堆疊的大小、起始位址等。
5.記憶體初始化
選擇內部或者外部ram。
二.軟體環境工作
1.把ro,rw從它們的載入域複製到它們的執行域中去。
2.初始化(清零)zi域。
3.初始化堆疊指標
4.初始化c庫環境
包括c庫所需的記憶體空間、程式執行所需資源、c庫初始化。
三.cortex m3啟動而cortex-m3核心規定,起始位址必須存放堆頂指標,而第二個位址則必須存放復位中斷入口向量位址,這樣在cortex-m3核心復位後,會自動從起始位址的下乙個32位空間取出復位中斷入口向量,跳轉執行復位中斷服務程式。對比arm7/arm9核心,cortex-m3核心則是固定了中斷向量表的位置而起始位址是可變化的。即是對於flash啟動來說(正常工作也是flash啟動),0x8000000位址存放的是棧頂位址__initial_sp,0x8000004位址存放的是復位中斷向量reset_handler入口位址(stm32使用32位匯流排,儲存空間為4位元組對齊);在編寫多段程式時,偏移位址空間需注意,如編寫乙個bootloader,從bootloader到應用程式段的相互跳轉。
參考
[1]
linux上電自啟動應用程式詳解
每當我學習乙個新的東西得時候都是會 遇到一些錯誤,但是我會非常努力的去解決它,今天這個自啟動應用程式花了我兩個小時的時間才解決了。所以說遇到問題的時候要去思考 分析。下面我就來談談linux上電自啟動應用程式,以及我遇到的問題。希望能給你帶來一些啟發。我這裡有乙個專案是用滑鼠和觸控螢幕代表輸入裝置,...
在網頁上啟動你的應用程式
現在有一些程式是b s和c s混合的,在winform裡也可以方便的嵌入web,vs2003和vs2005都提供了這樣的控制項。工具等。笨一點的做法,是通過客戶端js來啟動。這樣做有安全隱患,因此window後面版本的作業系統,嚴格限制了js的許可權。研究qq的實現方式,發現非常簡單。看下面的註冊檔...
解決「應用程式無法啟動,應用程式的並行配置不正確」
應用程式事件日誌中 c windows system32 test.exe 的啟用上下文生成失敗。找不到從屬程式集 microsoft.vc80.mfc,processorarchitecture x86 publickeytoken 1fc8b3b9a1e18e3b type win32 vers...