NO IMAGE

該檔案主要實現目的:

  • 設定初始SP
  • 設定初始PC=Reset_Handler
  • 設定向量表入口地址,並初始化向量表
  • 呼叫SystemInit,把系統時鐘配製成72M,SystemInit在庫檔案system_stm32f10.c定義
  • 調轉到標號_main,最終來到C程式檔案
; Reset handler
Reset_Handler   PROC
EXPORT  Reset_Handler             [WEAK]
IMPORT  __main
IMPORT  SystemInit
LDR     R0, =SystemInit
BLX     R0               
LDR     R0, =__main
BX      R0
ENDP
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

第一行是程式註釋,在彙編裡面註釋用的是“;”。

第二行是定義了一個子程式:Reset_Handler。

PROC 是子程式定義偽指令。一般用法為: 
1 子程式名PROC NEAR ( 或FAR ) 
2 …… 
3 ret 
4子程式名ENDP 
其中NEAR 和FAR 是屬性詞。 NEAR屬性(段內近呼叫): 
呼叫程式和子程式在同一程式碼段中,只能被相同程式碼段的其他程式呼叫。 
FAR屬性(段間遠呼叫):呼叫程式和子程式不在同一程式碼段中,可以被相同或不同程式碼段的程式呼叫。

第三行EXPORT 表示Reset_Handler 這個子程式可供其他模組呼叫。

關鍵字[WEAK] 
表示弱定義,如果編譯器發現在別處定義了同名的函式,則在連結時用別處的地址進行連結,如果其它地方沒有定義,編譯器也不報錯,以此處地址進行連結。

第四行和第五行IMPORT 說明SystemInit 和__main 這兩個標號在其他檔案,在連結的時候需要到其他檔案去尋找。

SystemInit在庫檔案system_stm32f10x.c 實現,用來初始化STM32的一系列時鐘,把系統時鐘設定為72MHZ。STM32的時鐘比51 微控制器複雜,需要經過一系列的配置才能達到穩定執行的狀態。
__main 其實不是我們定義的,當編譯器編譯時,只要遇到這個標號就會定義這個函式,該函式的主要功能是:負責初始化棧、堆,配置系統境,並在最後跳轉到使用者自定義的main函式,從此來到C的世界。
  • 1
  • 2

第六行把SystemInit 的地址載入到暫存器R0。

第七行程式跳轉到R0 中的地址執行程式,之後系統的時鐘就被設定成72MHZ。

第八行把_main 的地址載入到暫存器R0。

第九行程式跳轉到R0 中的地址執行程式,執行完畢之後就去到我們熟知的C 世界。

第十行表示子程式的結束。

跟一下彙編,大概是__scatterload()->__rt_entry()->__user_setup_stackheap()

啟動檔案的整個過程,分為如下:

(1) 系統初始化,包括對中斷向量表的
(2) 載入RW段;
(3) ZI段清零;
(4)初始化使用者堆
(5) 初始化微庫
(6) 呼叫main函式。