ARMv8-M Star/M33 POR后如何跳转到第一段指令执行?
关键词:Star、VTOR、ld、Reset等等。
Star从POR到第一段汇编代码流程解释
给Star上电(即POR)或者复位后,是如何跳转到第一段汇编开始执行的,这里给出解释。中间涉及到ARMv8-M Star架构特性以及软件编译相关内容。
1 关于Star架构VTOR和Exception Entry介绍
VTOR寄存器中保存了异常向量表首地址,每个异常向量大小为一个32bit指针,指向异常处理函数。并且VTOR的默认值为0x00000000,并且为128字节对齐。
不同的异常类型排序如下,其中Reset是Star复位异常的入口处理函数,异常号为1,即VTOR指向的第二个处理函数。
所以当Star复位后,PC会指向VTOR第二个成员所指向的处理函数。
2 VTOR相关编译特性
为了和VTOR默认值0x00000000保持一致,且IROM首地址为0x00000000,所以所以__isr_vector必须放在BootRom开始位置。
ENTRY(Reset_Handler) SECTIONS { .text : { KEEP(*(.isr_vector)) *(.text*) ... } > IROM ... }
代码中定义.isr_vector段:
.section .isr_vector .align 2 .globl __isr_vector __isr_vector: .long __StackTop /* Top of Stack */ .long Reset_Handler /* 1. Reset Handler */ .long NMI_Handler /* 2. NMI Handler */ .long HardFault_Handler /* 3. Hard Fault Handler */ .long MemManage_Handler /* 4. MPU Fault Handler */ .long BusFault_Handler /* 5. Bus Fault Handler */ ... .size __isr_vector, . - __isr_vector
3 跳转流程
根据以上编译ld和代码得出编译反汇编结果:
Disassembly of section .text: 00000000 <__isr_vector>: 0: 2003fff0 .word 0x2003fff0--StackTop 4: 00001ef9 .word 0x00001ef9--Reset 8: 0000022d .word 0x0000022d--NMI c: 00000239 .word 0x00000239--HardFault 10: 0000025d .word 0x0000025d--MemManage 14: 0000028d .word 0x0000028d--BusFault 18: 000002c1 .word 0x000002c1--UsageFault
可以看出__isr_vector位于0地址,和VTOR默认值的指向吻合。
查看编译结果map文件:
0000022d 0000000c T NMI_Handler 00000239 00000024 T HardFault_Handler 00001ef9 0000005c T Reset_Handler 2003fff0 B __StackTop
可以看出地址0x00001ef9对应的符号为Reset_Handler。
所以当复位发生后,Star会进行如下处理:
- 根据VTOR初始值0x00000000,找到__isr_vector异常向量表。
- 由于异常类型为Reset,跳转到__isr_vector第二个成员,即地址0x00001ef9。
- 进入Reset_Handler执行汇编程序。
联系方式:arnoldlu@qq.com