01啟動(dòng)文件簡(jiǎn)介
startup_stm32f429_439xx.s是STM32的啟動(dòng)文件。
剛開(kāi)始我一直認(rèn)為STM32程序開(kāi)始執(zhí)行是從main函數(shù)開(kāi)始。后來(lái)網(wǎng)上查查不是。原來(lái)在執(zhí)行main函數(shù)之前,需要先執(zhí)行一段匯編程序和完成C語(yǔ)言資源硬件的初始化工作。就是以下幾個(gè)功能:
1--初始化棧指針MSP=_initial_sp。
2--初始化復(fù)位程序計(jì)數(shù)寄存器值=Reset_Handler。
3--初始化異常/ 中斷向量表。
4--系統(tǒng)時(shí)鐘配置。
5--C庫(kù)函數(shù)_main初始化用戶(hù)堆棧的調(diào)用 。
02文件啟動(dòng)步驟
1-在啟動(dòng)的時(shí)候,先對(duì)堆棧的大小定義,并在代碼區(qū)的起始位置建立異常中斷向量表。然后在復(fù)位中斷中服務(wù)程序中跳轉(zhuǎn)執(zhí)行C標(biāo)準(zhǔn)庫(kù)main函數(shù),以上這些完成后,跳轉(zhuǎn)到主程序中的main函數(shù)執(zhí)行相關(guān)函數(shù)應(yīng)用。但是假如STM32F429單片機(jī)被設(shè)置成從內(nèi)部flash啟動(dòng)的,這時(shí)候,片內(nèi)Flash被映射到程序啟動(dòng)空間,異常/中斷向量表實(shí)際的開(kāi)始地址為0x8000000(查看STM32F4參考手冊(cè)可得到),則棧頂?shù)刂反娣旁?x8000000處,復(fù)位中斷存放在0x8000004處,若STM32F4遇到復(fù)位信號(hào),則從0x8000004處取出復(fù)位中斷服務(wù)入口地址,繼而執(zhí)行中斷服務(wù)函數(shù),繞后跳轉(zhuǎn)到main函數(shù),最終進(jìn)入main函數(shù)。由此我們可以得下面這個(gè)圖:
03啟動(dòng)代碼講解
01棧(Stack)
我們可以在.s這個(gè)文件中看到堆棧信息如圖:
根據(jù)上面的圖片我們可以知道。
在startup_stm32f429_439xx.s文件中,將棧的大小設(shè)為0x00000400(1KB)F429是0x30000(192KB),Stack_Mem為棧名,不初始化可讀可寫(xiě),8字節(jié)對(duì)齊。Stack_Size是棧的大小,__initial_sp表示結(jié)束地址(棧頂?shù)刂?,棧是由高字?jié)向低字節(jié)生長(zhǎng)的)。
棧的主要作用是用于局部變量、函數(shù)調(diào)用、函數(shù)形參的開(kāi)銷(xiāo)大小應(yīng)小于內(nèi)部RAM大小,考慮到局部變量的需求,防止棧溢出。
EQU:宏定義的偽指令,相當(dāng)于等于,類(lèi)似與 C 中的 define;
AREA:告訴匯編器匯編一個(gè)新的代碼段或者數(shù)據(jù)段;
SPACE:用于分配一定大小的內(nèi)存空間,單位為字節(jié);這里的大小等于Stack_Size。
DCD:數(shù)據(jù)定義( Data Definition )偽指令,單位是字(4字節(jié));
偽指令(Pseudo instruction):用于告訴匯編器如何進(jìn)行匯編的指令,不生成可執(zhí)行代碼。
總結(jié)如下圖所示:
02堆(Heap)
在.s54行中如下圖這些代碼:
這些代碼中,堆的大小設(shè)為0x00000200(512B),其中Heap_ Mem是棧名,不初始化,可讀可寫(xiě),8(23)字節(jié)對(duì)齊。Heap_Size為堆的大小, heap_base為堆的起始地址,heap_limit為堆的結(jié)束地址,因?yàn)槎咽怯傻偷刂废蚋叩刂飞L(zhǎng)的。
堆的作用是用于malloc()函數(shù)申請(qǐng)的動(dòng)態(tài)內(nèi)存的分配。
04中斷向量表
PRESERVE8:指定當(dāng)前文件的堆棧按照 8 字節(jié)對(duì)齊THUMB:表示后面指令為 THUMB 指令。THUBM 是 ARM 以前的指令集, 16bit,現(xiàn)在 Cortex-M 系列的都使用 THUMB-2 指令集, THUMB-2 是 32 位的,兼容 16 位和 32 位的指令,是 THUMB 的超級(jí)!
EXPORT:聲明一個(gè)標(biāo)號(hào)具有全局屬性,可被外部的文件使用。如果是 IAR 編譯器,則使用的是 GLOBAL 這個(gè)指令。
——Vectors是異常/中斷向量表的起始位置,_Vectors_End是中斷向量表的結(jié)束位置,vectors__Size中斷向量表的大小。
TM32F42XX/STM32F43XX部分中斷向量表
在中斷向量表中的每一個(gè)位置存儲(chǔ)都是一個(gè)4字節(jié)服務(wù)程序入口地址,如果有中斷請(qǐng)求并且MCU進(jìn)行了請(qǐng)求的響應(yīng),那么MCU就會(huì)找到向量表中找到對(duì)應(yīng)的中斷位置,找到中斷復(fù)位程序入口地址到程序計(jì)數(shù)寄存器,進(jìn)而執(zhí)行中斷。
具體的詳細(xì)中斷向量表請(qǐng)參看數(shù)據(jù)手冊(cè)以及啟動(dòng)文件。
05復(fù)位中斷服務(wù)程序
這句話的意思是定義一個(gè)名為.text代碼段,可讀
復(fù)位中斷服務(wù)程序是系統(tǒng)上電后第一個(gè)執(zhí)行的程序,調(diào)用Systemlnit函數(shù)初始化系統(tǒng)時(shí)鐘,然后調(diào)用C庫(kù)函數(shù)mian,最終調(diào)用 main 函數(shù)進(jìn)入C程序的世界。
LDR:從存儲(chǔ)器加載字到一個(gè)寄存器。
BL:跳轉(zhuǎn)到由寄存器/標(biāo)號(hào)給出的地址,并把跳轉(zhuǎn)前的下條指令地址保存到鏈接寄存器。
BLX:跳轉(zhuǎn)到由寄存器給出的地址,并根據(jù)寄存器的LSE確定處理器的狀態(tài),還要把跳轉(zhuǎn)前的下條指令地址保存到鏈接寄存器。
BX:跳轉(zhuǎn)到由寄存器/標(biāo)號(hào)給出的地址,不用返回。
WEAK:表示弱定義,如果外部文件優(yōu)先定義了該標(biāo)號(hào),則首先引用該標(biāo)號(hào),可以在C語(yǔ)言中重新定義中斷服務(wù)程序;如果在啟動(dòng)文件之外沒(méi)有重新定義中斷服務(wù)程序,則在對(duì)應(yīng)的異常/中斷向量表位置處存儲(chǔ)的是匯編文件定義的中斷服務(wù)程序入口地址。如果在啟動(dòng)文件外,在另外一個(gè)C文件中重新定義了中斷服務(wù)程序,則在對(duì)應(yīng)的異常/中斷向量表位置處存儲(chǔ)的是C文件中的中斷服務(wù)程序入口地址。需要注意的是,啟動(dòng)文件中的中斷服務(wù)程序的名稱(chēng)和C文件中重新定義的中斷服務(wù)程序名稱(chēng)必須保持一致。
IMPORT:表示該標(biāo)號(hào)來(lái)自外部文件,跟C語(yǔ)言中的關(guān)鍵字EXTERN類(lèi)似。這里表示Systemlnit 和main 這兩個(gè)函數(shù)均來(lái)自外部的文件。
Systemlnit是一個(gè)標(biāo)準(zhǔn)的庫(kù)函數(shù),在system_stm32f4xx.c這個(gè)庫(kù)文件中定義,主要作用是配置系統(tǒng)時(shí)鐘,在調(diào)用這個(gè)函數(shù)之后,STM32F429的系統(tǒng)時(shí)鐘被配置為180MHz。
main是一個(gè)標(biāo)準(zhǔn)的C庫(kù)函數(shù),主要作用是初始化用戶(hù)堆棧,最終調(diào)用main函數(shù)進(jìn)入C程序的世界。在C應(yīng)用程序中,必須有一個(gè)main函數(shù)。需要注意的是,_main不是用戶(hù)C程序的main 函數(shù)。
異常和中斷服務(wù)程序
07用戶(hù)堆棧初始化
判斷是否定義了__MICROLIB,如果定義了則賦予標(biāo)號(hào)__initial_sp(棧頂?shù)刂罚_heap_base(堆起始地址)、__heap_limit(堆結(jié)束地址)全局屬性,可供外部文件調(diào)用。如果沒(méi)有定義(實(shí)際的情況就是我們沒(méi)定義__MICROLIB),則使用默認(rèn)的C庫(kù)函數(shù),然后初始化用戶(hù)堆棧大小,這部分由C庫(kù)函數(shù)__main來(lái)完成,當(dāng)初始化完堆棧之后,就調(diào)用main函數(shù)去到C程序的世界。
IF、ELSE、ENDIF:匯編的條件分支語(yǔ)句,跟C語(yǔ)言的if、else類(lèi)似。
-
STM32
+關(guān)注
關(guān)注
2270文章
10895瀏覽量
355721 -
C語(yǔ)言
+關(guān)注
關(guān)注
180文章
7604瀏覽量
136683 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4327瀏覽量
62569 -
啟動(dòng)文件
+關(guān)注
關(guān)注
0文章
15瀏覽量
2222
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論