1. 基本概念(CMSIS): Cortex Micro-controller Software Interface Standard,微控制器軟件接口標(biāo)準(zhǔn)。
2. CMSIS標(biāo)準(zhǔn)的文件結(jié)構(gòu):
a) core_cm
b) system_
c) startup_
其中core_cm
startup_
system_
3. 注解startup_
此文件主要完成三項(xiàng)工作:堆棧以及堆的初始化、定位中斷向量表、調(diào)用Reset Handler
a) 堆棧以及堆的初始化
; ?
;
Stack_Size ? ? ? ? EQU ? ?? 0x00000200
AREA ? ? STACK, NOINIT, READWRITE, ALIGN=3 ?
//指明8字節(jié)對(duì)齊(ALIGN=3)
Stack_Mem SPACE ?? Stack_Size
__initial_sp ? ? ? //此標(biāo)號(hào)有一層隱含的意思那就是在M3中堆棧是滿遞減堆 ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? ? ? ?? //棧,因?yàn)樗付硕褩V羔樜挥诙褩5母叩刂罚ㄔ?//Stack_Mem之后)
;
; ?
;
Heap_Size ? ? ?? EQU ? ?? 0x00000000
AREA ? ? HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem ? ? ?? SPACE Heap_Size
__heap_limit
以上堆和棧的具體地址可以在工程編譯后產(chǎn)生的*.map文件中看到。
b) 定位中斷向量表
PRESERVE8 ??
//PRESERVE8指定了以下的代碼位8字節(jié)對(duì)齊
THUMB
//THUMB指定了接下來(lái)的代碼為THUMB指令集
; Vector Table Mapped to Address 0 at Reset
AREA ? ?RESET, DATA, READONLY
//此語(yǔ)句聲明RESET數(shù)據(jù)段
EXPORT ?__Vectors
//導(dǎo)出向量表標(biāo)號(hào),EXPORT作用類似于C語(yǔ)言中的extern
__Vectors ? ? ??
DCD ? ? __initial_sp ? ? ? ? ? ? ? ? ? ? ? ; Top of Stack
DCD ? ? Reset_Handler ? ? ? ? ? ?? ; Reset Handler
DCD ? ? NMI_Handler ? ? ? ? ? ? ?? ; NMI Handler
DCD ? ? HardFault_Handler ? ? ? ?? ; Hard Fault Handler
DCD ? ? MemManage_Handler ? ? ? ?? ; MPU Fault Handler
DCD ? ? BusFault_Handler ? ? ? ? ? ; Bus Fault Handler
DCD ? ? UsageFault_Handler ? ? ? ? ; Usage Fault Handler
DCD ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ?? ; Reserved
DCD ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ?? ; Reserved
DCD ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ?? ; Reserved
DCD ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ?? ; Reserved
DCD ? ? SVC_Handler ? ? ? ? ? ? ?? ; SVCall Handler
DCD ? ? DebugMon_Handler ? ? ? ? ? ; Debug Monitor Handler
DCD ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ?? ; Reserved
DCD ? ? PendSV_Handler ? ? ? ? ? ? ; PendSV Handler
DCD ? ? SysTick_Handler ? ? ? ? ?? ; SysTick Handler
; External Interrupts
DCD ? ? WDT_IRQHandler ? ? ? ? ? ? ; 16: Watchdog Timer
DCD ? ? TIMER0_IRQHandler ? ? ? ?? ; 17: Timer0
DCD ? ? TIMER1_IRQHandler ? ? ? ?? ; 18: Timer1
DCD ? ? TIMER2_IRQHandler ? ? ? ?? ; 19: Timer2
DCD ? ? TIMER3_IRQHandler ? ? ? ?? ; 20: Timer3
DCD ? ? UART0_IRQHandler ? ? ? ? ? ; 21: UART0
(……省略)
c) 調(diào)用Reset Handler
; Reset Handler
Reset_Handler ??
PROC
EXPORT ?Reset_Handler ? ? ? ? ? ? [WEAK]
IMPORT ?SystemInit
IMPORT ?__main
LDR ? ? R0, =SystemInit
BLX ? ? R0
LDR ? ? R0, =__main
BX ? ? ?R0
ENDP
注釋:引導(dǎo)程序進(jìn)入__main(此__main是C_Library中的函數(shù),非main())
d) 其他的代碼
這段代碼是NXP公司的LPC1700系列的MCU特有的一段代碼,其他公司的Cortex-M3 MCU的啟動(dòng)程序是沒有這段代碼的。
這段代碼是指定LPC1700的CRP加密級(jí)別的代碼段,芯片上電后會(huì)自動(dòng)讀取這一地址的值以確定加密方式,其中CRP_Key = 0xffffffff為不加密(0級(jí)加密),CRP_Key = 0x12345678為1級(jí)加密,CRP_Key = 0x87654321為2級(jí)加密,CRP_Key = 0x43218765為3級(jí)加密(最高級(jí)加密),3級(jí)加密將會(huì)禁止所有的ISP指令,也就是說(shuō),芯片將不能讀寫、不能擦除。
IF ? ?? :LNOT::DEF:NO_CRP
AREA ? ? |.ARM.__at_0x02FC|, CODE, READONLY
CRP_Key ? ? ? ??
DCD ? ?? 0xFFFFFFFF
ENDIF
AREA ? ? |.text|, CODE, READONLY
e)?堆棧以及堆的初始化行為
; User Initial Stack & Heap
IF ? ? ? :DEF:__MICROLIB
EXPORT ?__initial_sp
EXPORT ?__heap_base
EXPORT ?__heap_limit
ELSE
IMPORT ?__use_two_region_memory
EXPORT ?__user_initial_stackheap
__user_initial_stackheap
LDR ? ?? R0, = ?Heap_Mem
LDR ? ?? R1, = (Stack_Mem + Stack_Size)
LDR ? ?? R2, = (Heap_Mem + ?Heap_Size)
LDR ? ?? R3, = Stack_Mem
BX ? ? ? LR
評(píng)論
查看更多