LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

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执行汇编程序。 

posted on 2022-04-26 09:35  ArnoldLu  阅读(309)  评论(0编辑  收藏  举报

导航