1. 基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器軟件接口標準。
2. CMSIS標準的文件結構:
a) core_cm.c (stdint.h)
b) system_.c (core_cm, system_)
c) startup_.s
其中core_cm.c以及core_cm中為內核設訪問層,其中定義了定義了內核中得外設幾丁質以及一些內核的訪問及控制函數(shù)。
startup_.s文件是系統(tǒng)的啟動文件,其包括堆和棧的初始化配置、中斷向量表的配置以及將程序引導到main()函數(shù)等功能。
system_和system_.c文件則是由ARM公司提供模版,各芯片制造商根據(jù)自己芯片的特點來編寫的。
3. 注解startup_.s文件
此文件主要完成三項工作:堆棧以及堆的初始化、定位中斷向量表、調用Reset Handler
a) 堆棧以及堆的初始化
; Stack Configuration
; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
Stack_Size EQU 0x00000200
//指明8字節(jié)對齊(ALIGN=3)
Stack_Mem SPACE Stack_Size
__initial_sp //此標號有一層隱含的意思那就是在M3中堆棧是滿遞減堆棧,
//因為它指定了堆棧指針位于堆棧的高地址(在//Stack_Mem之后)
; Heap Configuration
; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
;
Heap_Size EQU 0x00000000
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
以上堆和棧的具體地址可以在工程編譯后產生的*.map文件中看到。
b) 定位中斷向量表
PRESERVE8 //PRESERVE8指定了以下的代碼位8字節(jié)對齊
THUMB //THUMB指定了接下來的代碼為THUMB指令集
; Vector Table Mapped to Address 0 at Reset
//導出向量表標號,EXPORT作用類似于C語言中的extern
__Vectors
c) 調用Reset Handler
; Reset Handler
Reset_Handler
PROC
注釋:引導程序進入__main(此__main是C_Library中的函數(shù),非main())
d) 堆棧以及堆的初始化行為
; User Initial Stack & Heap
__user_initial_stackheap
e) ARM m3 C是怎么調用startup.s文件的?
startup.s大部分內容不是被C調用的,而是在C程序之前運行的。m3上電之后會先從0地址處讀取MSP,然后從0x4地址處讀取復位向量,接著跳轉到復位異常服務程序Reset_Handler(這些是m3內核自動做的,不需要編程)。如果你用MDK的話,在工程設置Debug下的run to main()上的勾去掉,然后進入調試,你會發(fā)現(xiàn)你運行的第一句就是Reset_Handler的第一句。
Reset_Handler就是在startup.s中定義的,它一般會對系統(tǒng)初始化,然后進入main函數(shù)。
向量表也是在startup.s中定義的,至于為什么程序編譯之后向量表一定在0地址處,是因為向量表的前面會有類似AREA RESET, CODE, READONLY的聲明。在MDK生成的分散加載文件中,RESET被設置在flash的0地址處,這樣就規(guī)定了向量表的地址。