ARM--cortex m3的startup.s启动文件详细解析

/**
*************** © COPYRIGHT 2017 Tsinghua University ************************

  • @file startup.s
  • @author Tsinghua
  • @brief

*/

.syntax unified
.arch   armv7-m;使用统一语法的ARMv7--M3
.cpu    cortex-m3
.fpu    softvfp;软件浮点单元
.thumb;使用Thum;指令集

.global g_pfnVectors: ;声明 g_pfnVectors 作为一个全局符号,通常用于中断向量表。
.global Default_Handler: ;声明 Default_Handler 作为一个全局符号,用于处理未预期的中断。

/* start address for the initialization values of the .data section.
defined in linker script /
.word __sidata
/
start address for the .data section. defined in linker script /
.word __sdata
/
end address for the .data section. defined in linker script /
.word __edata
/
start address for the .bss section. defined in linker script /
.word __sbss
/
end address for the .bss section. defined in linker script */
.word __ebss
/这些符号定义了.data段初始化值的起始地址和结束地址,以及.bss段的起始地址和结束地址。这些通常在链接脚本中定义。/

/**

  • @brief This is the code that gets called when the processor first

  •      starts execution following a reset event. Only the absolutely
    
  •      necessary set is performed, after which the application
    
  •      supplied main() routine is called.
    
  • @param None

  • @retval : None
    */
    复位处理函数 (Reset_Handler)
    这段代码在处理器启动或复位后首先执行。

    .section .text.Reset_Handler
    .weak Reset_Handler
    .type Reset_Handler, %function

Reset_Handler:
cpsid i ; 关闭中断

ldr    r0, =__estack ; 加载栈顶地址
mov    sp, r0       ; 设置栈指针

/* 将数据段的初始化值从flash复制到SRAM */
movs   r1, #0        ; 初始化数据复制索引
b      LoopCopyDataInit ; 跳转到开始复制数据的地方

CopyDataInit:
ldr r3, =__sidata ; 加载flash中初始化值的地址
ldr r3, [r3, r1] ; 从flash中加载数据
str r3, [r0, r1] ; 存储数据到SRAM
adds r1, r1, #4 ; 增加数据复制索引

LoopCopyDataInit:
ldr r0, =__sdata ; 加载.data段的起始地址
ldr r3, =__edata ; 加载.data段的结束地址
adds r2, r0, r1 ; 计算当前要复制的地址
cmp r2, r3 ; 比较当前地址与结束地址
bcc CopyDataInit ; 循环直到所有数据复制完成
ldr r2, =__sbss ; 加载.bss段的起始地址
b LoopFillZerobss ; 跳转到开始清零.bss段的地方

/* 清零bss段 */
FillZerobss:
movs r3, #0 ; 初始化为零
str r3, [r2], #4 ; 存储零并增加地址

LoopFillZerobss:
ldr r3, = __ebss ; 加载.bss段的结束地址
cmp r2, r3 ; 比较当前地址与结束地址
bcc FillZerobss ; 循环直到.bss段清零完成

/* 跳转到C代码 */
bl     main           ; 跳转到main函数
bx     lr             ; 返回到调用者

.size Reset_Handler, .-Reset_Handler

/**

  • @brief This is the code that gets called when the processor receives an
  •     unexpected interrupt.  This simply enters an infinite loop, preserving
    
  •     the system state for examination by a debugger.
    
  • @param None
  • @retval : None
    */
    .section .text.Default_Handler,“ax”,%progbits
    Default_Handler:;默认中断处理函数,当处理器收到未预期的中断时,执行无限循环以保持系统状态。
    Infinite_Loop:
    b Infinite_Loop
    .size Default_Handler, .-Default_Handler

/******************************************************************************
*

  • The minimal vector table for a Cortex M3. Note that the proper constructs
  • must be placed on this to ensure that it ends up at physical address
  • 0x0000.0000.

******************************************************************************/
.section .isr_vector,“a”,%progbits
.type g_pfnVectors, %object
.size g_pfnVectors, .-g_pfnVectors

g_pfnVectors:
.word __estack
.word Reset_Handler
.word NMI_Handler
.word HardFault_Handler
.word MemManage_Handler
.word BusFault_Handler
.word UsageFault_Handler
.word 0
.word 0
.word 0
.word 0
.word SVC_Handler
.word DebugMon_Handler
.word 0
.word PendSV_Handler
.word SysTick_Handler

.word  GPIO_0_IRQHandler /* 00 */
.word  GPIO_1_IRQHandler /* 01 */
.word  GPIO_2_IRQHandler /* 02 */
.word  GPIO_3_IRQHandler /* 03 */
.word  GPIO_4_IRQHandler /* 04 */
.word  GPIO_5_IRQHandler /* 05 */
.word  GPIO_6_IRQHandler /* 06 */
.word  GPIO_7_IRQHandler /* 07 */
.word  GPIO_8_IRQHandler /* 08 */
.word  GPIO_9_IRQHandler /* 09 */
.word  GPIO_10_IRQHandler /* 10 */ 
.word  GPIO_11_IRQHandler /* 11 */
.word  GPIO_12_IRQHandler /* 12 */
.word  GPIO_13_IRQHandler /* 13 */
.word  GPIO_14_IRQHandler /* 14 */
.word  GPIO_15_IRQHandler /* 15 */
.word  RESERVED_IRQHandler /* 16 */
.word  RESERVED_IRQHandler /* 17 */
.word  RESERVED_IRQHandler /* 18 */
.word  RESERVED_IRQHandler /* 19 */
.word  RESERVED_IRQHandler /* 20 */
.word  RESERVED_IRQHandler /* 21 */
.word  RESERVED_IRQHandler /* 22 */
.word  SM2_IRQHandler /* 23 */
.word  RSA_IRQHandler /* 24 */
.word  RESERVED_IRQHandler /* 25 */
.word  RESERVED_IRQHandler /* 26 */
.word  RESERVED_IRQHandler /* 27 */
.word  RESERVED_IRQHandler /* 28 */
.word  RESERVED_IRQHandler /* 29 */
.word  RESERVED_IRQHandler /* 30 */
.word  RESERVED_IRQHandler /* 31 */
.word  RPU_IRQHandler /* 32 */
.word  RESERVED_IRQHandler /* 33 */
.word  RESERVED_IRQHandler /* 34 */
.word  RESERVED_IRQHandler /* 35 */
.word  RESERVED_IRQHandler /* 36 */
.word  RESERVED_IRQHandler /* 37 */
.word  RESERVED_IRQHandler /* 38 */
.word  PCIE_IRQHandler /* 39 */
.word  DMAC_H_IRQHandler /* 40 */
.word  GMII_1_N_IRQHandler /* 41 */
.word  SDIO_IRQHandler /* 42 */
.word  GMII_N_IRQHandler /* 43 */
.word  RTC_IRQHandler /* 44 */
.word  TIMER_1_IRQHandler /* 45 */
.word  TIMER_2_IRQHandler /* 46 */
.word  TIMER_3_IRQHandler /* 47 */
.word  TIMER_4_IRQHandler /* 48 */
.word  TIMER_5_IRQHandler /* 49 */
.word  TIMER_6_IRQHandler /* 50 */
.word  TIMER_7_IRQHandler /* 51 */
.word  TIMER_8_IRQHandler /* 52 */
.word  UART_1_IRQHandler /* 53 */
.word  UART_2_IRQHandler /* 54 */
.word  I2C_1_IRQHandler /* 55 */
.word  RESERVED_IRQHandler /* 56 */
.word  SPI_IRQHandler /* 57 */
.word  RESERVED_IRQHandler /* 58 */
.word  WDT_IRQHandler /* 59 */
.word  GMII_CFP_IRQHandler /* 60 */
.word  I2C_2_IRQHandler /* 61 */
.word  PCIE_CMDQ_IRQHandler /* 62 */
.word  PCIE_MSIX_IRQHandler /* 63 */

/*******************************************************************************
*

  • Provide weak aliases for each Exception handler to the Default_Handler.
  • As they are weak aliases, any function with the same name will override
  • this definition.

*******************************************************************************/

.weak NMI_Handler
.thumb_set NMI_Handler,Default_Handler

.weak HardFault_Handler
.thumb_set HardFault_Handler,Default_Handler

.weak MemManage_Handler
.thumb_set MemManage_Handler,Default_Handler

.weak BusFault_Handler
.thumb_set BusFault_Handler,Default_Handler

.weak UsageFault_Handler
.thumb_set UsageFault_Handler,Default_Handler

.weak SVC_Handler
.thumb_set SVC_Handler,Default_Handler

.weak DebugMon_Handler
.thumb_set DebugMon_Handler,Default_Handler

.weak PendSV_Handler
.thumb_set PendSV_Handler,Default_Handler

.weak SysTick_Handler
.thumb_set SysTick_Handler,Default_Handler

.weak RESERVED_IRQHandler
.thumb_set RESERVED_IRQHandler,Default_Handler

/* 00 */
.weak GPIO_0_IRQHandler
.thumb_set GPIO_0_IRQHandler,Default_Handler
/* 01 */
.weak GPIO_1_IRQHandler
.thumb_set GPIO_1_IRQHandler,Default_Handler	
/* 02 */
.weak GPIO_2_IRQHandler
.thumb_set GPIO_2_IRQHandler,Default_Handler	
/* 03 */
.weak GPIO_3_IRQHandler
.thumb_set GPIO_3_IRQHandler,Default_Handler	
/* 04 */
.weak GPIO_4_IRQHandler
.thumb_set GPIO_4_IRQHandler,Default_Handler	
/* 05 */
.weak GPIO_5_IRQHandler
.thumb_set GPIO_5_IRQHandler,Default_Handler	
/* 06 */
.weak GPIO_6_IRQHandler
.thumb_set GPIO_6_IRQHandler,Default_Handler	
/* 07 */
.weak GPIO_7_IRQHandler
.thumb_set GPIO_7_IRQHandler,Default_Handler	
/* 08 */
.weak GPIO_8_IRQHandler
.thumb_set GPIO_8_IRQHandler,Default_Handler	
/* 09 */
.weak GPIO_9_IRQHandler
.thumb_set GPIO_9_IRQHandler,Default_Handler	
/* 10 */
.weak GPIO_10_IRQHandler
.thumb_set GPIO_10_IRQHandler,Default_Handler	
/* 11 */
.weak GPIO_11_IRQHandler
.thumb_set GPIO_11_IRQHandler,Default_Handler	
/* 12 */
.weak GPIO_12_IRQHandler
.thumb_set GPIO_12_IRQHandler,Default_Handler	
/* 13 */
.weak GPIO_13_IRQHandler
.thumb_set GPIO_13_IRQHandler,Default_Handler	
/* 14 */
.weak GPIO_14_IRQHandler
.thumb_set GPIO_14_IRQHandler,Default_Handler	
/* 15 */
.weak GPIO_15_IRQHandler
.thumb_set GPIO_15_IRQHandler,Default_Handler	
/* 23 */
.weak SM2_IRQHandler
.thumb_set SM2_IRQHandler,Default_Handler	
/* 24 */
.weak RSA_IRQHandler
.thumb_set RSA_IRQHandler,Default_Handler	
/* 25 */
/* 26 */
/* 27 */
/* 28 */
/* 29 */
/* 30 */
/* 31 */
/* 32 */
.weak RPU_IRQHandler
.thumb_set RPU_IRQHandler,Default_Handler	
/* 33 */
/* 34 */
/* 35 */
/* 36 */
/* 37 */
/* 38 */
/* 39 */
.weak PCIE_IRQHandler
.thumb_set PCIE_IRQHandler,Default_Handler	
/* 40 */
.weak DMAC_H_IRQHandler
.thumb_set DMAC_H_IRQHandler,Default_Handler	
/* 41 */
.weak GMII_1_N_IRQHandler
.thumb_set GMII_1_N_IRQHandler,Default_Handler	
/* 42 */
.weak SDIO_IRQHandler
.thumb_set SDIO_IRQHandler,Default_Handler	
/* 43 */
.weak GMII_N_IRQHandler
.thumb_set GMII_N_IRQHandler,Default_Handler	
/* 44 */
.weak RTC_IRQHandler
.thumb_set RTC_IRQHandler,Default_Handler	
/* 45 */
.weak TIMER_1_IRQHandler
.thumb_set TIMER_1_IRQHandler,Default_Handler	
/* 46 */
.weak TIMER_2_IRQHandler
.thumb_set TIMER_2_IRQHandler,Default_Handler	
/* 47 */
.weak TIMER_3_IRQHandler
.thumb_set TIMER_3_IRQHandler,Default_Handler	
/* 48 */
.weak TIMER_4_IRQHandler
.thumb_set TIMER_4_IRQHandler,Default_Handler	
/* 49 */
.weak TIMER_5_IRQHandler
.thumb_set TIMER_5_IRQHandler,Default_Handler	
/* 50 */
.weak TIMER_6_IRQHandler
.thumb_set TIMER_6_IRQHandler,Default_Handler	
/* 51 */
.weak TIMER_7_IRQHandler
.thumb_set TIMER_7_IRQHandler,Default_Handler	
/* 52 */
.weak TIMER_8_IRQHandler
.thumb_set TIMER_8_IRQHandler,Default_Handler	
/* 53 */
.weak UART_1_IRQHandler
.thumb_set UART_1_IRQHandler,Default_Handler	
/* 54 */
.weak UART_2_IRQHandler
.thumb_set UART_2_IRQHandler,Default_Handler	
/* 55 */
.weak I2C_1_IRQHandler
.thumb_set I2C_1_IRQHandler,Default_Handler
/* 56 */
/* 57 */
.weak SPI_IRQHandler
.thumb_set SPI_IRQHandler,Default_Handler	
/* 58 */
/* 59 */
.weak WDT_IRQHandler
.thumb_set WDT_IRQHandler,Default_Handler	
/* 60 */
.weak GMII_CFP_IRQHandler
.thumb_set GMII_CFP_IRQHandler,Default_Handler	
/* 61 */
.weak I2C_2_IRQHandler
.thumb_set I2C_2_IRQHandler,Default_Handler
/* 62 */
.weak PCIE_CMDQ_IRQHandler
.thumb_set PCIE_CMDQ_IRQHandler,Default_Handler	
/* 63 */
.weak PCIE_MSIX_IRQHandler
.thumb_set PCIE_MSIX_IRQHandler,Default_Handler	
  • 8
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

李洛克07

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值