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

【ARM】啟動文件詳解

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


一、堆棧空間的定義

首先,一開始啟動文件的任務是對于棧空間進行定義:

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

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

Stack_Mem SPACE Stack _Size:開辟棧大小1024B并用0填充

__initial_sp:標記棧頂?shù)牡刂?/p>

然后是對于堆空間的定義


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

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

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

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

__heap_limit:堆空間結束地址

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

THUMB:開始使用thumb指令模式


二、中斷向量表的定義

在堆棧定義好后,接下來的工作就是對于中斷向量表進行定義。

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

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

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

EXPORT __Vectors_End:聲明全局符號,中斷向量表結束地址

EXPORT __Vectors_Size:聲明全局符號,中斷向量表大小

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


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

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



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

最后,__Vectors_End表示中斷向量表結束。



3、配置中斷向量表。


_Vectors_Size EQU __Vectors_End - __Vectors:計算中斷向量表的長度

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

Reset_Handler PROC:表示復位中斷服務的入口

EXPORT Reset_Handler [WEAK]:這里聲明復位中斷向量為全局的,可供外部調用,WEAK標記本代碼為備用編譯

IMPORT SystemInit:表示導入systeminit

IMPORT __main:表示導入C庫中的main標號,這個是C庫中的內容,非我們自己的main函數(shù)

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

BLX R0:表示跳到systeminit

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

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

ENDP:結束


三、虛擬異常處理程序

這里要進行說明的是[WEAK],weak標記說明:如果使用這個備用的函數(shù)(外部文件中沒有XXX_Handler),這里的B指令用nop替換,讓編譯器忽略,外部找不到任何NMI_Handler函數(shù)時的警告或錯誤。



四、用戶棧和堆初始化的一個過程



以上就是ARM啟動文件的主要內容。