;* 文件名 : startup_stm32f10x_hd.s
;* 庫版本 : V3.5.0
;* 說明: 此文件為STM32F10x高密度設(shè)備的MDK工具鏈的啟動文件
;* 該模塊執(zhí)行以下操作:
;* -設(shè)置初始堆棧指針(SP)
;* -設(shè)置初始程序計數(shù)器(PC)為復(fù)位向量,并在執(zhí)行main函數(shù)前初始化系統(tǒng)時鐘
;* -設(shè)置向量表入口為異常事件的入口地址
;* -復(fù)位之后處理器為線程模式,優(yōu)先級為特權(quán)級,堆棧設(shè)置為MSP主堆棧
;*
Stack_Size EQU 0x00000200 ;定義堆棧的大小
;AREA 命令指示匯編器匯編一個新的代碼段或數(shù)據(jù)段。
;段是獨立的、指定的、不可見的代碼或數(shù)據(jù)塊,它們由鏈接器處理.
;段是獨立的、命名的、不可分割的代碼或數(shù)據(jù)序列。一個代碼段是生成一個應(yīng)用程序的最低要求
;默認情況下,ELF 段在四字節(jié)邊界上對齊。expression 可以擁有 0 到 31 的任何整數(shù)。
;段在 2expression 字節(jié)邊界上對齊
AREA STACK, NOINIT, READWRITE, ALIGN=3 ;堆棧段,未初始化,允許讀寫,8字節(jié)邊界對齊
; 說明: Cortex-M3的指令地址要求是字邊界對齊(4字節(jié));但是代碼段是8字節(jié)邊界對齊的
Stack_Mem SPACE Stack_Size ;分配堆??臻g,把首地址賦給Stack_Mem
__initial_sp ;初始化堆棧指針,指向堆棧頂.
; 此處有個一個問題討論,關(guān)于棧頂在RAM中所處位置問題,很多初學(xué)者一直以為是編譯器特意放在HEAP段之后是有意為之,并且認為這樣可以利用heap未分配空間來防止未知的棧溢出問題
; 這種理解是錯誤的,鏈接器并不會為棧的位置做特殊的處理,而且這樣做也并不會利用heap段,在此文件的最后對堆棧的初始化代碼中可以看出他們是兩個互相獨立的數(shù)據(jù)區(qū)。此處出現(xiàn)的現(xiàn)
; 象是因為MDK按數(shù)據(jù)段的字母順序鏈接數(shù)據(jù)段的地址的,所以此處造成了堆的地址在棧的前面的假象,不要竊以為是有某種特殊的約定。
;
;
Heap_Size EQU 0x00000200 ;定義堆的大小
AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;堆段,未初始化,允許讀寫,堆數(shù)據(jù)段8字節(jié)邊界對齊
__heap_base
Heap_Mem SPACE Heap_Size ;分配堆空間
__heap_limit ;與__heap_base配合限制堆的大小
PRESERVE8 ; 命令指定當前文件保持棧的八字節(jié)對齊
THUMB ; 指令集,THUMB 必須位于使用新語法的任何Thumb代碼之前
; EXPORT 命令聲明一個符號,可由鏈接器用于解釋各個目標和庫文件中的符號引用,相當于聲明了一個全局變量。 GLOBAL 于 EXPORT相同。
; 以下為向量表,在復(fù)位時被映射到FLASH的0地址
AREA RESET, DATA, READONLY ;復(fù)位段,只包含數(shù)據(jù),只讀
EXPORT __Vectors ;標號輸出,中斷向量表開始
EXPORT __Vectors_End ;中斷向量表結(jié)束
EXPORT __Vectors_Size ;中斷向量表大小
; DCD 命令分配一個或多個字的存儲器,在四個字節(jié)的邊界上對齊,并定義存儲器的運行時初值。
__Vectors DCD __initial_sp ; Top of Stack 棧頂指針,被放在向量表的開始,F(xiàn)LASH的0地址,復(fù)位后首先裝載棧頂指針
DCD Reset_Handler ; Reset Handler 復(fù)位異常,裝載完棧頂后,第一個執(zhí)行的,并且不返回。
DCD NMI_Handler ; NMI Handler 不可屏蔽中斷
DCD HardFault_Handler ; Hard Fault Handler 硬件錯誤中斷
DCD MemManage_Handler ; MPU Fault Handler 內(nèi)存管理錯誤中斷
DCD BusFault_Handler ; Bus Fault Handler 總線錯誤中斷,一般發(fā)生在數(shù)據(jù)訪問異常,比如fsmc訪問不當
DCD UsageFault_Handler ; Usage Fault Handler 用法錯誤中斷,一般是預(yù)取值,或者位置指令,數(shù)據(jù)處理等錯誤
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler 系統(tǒng)調(diào)用異常,主要是為了調(diào)用操作系統(tǒng)內(nèi)核服務(wù)
DCD DebugMon_Handler ; Debug Monitor Handler 調(diào)試監(jiān)視異常
DCD 0 ; Reserved
;DCD PendSV_Handler ; PendSV Handler 掛起異常,此處可以看見用作了uCOS-II的上下文切換異常,這是被推薦使用的,因為Cortex-M3會在異常發(fā)生時自動保存R0-R3,
; R12,R13(堆棧指針SP),R14(鏈接地址,也叫返回地址LR,在異常返回時使用),R15(程序計數(shù)器PC,為當前應(yīng)用程序+4)和中斷完成時自動回復(fù),
;我們只需保存R4-R11,大大減少了中斷響應(yīng)和上下文切換的時間。
;說明:此處涉及到一個中斷保存寄存器問題:因為在所有的運行模式下,未分組寄存器都指向同一個物理寄存器,他們未被系統(tǒng)用作特殊的用途,因此,在中斷或者異常處理進行模式轉(zhuǎn)換
; 時,由于不同模式(此處為"線程"和"特權(quán)")均使用相同的物理寄存器,可能會造成寄存器中數(shù)據(jù)的破壞。這也是常說的"關(guān)鍵代碼段"和"l臨界區(qū)"保護的原因。
;DCD SysTick_Handler ; SysTick Handler 滴答定時器,為操作系統(tǒng)內(nèi)核時鐘
DCD OS_CPU_PendSVHandler
DCD OS_CPU_SysTickHandler