[ARM] Cortex-M Startup.s启动文件相关代码解释

1. 定义一个段名为CSTACK, 这里:

    NOROOT表示如何定义的段没有被关联,那么同意会被优化掉,如果不想被优化掉就使用ROOT.

    后面的括号里数字表示如下:

    (1):这个段是2的1次方即2字节对齐

    (2):这个段是2的2次方即4字节对齐

    (3):这个段是2的3次方即8字节对齐

SECTION CSTACK:DATA:NOROOT(2)

2. 下面代码表示执行后面的指令函数(我理解为函数~),指令函数_iar_program_start和SystemInit为系统定义好的,在C库启动代码中。

    SystemInit:完成系统的初始化,自带的模块,主要是设置系统的时钟。

    __iar_program_start:这个函数是在启动代码中 \arm\src\lib\thumb\下面的代码中找到,是系统自带的启动模块

EXTERN __iar_program_start
EXTERN SystemInit

 

3. PUBLIC 表示导出标号。外部可以使用

   符号 __vector_table 是有特殊意义的,所以必须注意添加进去
    ; The vector table is normally located at address 0.
    ; When debugging in RAM, it can be located in RAM, aligned to at least 2^6.
    ; The name "__vector_table" has special meaning for C-SPY:
    ; it is where the SP start value is found, and the NVIC vector
    ; table register (VTOR) is initialized to this address if != 0.

PUBLIC _vector_table

 

4. 通过 SFE 运算得到改段的结束地址,注意这个运算是在link的时候完成。所以IAR 的处理办法就是先定义一个block作为堆栈区,然后将堆栈指针放到这个block的末端

    剩下的就是各个中断向量

        DATA
__vector_table
        DCD sfe(CSTACK)
        DCD Reset_Handler ; Reset Handler
        ......

 

5. 首先,因为之前是DATA模式,所以这里先切换回THUMB模式。

    PUBWEAK: PUBLIC WEAK

    如果程序员在自己的代码中定义了后面声明的中断处理函数(如这里的NMI_Hander),那么在本文件中系统自带的中断处理函数无效,如果程序员没有自定义,则执行本文件的处理函数。

        THUMB

        PUBWEAK Reset_Handler
        SECTION .text:CODE:REORDER(2)
Reset_Handler
        LDR R0, =SystemInit
        BLX R0
        LDR R0, =__iar_program_start
        BX R0
               
        PUBWEAK NMI_Handler
        SECTION .text:CODE:REORDER(1)
NMI_Handler
        B NMI_Handler

 

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: