MCU初始化流程——從上電到main()之間

說明:

  • 以下介紹示例的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()

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章