基于keil的嵌入式代码启动过程
一般来讲,基于我本人的认知,keil工程新建时,需要导入基于MCU芯片的“.s”文件。它就是keil默认的,用来启动整个嵌入式系统的汇编文件
以STM32F4xx为例,启动过程包括了:堆栈空间定义、中断向量表、复位中断函数、其他中断服务函数、库函数初始化
1、堆栈空间定义
栈大小定义 0x400,即1024字节
Stack_Size EQU 0x00000400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
堆大小定义 0x200,即512字节
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
它们的空间由SPACE关键字来申请,并记作Stack_Mem和Heap_Mem;还定义了三个标号:__initial_sp(栈顶)、__heap_base(堆起始地址)和__heap_limit(堆终止地址)
2、中断向量表
由DCD申请空间存放的一个个函数入口,即中断向量表。
关键字DCD代表申请一个字的空间,后面的函数名即为中断服务函数入口地址;断向量表一般存放在Flash 0地址。
__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 WWDG_IRQHandler ; Window WatchDog
DCD PVD_IRQHandler ; PVD through EXTI Line detection
DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler