1. 项目概述
"ARM 启动!!!"这个标题背后隐藏着嵌入式开发中最基础也最关键的环节——启动代码的实现。作为一名在嵌入式领域摸爬滚打多年的工程师,我深知启动代码就像电子设备的"第一声啼哭",它决定了后续所有功能能否正常运转。而点亮LED这个看似简单的操作,实际上是验证启动代码是否正常工作的"Hello World"。
在ARM架构的嵌入式系统中,启动代码需要完成从硬件上电到C语言环境准备的全过程。这包括设置异常向量表、初始化堆栈指针、配置时钟系统、初始化内存控制器等关键步骤。只有当这些底层工作都正确完成后,我们才能放心地进入main()函数,开始实现像点亮LED这样的应用层功能。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 启动代码深度解析
2.1 异常向量表配置
ARM处理器的启动始于异常向量表。这个表位于内存的最开始位置(通常是0x00000000),包含了各种异常处理程序的入口地址。当发生复位、中断或其他异常时,处理器会自动跳转到对应的向量地址。
assembly复制AREA RESET, CODE, READONLY
ENTRY
Vectors
LDR PC, Reset_Addr
LDR PC, Undefined_Addr
LDR PC, SWI_Addr
LDR PC, Prefetch_Addr
LDR PC, Abort_Addr
NOP ; Reserved vector
LDR PC, IRQ_Addr
LDR PC, FIQ_Addr
Reset_Addr DCD Reset_Handler
Undefined_Addr DCD Undefined_Handler
SWI_Addr DCD SWI_Handler
Prefetch_Addr DCD Prefetch_Handler
Abort_Addr DCD Abort_Handler
IRQ_Addr DCD IRQ_Handler
FIQ_Addr DCD FIQ_Handler
注意:向量表中的每个条目必须严格按ARM架构规范排列。即使某些异常处理程序暂时用不到,也要保留位置并指向一个空循环或错误处理程序。
2.2 堆栈初始化
在进入C语言环境前,必须为不同的处理器模式设置堆栈指针。ARM处理器有多种运行模式(如用户模式、IRQ模式、FIQ模式等),每种模式都需要独立的堆栈空间。
assembly复制Reset_Handler
; 设置不同模式的堆栈指针
MSR CPSR_c, #0xD1 ; 进入FIQ模式
LDR SP, =FIQ_Stack_Top
MSR CPSR_c, #0xD2 ; 进入IRQ模式
LDR SP, =IRQ_Stack_Top
MSR CPSR_c, #0xD3 ; 进入管理模式
LDR SP, =SVC_Stack_Top
MSR CPSR_c, #0xD7 ; 进入中止模式
LDR SP, =Abort_Stack_Top
MSR CPSR_c, #0xDB ; 进入未定义模式
LDR SP, =Unde
