ARM啟動過程(Cortex-M3 NXP LPC1768為例)
2. CMSIS標(biāo)準(zhǔn)的文件結(jié)構(gòu):
a) core_cm.c (stdint.h)
b) system_.c (core_cm, system_)
c) startup_.s
其中core_cm.c以及core_cm中為內(nèi)核設(shè)訪問層,其中定義了定義了內(nèi)核中得外設(shè)幾丁質(zhì)以及一些內(nèi)核的訪問及控制函數(shù)。
startup_.s文件是系統(tǒng)的啟動文件,其包括堆和棧的初始化配置、中斷向量表的配置以及將程序引導(dǎo)到main()函數(shù)等功能。
system_和system_.c文件則是由ARM公司提供模版,各芯片制造商根據(jù)自己芯片的特點來編寫的。
3. 注解startup_.s文件
此文件主要完成三項工作:堆棧以及堆的初始化、定位中斷向量表、調(diào)用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 //此標(biāo)號有一層隱含的意思那就是在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
以上堆和棧的具體地址可以在工程編譯后產(chǎn)生的*.map文件中看到。
b) 定位中斷向量表
PRESERVE8
//PRESERVE8指定了以下的代碼位8字節(jié)對齊
THUMB
//THUMB指定了接下來的代碼為THUMB指令集
; Vector Table Mapped to Address 0 at Reset
//此語句聲明RESET數(shù)據(jù)段
//導(dǎo)出向量表標(biāo)號,EXPORT作用類似于C語言中的extern
__Vectors
c) 調(diào)用Reset Handler
; Reset Handler
Reset_Handler
PROC
注釋:引導(dǎo)程序進入__main(此__main是C_Library中的函數(shù),非main())
d) 其他的代碼
這段代碼是NXP公司的LPC1700系列的MCU特有的一段代碼,其他公司的Cortex-M3 MCU的啟動程序是沒有這段代碼的。
這段代碼是指定LPC1700的CRP加密級別的代碼段,芯片上電后會自動讀取這一地址的值以確定加密方式,其中CRP_Key = 0xffffffff為不加密(0級加密),CRP_Key = 0x12345678為1級加密,CRP_Key = 0x87654321為2級加密,CRP_Key = 0x43218765為3級加密(最高級加密),3級加密將會禁止所有的ISP指令,也就是說,芯片將不能讀寫、不能擦除。
CRP_Key
DCD 0xFFFFFFFF
e) 堆棧以及堆的初始化行為
; User Initial Stack & Heap
__user_initial_stackheap
4. ARM啟動工程詳解
評論