1. 程式人生 > >微控制器啟動檔案

微控制器啟動檔案

  • 初始化堆疊指標SP
  • 初始化PC指標
  • 初始化中斷向量表
  • 配置系統時鐘
  • 呼叫C庫函式_main,最終去到C的世界

 

啟動程式碼通常都燒寫在flash中,它是系統一上電就執行的一段程式,它執行在任何使用者c程式碼之前。上電後,arm處理器處於arm態,運行於管理模式,同時系統所有中斷被禁止,pc到地址0處取指令執行。一個可執行映像檔案必須有個入口點,而能放在rom起始處的映像檔案的入口地址也必須設定為0.在組合語言中,我們已經說過怎樣定義一個程式的入口點,當工程中有多個入口點時,需要在聯結器中使用-entry指出程式的入口點。如果使用者建立的程式中,包含了main函式,則與c庫初始化程式碼對應的也會有個入口點。
總的來說,啟動程式碼主要完成兩方面的工作,一是初始化執行環境,例如中斷向量表、堆疊、i/o等;二是初始化c庫和使用者應用程式。在第一階段,啟動程式碼的人物可以描述為:
(1)建立中斷向量表;
(2)初始化儲存器;
(3)初始化堆疊暫存器;
(4)初始化i/o以及其他必要的裝置;
(5)根據需要改變處理器的狀態。
-->建立中斷向量表
  初始化程式碼必須建立好中斷向量表,以備應用程式後續使用。如果系統的地址0處是rom,則中斷向量表直接是一些跳轉指令就可以了,他們轉到相應的中斷處理函式執行。如果系統的0地址處不是rom,則中斷向量表是通過動態的方式建立的,這主要是通過儲存器對映的方式來實現:即上電後,rom中的地址被對映到地址0,它首先開始執行以便完成環境的初始化,最重要的它會將中斷向量表拷貝到ram中,然後通過地址對映將ram地址對映為0,這樣ram中的中斷向量就可以使用了。
-->初始化儲存系統
對於有mmu的處理器,需要正確初始化mmu,沒有的只需正確初始化儲存控制器,為每個bank配置正確的引數就可以了。
-->初始化堆疊指標
初始化程式碼必須初始化處理器各個模式下的堆疊指標,所有系統或使用者程式會涉及的處理器模式對應的堆疊指標都應該初始化。通常未定義指令和預取指終止異常對應模式的堆疊指標不需要配置,除非使用者需要使用它們作為除錯使用。
-->初始化堆疊指標
初始化程式碼必須初始化處理器各種模式下的堆疊指標,所有系統或使用者程式會涉及的處理器模式對應的堆疊指標都應該被初始化。通常未定義指令和預取指終止異常對應模式的堆疊指標不需要配置,除非使用者需要使用它們作為除錯使用。
-->初始化i/o以及其他必要裝置
關鍵的輸入輸出模組必須在中斷開啟之前被配置,例如看門狗,否則它們會在系統啟動後產生復位訊號。
-->改變處理器狀態和模式
啟動程式碼執行時,處理器狀態認為管理模式,如果使用者程式需要執行在使用者模式,可以切換轉入使用者模式;所有處理器上電後是處於arm狀態的,如果需要改變處理器狀態,也可以在啟動程式碼裡切換到thumb態。
在執行環境建立起來後,接下來就是應用程式的初始化,簡單點就是講使用者程式載入到他們相應的執行地址,初始化資料區等,這個階段完成後,才能進入使用者最終的c程式碼區域。使用者應用程式的初始化過程包括:將rw段的資料拷貝到他們的執行地址處,同時在rw段後面初始化相應大小的zi段資料,把他們初始化為0,使用了庫函式的程式(工程中有main函式)是在庫函式_main中自動完成這些工作的。當用戶程式包含main時,
---------------------
作者:lyn620
來源:CSDN
原文:https://blog.csdn.net/lyn620/article/details/43675613
版權宣告:本文為博主原創文章,轉載請附上博文連結!