青青av-亚洲激情一区二区-欧洲色综合-看片网址国产福利av中文字幕-成人精品毛片-亚洲黄色免费观看-国产夫妻在线观看-69av电影-久久性片-中文字幕av影片-色综合久久久久无码专区

【ARM】啟動文件詳解

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


一、堆棧空間的定義

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

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

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

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

__initial_sp:標記棧頂的地址

然后是對于堆空間的定義


Heap_Size EQU 0x200:定義堆大小為512字節

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

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

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

__heap_limit:堆空間結束地址

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

THUMB:開始使用thumb指令模式


二、中斷向量表的定義

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

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

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

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

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

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

__Vectors DCD __initial_sp ; Top of Stack:表示棧頂地址


2、定義中斷的函數指針了。

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



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

最后,__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函數

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

BLX R0:表示跳到systeminit

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

BX R0:執行lib_init等C庫的初始化工作,結束后再進入用戶的main函數

ENDP:結束


三、虛擬異常處理程序

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



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



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


主站蜘蛛池模板: 青铜峡市| 浦江县| 昭觉县| 张北县| 莱芜市| 梅河口市| 彭山县| 皋兰县| 朔州市| 彩票| 高要市| 土默特右旗| 杭州市| 鲁甸县| 滦平县| 福海县| 东海县| 虎林市| 康乐县| 万山特区| 固安县| 巴林右旗| 尼木县| 京山县| 大石桥市| 星座| 苏尼特右旗| 栖霞市| 清远市| 高清| 开原市| 郸城县| 岐山县| 武隆县| 太谷县| 秀山| 沈阳市| 调兵山市| 汝州市| 莱芜市| 长白|