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