說明:
- 以下介紹示例的MCU地址空間如下:
ROM空間爲:0x0000 0000 – 0x0000 8000
RAM空間爲:0x2000 0000 – 0x2000 2000
- 堆棧(SP)生長方向爲 遞減;
- 小端模式
- Cortex-M0內核
正文:
一、MCU上電後,硬件設計保證,自動從地址0x00開始取數據
初始化文件中代碼設置 如下:
第一個數據用於初始化SP指針,其次爲復位中斷向量
生成結果請看:ROM中數據如下左,對應彙編指令如下右:
上電後,運行指令前狀態:
二、在地址Reset_Handler / 0x0000 0194處存放着“復位中斷處理函數”
代碼設計:
彙編指令爲:
其中rom地址0x0000 01B0處,存放着 函數__main的地址0x0000 00C0
運行後,跳轉至__main函數,開始運行:
三、在__main中,主要做兩個函數:
0x000000C0 F000F802 BL.W __scatterload (0x000000C8)
0x000000C4 F000F830 BL.W __rt_entry (0x00000128)
此部分網上也有不錯的介紹文章,
__main函數的作用: (https://blog.csdn.net/wheat_in_winner/article/details/53583462)
1.完成全局/靜態變量的初始化工作
2.初始化堆棧
3.庫函數的初始化
4.程序的跳轉,進入main()函數。
MDK __main()代碼執行過程分析 (https://blog.csdn.net/wangfoquan/article/details/7650988)
__scatterload():負責把RW/RO輸出段從裝載域地址複製到運行域地址,並完成了ZI運行域的初始化工作。
__rt_entry():負責初始化堆棧,完成庫函數的初始化,最後自動跳轉向main()函數。
此處彙編指令過長,不細展開:
查看.map文件數據:
彙編指令:
細究應該還有image結構的內容,(在MDK的help文檔中有相關內容)
四、 進入C語言的世界 main()