人妻蜜と1~4中文字幕月野定规 ,国产精品成人va在线播放,色优久久久久综合网鬼色,WWW插插插无码视频网站

【ARM】啟動(dòng)文件詳解

在keil軟件中創(chuàng)建ARM工程的時(shí)候,總是在工程看到有startup_xxxx_hd.s(xxxx為芯片型號(hào))這樣一個(gè)文件,該文件為ARM的啟動(dòng)文件。在工程的main函數(shù)執(zhí)行之前的工作就是執(zhí)行啟動(dòng)文件。接下來(lái)就具體剖析一下啟動(dòng)文件的內(nèi)容與工作。


一、堆??臻g的定義

首先,一開(kāi)始啟動(dòng)文件的任務(wù)是對(duì)于棧空間進(jìn)行定義:

Stack_Size EQU 0x400:定義棧的空間大小1024字節(jié)。

AREA STACK, NOINIT, READWRITE, ALIGN=3:STACK為段名,可以隨意命名;NOINIT表示不初始化;READWRITE表示可讀可寫;ALIGN=3表示按照??臻g按照2^3字節(jié)對(duì)齊

Stack_Mem SPACE Stack _Size:開(kāi)辟棧大小1024B并用0填充

__initial_sp:標(biāo)記棧頂?shù)牡刂?/p>

然后是對(duì)于堆空間的定義


Heap_Size EQU 0x200:定義堆大小為512字節(jié)

AREA HEAP, NOINIT, READWRITE, ALIGN=3:HEAP為段名,可以隨意命名;NOINIT表示不初始化;READWRITE表示可讀可寫;ALIGN=3表示按照堆空間按照2^3字節(jié)對(duì)齊

__heap_base:堆空間基址(即起始地址)

Heap_Mem SPACE Heap_Size:開(kāi)辟堆空間512字節(jié),并清0

__heap_limit:堆空間結(jié)束地址

PRESERVE8:設(shè)置這個(gè)文件告訴編譯器鏈接時(shí)堆棧是8字節(jié)對(duì)齊

THUMB:開(kāi)始使用thumb指令模式


二、中斷向量表的定義

在堆棧定義好后,接下來(lái)的工作就是對(duì)于中斷向量表進(jìn)行定義。

1、中斷向量定義的入口,聲明一些變量。

AREA RESET, DATA, READONLY:表示復(fù)位后,中斷向量表映射到地址0

EXPORT __Vectors:聲明全局符號(hào),表示中斷向量表入口地址

EXPORT __Vectors_End:聲明全局符號(hào),中斷向量表結(jié)束地址

EXPORT __Vectors_Size:聲明全局符號(hào),中斷向量表大小

__Vectors DCD __initial_sp ; Top of Stack:表示棧頂?shù)刂?/p>


2、定義中斷的函數(shù)指針了。

Reset_Handler定義的是復(fù)位中斷的函數(shù)指針,NMI_Handler到SysTick_Handler就是內(nèi)核中斷的函數(shù)指針。



然后從WWDG_IRQHandler到WAKEUP_PIN_IRQHandler就是外設(shè)中斷的函數(shù)指針。

最后,__Vectors_End表示中斷向量表結(jié)束。



3、配置中斷向量表。


_Vectors_Size EQU __Vectors_End - __Vectors:計(jì)算中斷向量表的長(zhǎng)度

AREA |.text|, CODE, READONLY:定義為只讀代碼段

Reset_Handler PROC:表示復(fù)位中斷服務(wù)的入口

EXPORT Reset_Handler [WEAK]:這里聲明復(fù)位中斷向量為全局的,可供外部調(diào)用,WEAK標(biāo)記本代碼為備用編譯

IMPORT SystemInit:表示導(dǎo)入systeminit

IMPORT __main:表示導(dǎo)入C庫(kù)中的main標(biāo)號(hào),這個(gè)是C庫(kù)中的內(nèi)容,非我們自己的main函數(shù)

LDR R0, =SystemInit:讓R0等于SystemInit的地址

BLX R0:表示跳到systeminit

LDR R0, =__main:讓R0等于main的地址

BX R0:執(zhí)行l(wèi)ib_init等C庫(kù)的初始化工作,結(jié)束后再進(jìn)入用戶的main函數(shù)

ENDP:結(jié)束


三、虛擬異常處理程序

這里要進(jìn)行說(shuō)明的是[WEAK],weak標(biāo)記說(shuō)明:如果使用這個(gè)備用的函數(shù)(外部文件中沒(méi)有XXX_Handler),這里的B指令用nop替換,讓編譯器忽略,外部找不到任何NMI_Handler函數(shù)時(shí)的警告或錯(cuò)誤。



四、用戶棧和堆初始化的一個(gè)過(guò)程



以上就是ARM啟動(dòng)文件的主要內(nèi)容。