首页 最新 热门 推荐

  • 首页
  • 最新
  • 热门
  • 推荐

嵌入式:STM32的启动(Startup)文件解析

  • 25-02-16 20:40
  • 2853
  • 9739
blog.csdn.net

相关阅读

嵌入式icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/category_12768532.html?spm=1001.2014.3001.5482


        启动文件(Startup File)是嵌入式系统开发中的核心组件之一,它用于初始化系统并为主程序的运行做好准备。在大多数情况下,启动文件是用汇编语言编写的,并且与具体的处理器架构和工具链紧密相关。本文将以startup_stm32f103xe.s文件为例,说明启动文件中做了什么。

1、文件说明

  1. ;******************** (C) COPYRIGHT 2017 STMicroelectronics ********************
  2. ;* File Name : startup_stm32f103xe.s
  3. ;* Author : MCD Application Team
  4. ;* Description : STM32F103xE Devices vector table for MDK-ARM toolchain.
  5. ;* This module performs:
  6. ;* - Set the initial SP
  7. ;* - Set the initial PC == Reset_Handler
  8. ;* - Set the vector table entries with the exceptions ISR address
  9. ;* - Configure the clock system
  10. ;* - Branches to __main in the C library (which eventually
  11. ;* calls main()).
  12. ;* After Reset the Cortex-M3 processor is in Thread mode,
  13. ;* priority is Privileged, and the Stack is set to Main.
  14. ;******************************************************************************
  15. ;* @attention
  16. ;*
  17. ;* Copyright (c) 2017 STMicroelectronics.
  18. ;* All rights reserved.
  19. ;*
  20. ;* This software component is licensed by ST under BSD 3-Clause license,
  21. ;* the "License"; You may not use this file except in compliance with the
  22. ;* License. You may obtain a copy of the License at:
  23. ;* opensource.org/licenses/BSD-3-Clause
  24. ;*
  25. ;******************************************************************************

        根据注释说明,该启动文件用于MDK-ARM工具链,完成以下任务:

  • 设置初始堆栈指针(SP)。
  • 设置初始程序计数器(PC),指向Reset_Handler。
  • 初始化向量表,指定中断和异常处理函数的入口地址。
  • 配置系统时钟。
  • 跳转到 C 库的__main,最终调用用户定义的main()。

        在复位后,Cortex-M3处理器处于线程模式(Thread Mode)、特权级(Privileged),使用主堆栈(Main Stack)。

2、栈开辟

  1. ; Amount of memory (in bytes) allocated for Stack
  2. ; Tailor this value to your application needs
  3. ; <h> Stack Configuration
  4. ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
  5. ; </h>
  6. Stack_Size EQU 0x00000400
  7. AREA STACK, NOINIT, READWRITE, ALIGN=3
  8. Stack_Mem SPACE Stack_Size
  9. __initial_sp

        首先定义了一个名为Stack_Size的常量1024,它表示栈的大小,根据上方的Configuration提示,栈大小按照8字节对齐。

        随后定义了一块名为STACK的内存区域,该区域不需要初始化,可读可写且起始地址按照2^3=8字节对齐。

        接着定义了一个名为Stack_Mem的内存块,其大小为Stack_Size,即1024。

        最后定义标号__initial_sp,代表栈的顶部(栈是从高地址向低地址生长的),该标号表示的地址也是堆栈寄存器(SP)的初始值。

3、堆开辟

  1. ; <h> Heap Configuration
  2. ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
  3. ; </h>
  4. Heap_Size EQU 0x00000200
  5. AREA HEAP, NOINIT, READWRITE, ALIGN=3
  6. __heap_base
  7. Heap_Mem SPACE Heap_Size
  8. __heap_limit

        首先定义了一个名为Heap_Size的常量512,它表示堆的大小,根据上方的Configuration提示,堆大小按照8字节对齐。 

        随后定义了一块名为HEAP的内存区域,该区域不需要初始化,可读可写且起始地址按照2^3=8字节对齐。

        接着定义标号__heap_base,表示堆的起始地址。

        然后定义了一个名为Heap_Mem的内存块,其大小为Heap_Size,即512。

        最后定义标号__heap_limit,表示堆的结束地址。

4、指针对齐和指令集说明

  1. PRESERVE8
  2. THUMB

        PRESERVE8设置了PRES8构建属性,表示栈指针(SP)保持8字节对齐。THUMB表示接下来的指令是THUMB指令。

5、向量表定义

  1. ; Vector Table Mapped to Address 0 at Reset
  2. AREA RESET, DATA, READONLY
  3. EXPORT __Vectors
  4. EXPORT __Vectors_End
  5. EXPORT __Vectors_Size
  6. __Vectors DCD __initial_sp ; Top of Stack
  7. DCD Reset_Handler ; Reset Handler
  8. DCD NMI_Handler ; NMI Handler
  9. DCD HardFault_Handler ; Hard Fault Handler
  10. DCD MemManage_Handler ; MPU Fault Handler
  11. DCD BusFault_Handler ; Bus Fault Handler
  12. DCD UsageFault_Handler ; Usage Fault Handler
  13. DCD 0 ; Reserved
  14. DCD 0 ; Reserved
  15. DCD 0 ; Reserved
  16. DCD 0 ; Reserved
  17. DCD SVC_Handler ; SVCall Handler
  18. DCD DebugMon_Handler ; Debug Monitor Handler
  19. DCD 0 ; Reserved
  20. DCD PendSV_Handler ; PendSV Handler
  21. DCD SysTick_Handler ; SysTick Handler
  22. ; External Interrupts
  23. DCD WWDG_IRQHandler ; Window Watchdog
  24. DCD PVD_IRQHandler ; PVD through EXTI Line detect
  25. DCD TAMPER_IRQHandler ; Tamper
  26. DCD RTC_IRQHandler ; RTC
  27. DCD FLASH_IRQHandler ; Flash
  28. DCD RCC_IRQHandler ; RCC
  29. DCD EXTI0_IRQHandler ; EXTI Line 0
  30. DCD EXTI1_IRQHandler ; EXTI Line 1
  31. DCD EXTI2_IRQHandler ; EXTI Line 2
  32. DCD EXTI3_IRQHandler ; EXTI Line 3
  33. DCD EXTI4_IRQHandler ; EXTI Line 4
  34. DCD DMA1_Channel1_IRQHandler ; DMA1 Channel 1
  35. DCD DMA1_Channel2_IRQHandler ; DMA1 Channel 2
  36. DCD DMA1_Channel3_IRQHandler ; DMA1 Channel 3
  37. DCD DMA1_Channel4_IRQHandler ; DMA1 Channel 4
  38. DCD DMA1_Channel5_IRQHandler ; DMA1 Channel 5
  39. DCD DMA1_Channel6_IRQHandler ; DMA1 Channel 6
  40. DCD DMA1_Channel7_IRQHandler ; DMA1 Channel 7
  41. DCD ADC1_2_IRQHandler ; ADC1 & ADC2
  42. DCD USB_HP_CAN1_TX_IRQHandler ; USB High Priority or CAN1 TX
  43. DCD USB_LP_CAN1_RX0_IRQHandler ; USB Low Priority or CAN1 RX0
  44. DCD CAN1_RX1_IRQHandler ; CAN1 RX1
  45. DCD CAN1_SCE_IRQHandler ; CAN1 SCE
  46. DCD EXTI9_5_IRQHandler ; EXTI Line 9..5
  47. DCD TIM1_BRK_IRQHandler ; TIM1 Break
  48. DCD TIM1_UP_IRQHandler ; TIM1 Update
  49. DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation
  50. DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
  51. DCD TIM2_IRQHandler ; TIM2
  52. DCD TIM3_IRQHandler ; TIM3
  53. DCD TIM4_IRQHandler ; TIM4
  54. DCD I2C1_EV_IRQHandler ; I2C1 Event
  55. DCD I2C1_ER_IRQHandler ; I2C1 Error
  56. DCD I2C2_EV_IRQHandler ; I2C2 Event
  57. DCD I2C2_ER_IRQHandler ; I2C2 Error
  58. DCD SPI1_IRQHandler ; SPI1
  59. DCD SPI2_IRQHandler ; SPI2
  60. DCD USART1_IRQHandler ; USART1
  61. DCD USART2_IRQHandler ; USART2
  62. DCD USART3_IRQHandler ; USART3
  63. DCD EXTI15_10_IRQHandler ; EXTI Line 15..10
  64. DCD RTC_Alarm_IRQHandler ; RTC Alarm through EXTI Line
  65. DCD USBWakeUp_IRQHandler ; USB Wakeup from suspend
  66. DCD TIM8_BRK_IRQHandler ; TIM8 Break
  67. DCD TIM8_UP_IRQHandler ; TIM8 Update
  68. DCD TIM8_TRG_COM_IRQHandler ; TIM8 Trigger and Commutation
  69. DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare
  70. DCD ADC3_IRQHandler ; ADC3
  71. DCD FSMC_IRQHandler ; FSMC
  72. DCD SDIO_IRQHandler ; SDIO
  73. DCD TIM5_IRQHandler ; TIM5
  74. DCD SPI3_IRQHandler ; SPI3
  75. DCD UART4_IRQHandler ; UART4
  76. DCD UART5_IRQHandler ; UART5
  77. DCD TIM6_IRQHandler ; TIM6
  78. DCD TIM7_IRQHandler ; TIM7
  79. DCD DMA2_Channel1_IRQHandler ; DMA2 Channel1
  80. DCD DMA2_Channel2_IRQHandler ; DMA2 Channel2
  81. DCD DMA2_Channel3_IRQHandler ; DMA2 Channel3
  82. DCD DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5
  83. __Vectors_End
  84. __Vectors_Size EQU __Vectors_End - __Vectors

        首先定义了一块名为RESET的内存区域,该区域存储数据且是只读的。 

        随后导出了三个标号__Vectors、__Vectors_End和__Vectors_Size,以便其他文件中引用它们。

         从标号__Vectors开始,使用DCD指令定义了多个中断函数的地址(包括系统内核中断和外部中断两类),可以看出最低地址存放着栈顶的初始化地址即__initial_sp。最后用__Vectors_End标号表示向量表的结束并计算出标号__Vectors_Size的值。

6、定义默认中断函数

  1. AREA |.text|, CODE, READONLY
  2. ; Reset handler
  3. Reset_Handler PROC
  4. EXPORT Reset_Handler [WEAK]
  5. IMPORT __main
  6. IMPORT SystemInit
  7. LDR R0, =SystemInit
  8. BLX R0
  9. LDR R0, =__main
  10. BX R0
  11. ENDP
  12. ; Dummy Exception Handlers (infinite loops which can be modified)
  13. NMI_Handler PROC
  14. EXPORT NMI_Handler [WEAK]
  15. B .
  16. ENDP
  17. HardFault_Handler\
  18. PROC
  19. EXPORT HardFault_Handler [WEAK]
  20. B .
  21. ENDP
  22. MemManage_Handler\
  23. PROC
  24. EXPORT MemManage_Handler [WEAK]
  25. B .
  26. ENDP
  27. BusFault_Handler\
  28. PROC
  29. EXPORT BusFault_Handler [WEAK]
  30. B .
  31. ENDP
  32. UsageFault_Handler\
  33. PROC
  34. EXPORT UsageFault_Handler [WEAK]
  35. B .
  36. ENDP
  37. SVC_Handler PROC
  38. EXPORT SVC_Handler [WEAK]
  39. B .
  40. ENDP
  41. DebugMon_Handler\
  42. PROC
  43. EXPORT DebugMon_Handler [WEAK]
  44. B .
  45. ENDP
  46. PendSV_Handler PROC
  47. EXPORT PendSV_Handler [WEAK]
  48. B .
  49. ENDP
  50. SysTick_Handler PROC
  51. EXPORT SysTick_Handler [WEAK]
  52. B .
  53. ENDP
  54. Default_Handler PROC
  55. EXPORT WWDG_IRQHandler [WEAK]
  56. EXPORT PVD_IRQHandler [WEAK]
  57. EXPORT TAMPER_IRQHandler [WEAK]
  58. EXPORT RTC_IRQHandler [WEAK]
  59. EXPORT FLASH_IRQHandler [WEAK]
  60. EXPORT RCC_IRQHandler [WEAK]
  61. EXPORT EXTI0_IRQHandler [WEAK]
  62. EXPORT EXTI1_IRQHandler [WEAK]
  63. EXPORT EXTI2_IRQHandler [WEAK]
  64. EXPORT EXTI3_IRQHandler [WEAK]
  65. EXPORT EXTI4_IRQHandler [WEAK]
  66. EXPORT DMA1_Channel1_IRQHandler [WEAK]
  67. EXPORT DMA1_Channel2_IRQHandler [WEAK]
  68. EXPORT DMA1_Channel3_IRQHandler [WEAK]
  69. EXPORT DMA1_Channel4_IRQHandler [WEAK]
  70. EXPORT DMA1_Channel5_IRQHandler [WEAK]
  71. EXPORT DMA1_Channel6_IRQHandler [WEAK]
  72. EXPORT DMA1_Channel7_IRQHandler [WEAK]
  73. EXPORT ADC1_2_IRQHandler [WEAK]
  74. EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
  75. EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
  76. EXPORT CAN1_RX1_IRQHandler [WEAK]
  77. EXPORT CAN1_SCE_IRQHandler [WEAK]
  78. EXPORT EXTI9_5_IRQHandler [WEAK]
  79. EXPORT TIM1_BRK_IRQHandler [WEAK]
  80. EXPORT TIM1_UP_IRQHandler [WEAK]
  81. EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
  82. EXPORT TIM1_CC_IRQHandler [WEAK]
  83. EXPORT TIM2_IRQHandler [WEAK]
  84. EXPORT TIM3_IRQHandler [WEAK]
  85. EXPORT TIM4_IRQHandler [WEAK]
  86. EXPORT I2C1_EV_IRQHandler [WEAK]
  87. EXPORT I2C1_ER_IRQHandler [WEAK]
  88. EXPORT I2C2_EV_IRQHandler [WEAK]
  89. EXPORT I2C2_ER_IRQHandler [WEAK]
  90. EXPORT SPI1_IRQHandler [WEAK]
  91. EXPORT SPI2_IRQHandler [WEAK]
  92. EXPORT USART1_IRQHandler [WEAK]
  93. EXPORT USART2_IRQHandler [WEAK]
  94. EXPORT USART3_IRQHandler [WEAK]
  95. EXPORT EXTI15_10_IRQHandler [WEAK]
  96. EXPORT RTC_Alarm_IRQHandler [WEAK]
  97. EXPORT USBWakeUp_IRQHandler [WEAK]
  98. EXPORT TIM8_BRK_IRQHandler [WEAK]
  99. EXPORT TIM8_UP_IRQHandler [WEAK]
  100. EXPORT TIM8_TRG_COM_IRQHandler [WEAK]
  101. EXPORT TIM8_CC_IRQHandler [WEAK]
  102. EXPORT ADC3_IRQHandler [WEAK]
  103. EXPORT FSMC_IRQHandler [WEAK]
  104. EXPORT SDIO_IRQHandler [WEAK]
  105. EXPORT TIM5_IRQHandler [WEAK]
  106. EXPORT SPI3_IRQHandler [WEAK]
  107. EXPORT UART4_IRQHandler [WEAK]
  108. EXPORT UART5_IRQHandler [WEAK]
  109. EXPORT TIM6_IRQHandler [WEAK]
  110. EXPORT TIM7_IRQHandler [WEAK]
  111. EXPORT DMA2_Channel1_IRQHandler [WEAK]
  112. EXPORT DMA2_Channel2_IRQHandler [WEAK]
  113. EXPORT DMA2_Channel3_IRQHandler [WEAK]
  114. EXPORT DMA2_Channel4_5_IRQHandler [WEAK]
  115. WWDG_IRQHandler
  116. PVD_IRQHandler
  117. TAMPER_IRQHandler
  118. RTC_IRQHandler
  119. FLASH_IRQHandler
  120. RCC_IRQHandler
  121. EXTI0_IRQHandler
  122. EXTI1_IRQHandler
  123. EXTI2_IRQHandler
  124. EXTI3_IRQHandler
  125. EXTI4_IRQHandler
  126. DMA1_Channel1_IRQHandler
  127. DMA1_Channel2_IRQHandler
  128. DMA1_Channel3_IRQHandler
  129. DMA1_Channel4_IRQHandler
  130. DMA1_Channel5_IRQHandler
  131. DMA1_Channel6_IRQHandler
  132. DMA1_Channel7_IRQHandler
  133. ADC1_2_IRQHandler
  134. USB_HP_CAN1_TX_IRQHandler
  135. USB_LP_CAN1_RX0_IRQHandler
  136. CAN1_RX1_IRQHandler
  137. CAN1_SCE_IRQHandler
  138. EXTI9_5_IRQHandler
  139. TIM1_BRK_IRQHandler
  140. TIM1_UP_IRQHandler
  141. TIM1_TRG_COM_IRQHandler
  142. TIM1_CC_IRQHandler
  143. TIM2_IRQHandler
  144. TIM3_IRQHandler
  145. TIM4_IRQHandler
  146. I2C1_EV_IRQHandler
  147. I2C1_ER_IRQHandler
  148. I2C2_EV_IRQHandler
  149. I2C2_ER_IRQHandler
  150. SPI1_IRQHandler
  151. SPI2_IRQHandler
  152. USART1_IRQHandler
  153. USART2_IRQHandler
  154. USART3_IRQHandler
  155. EXTI15_10_IRQHandler
  156. RTC_Alarm_IRQHandler
  157. USBWakeUp_IRQHandler
  158. TIM8_BRK_IRQHandler
  159. TIM8_UP_IRQHandler
  160. TIM8_TRG_COM_IRQHandler
  161. TIM8_CC_IRQHandler
  162. ADC3_IRQHandler
  163. FSMC_IRQHandler
  164. SDIO_IRQHandler
  165. TIM5_IRQHandler
  166. SPI3_IRQHandler
  167. UART4_IRQHandler
  168. UART5_IRQHandler
  169. TIM6_IRQHandler
  170. TIM7_IRQHandler
  171. DMA2_Channel1_IRQHandler
  172. DMA2_Channel2_IRQHandler
  173. DMA2_Channel3_IRQHandler
  174. DMA2_Channel4_5_IRQHandler
  175. B .
  176. ENDP
  177. ALIGN

        首先定义了一块名为.text的内存区域,该区域存储代码且是只读的。 

6.1、复位中断函数

  1. ; Reset handler
  2. Reset_Handler PROC
  3. EXPORT Reset_Handler [WEAK]
  4. IMPORT __main
  5. IMPORT SystemInit
  6. LDR R0, =SystemInit
  7. BLX R0
  8. LDR R0, =__main
  9. BX R0
  10. ENDP

        定义了一个名为Reset_Handler的标号,PROC表示这是一个过程(即函数),随后Reset_Handler标号被导出并被标记为弱标号,即如果没有在其他地方提供Reset_Handler,则会使用这里定义的弱定义。两个IMPORT语句表示__main和SystemInit标号来自于其他文件,随后使用LDR和BLX指令配合,跳转执行SystemInit函数,它是一个系统初始化函数,在system_stm32f1xx.c中定义,用于配置硬件(如时钟、外设等)。最后跳转执行__main函数,它是一个C库函数,它用于初始化程序的各个段和寄存器,并最终执行用户定义的main函数。其中BX指令不会保存当前PC,即__main函数不会返回。

6.2、其他系统内核中断函数

  1. ; Dummy Exception Handlers (infinite loops which can be modified)
  2. NMI_Handler PROC
  3. EXPORT NMI_Handler [WEAK]
  4. B .
  5. ENDP
  6. HardFault_Handler\
  7. PROC
  8. EXPORT HardFault_Handler [WEAK]
  9. B .
  10. ENDP
  11. MemManage_Handler\
  12. PROC
  13. EXPORT MemManage_Handler [WEAK]
  14. B .
  15. ENDP
  16. BusFault_Handler\
  17. PROC
  18. EXPORT BusFault_Handler [WEAK]
  19. B .
  20. ENDP
  21. UsageFault_Handler\
  22. PROC
  23. EXPORT UsageFault_Handler [WEAK]
  24. B .
  25. ENDP
  26. SVC_Handler PROC
  27. EXPORT SVC_Handler [WEAK]
  28. B .
  29. ENDP
  30. DebugMon_Handler\
  31. PROC
  32. EXPORT DebugMon_Handler [WEAK]
  33. B .
  34. ENDP
  35. PendSV_Handler PROC
  36. EXPORT PendSV_Handler [WEAK]
  37. B .
  38. ENDP
  39. SysTick_Handler PROC
  40. EXPORT SysTick_Handler [WEAK]
  41. B .
  42. ENDP

        其他的系统内核中断函数的函数定义都是一个无限循环B .,开发者需要在其他地方为这些函数提供实际的实现。

6.3、外部中断函数

  1. Default_Handler PROC
  2. EXPORT WWDG_IRQHandler [WEAK]
  3. EXPORT PVD_IRQHandler [WEAK]
  4. EXPORT TAMPER_IRQHandler [WEAK]
  5. EXPORT RTC_IRQHandler [WEAK]
  6. EXPORT FLASH_IRQHandler [WEAK]
  7. EXPORT RCC_IRQHandler [WEAK]
  8. EXPORT EXTI0_IRQHandler [WEAK]
  9. EXPORT EXTI1_IRQHandler [WEAK]
  10. EXPORT EXTI2_IRQHandler [WEAK]
  11. EXPORT EXTI3_IRQHandler [WEAK]
  12. EXPORT EXTI4_IRQHandler [WEAK]
  13. EXPORT DMA1_Channel1_IRQHandler [WEAK]
  14. EXPORT DMA1_Channel2_IRQHandler [WEAK]
  15. EXPORT DMA1_Channel3_IRQHandler [WEAK]
  16. EXPORT DMA1_Channel4_IRQHandler [WEAK]
  17. EXPORT DMA1_Channel5_IRQHandler [WEAK]
  18. EXPORT DMA1_Channel6_IRQHandler [WEAK]
  19. EXPORT DMA1_Channel7_IRQHandler [WEAK]
  20. EXPORT ADC1_2_IRQHandler [WEAK]
  21. EXPORT USB_HP_CAN1_TX_IRQHandler [WEAK]
  22. EXPORT USB_LP_CAN1_RX0_IRQHandler [WEAK]
  23. EXPORT CAN1_RX1_IRQHandler [WEAK]
  24. EXPORT CAN1_SCE_IRQHandler [WEAK]
  25. EXPORT EXTI9_5_IRQHandler [WEAK]
  26. EXPORT TIM1_BRK_IRQHandler [WEAK]
  27. EXPORT TIM1_UP_IRQHandler [WEAK]
  28. EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
  29. EXPORT TIM1_CC_IRQHandler [WEAK]
  30. EXPORT TIM2_IRQHandler [WEAK]
  31. EXPORT TIM3_IRQHandler [WEAK]
  32. EXPORT TIM4_IRQHandler [WEAK]
  33. EXPORT I2C1_EV_IRQHandler [WEAK]
  34. EXPORT I2C1_ER_IRQHandler [WEAK]
  35. EXPORT I2C2_EV_IRQHandler [WEAK]
  36. EXPORT I2C2_ER_IRQHandler [WEAK]
  37. EXPORT SPI1_IRQHandler [WEAK]
  38. EXPORT SPI2_IRQHandler [WEAK]
  39. EXPORT USART1_IRQHandler [WEAK]
  40. EXPORT USART2_IRQHandler [WEAK]
  41. EXPORT USART3_IRQHandler [WEAK]
  42. EXPORT EXTI15_10_IRQHandler [WEAK]
  43. EXPORT RTC_Alarm_IRQHandler [WEAK]
  44. EXPORT USBWakeUp_IRQHandler [WEAK]
  45. EXPORT TIM8_BRK_IRQHandler [WEAK]
  46. EXPORT TIM8_UP_IRQHandler [WEAK]
  47. EXPORT TIM8_TRG_COM_IRQHandler [WEAK]
  48. EXPORT TIM8_CC_IRQHandler [WEAK]
  49. EXPORT ADC3_IRQHandler [WEAK]
  50. EXPORT FSMC_IRQHandler [WEAK]
  51. EXPORT SDIO_IRQHandler [WEAK]
  52. EXPORT TIM5_IRQHandler [WEAK]
  53. EXPORT SPI3_IRQHandler [WEAK]
  54. EXPORT UART4_IRQHandler [WEAK]
  55. EXPORT UART5_IRQHandler [WEAK]
  56. EXPORT TIM6_IRQHandler [WEAK]
  57. EXPORT TIM7_IRQHandler [WEAK]
  58. EXPORT DMA2_Channel1_IRQHandler [WEAK]
  59. EXPORT DMA2_Channel2_IRQHandler [WEAK]
  60. EXPORT DMA2_Channel3_IRQHandler [WEAK]
  61. EXPORT DMA2_Channel4_5_IRQHandler [WEAK]
  62. WWDG_IRQHandler
  63. PVD_IRQHandler
  64. TAMPER_IRQHandler
  65. RTC_IRQHandler
  66. FLASH_IRQHandler
  67. RCC_IRQHandler
  68. EXTI0_IRQHandler
  69. EXTI1_IRQHandler
  70. EXTI2_IRQHandler
  71. EXTI3_IRQHandler
  72. EXTI4_IRQHandler
  73. DMA1_Channel1_IRQHandler
  74. DMA1_Channel2_IRQHandler
  75. DMA1_Channel3_IRQHandler
  76. DMA1_Channel4_IRQHandler
  77. DMA1_Channel5_IRQHandler
  78. DMA1_Channel6_IRQHandler
  79. DMA1_Channel7_IRQHandler
  80. ADC1_2_IRQHandler
  81. USB_HP_CAN1_TX_IRQHandler
  82. USB_LP_CAN1_RX0_IRQHandler
  83. CAN1_RX1_IRQHandler
  84. CAN1_SCE_IRQHandler
  85. EXTI9_5_IRQHandler
  86. TIM1_BRK_IRQHandler
  87. TIM1_UP_IRQHandler
  88. TIM1_TRG_COM_IRQHandler
  89. TIM1_CC_IRQHandler
  90. TIM2_IRQHandler
  91. TIM3_IRQHandler
  92. TIM4_IRQHandler
  93. I2C1_EV_IRQHandler
  94. I2C1_ER_IRQHandler
  95. I2C2_EV_IRQHandler
  96. I2C2_ER_IRQHandler
  97. SPI1_IRQHandler
  98. SPI2_IRQHandler
  99. USART1_IRQHandler
  100. USART2_IRQHandler
  101. USART3_IRQHandler
  102. EXTI15_10_IRQHandler
  103. RTC_Alarm_IRQHandler
  104. USBWakeUp_IRQHandler
  105. TIM8_BRK_IRQHandler
  106. TIM8_UP_IRQHandler
  107. TIM8_TRG_COM_IRQHandler
  108. TIM8_CC_IRQHandler
  109. ADC3_IRQHandler
  110. FSMC_IRQHandler
  111. SDIO_IRQHandler
  112. TIM5_IRQHandler
  113. SPI3_IRQHandler
  114. UART4_IRQHandler
  115. UART5_IRQHandler
  116. TIM6_IRQHandler
  117. TIM7_IRQHandler
  118. DMA2_Channel1_IRQHandler
  119. DMA2_Channel2_IRQHandler
  120. DMA2_Channel3_IRQHandler
  121. DMA2_Channel4_5_IRQHandler
  122. B .
  123. ENDP

        定义了一个名为Default_Handler的标号,PROC表示这是一个过程(即函数),外部中断函数的标号被导出并被标记为弱标号,它们表示的地址实际上就是Default_Handler函数的地址,如果没有在其他地方对这些外部中断函数进行实现,依旧是会进入无限循环B .。

7、堆栈初始化函数

  1. ALIGN
  2. ;*******************************************************************************
  3. ; User Stack and Heap initialization
  4. ;*******************************************************************************
  5. IF :DEF:__MICROLIB
  6. EXPORT __initial_sp
  7. EXPORT __heap_base
  8. EXPORT __heap_limit
  9. ELSE
  10. IMPORT __use_two_region_memory
  11. EXPORT __user_initial_stackheap
  12. __user_initial_stackheap
  13. LDR R0, = Heap_Mem
  14. LDR R1, = (Stack_Mem + Stack_Size)
  15. LDR R2, = (Heap_Mem + Heap_Size)
  16. LDR R3, = Stack_Mem
  17. BX LR
  18. ALIGN
  19. ENDIF
  20. END

        ALIGN表示将当前位置对齐到4字节。随后是一段条件编译的代码,如果定义了__MICROLIB宏,则将标号__initial_sp、__heap_base和__heap_limit导出;否则导入__use_two_region_memory标号并导出__user_initial_stackheap标号,其中在R0寄存器保存了堆起始地址,R1寄存器保存了栈顶地址,R2保存了堆结束地址,R3保存了栈的地址。最后跳转到标号LR处继续执行且不返回。

        定义__MICROLIB可以通过Option选项卡进行,如图1所示。

图1 使用微库选项

联系请注明来意
QQ名片
注:本文转载自blog.csdn.net的日晨难再的文章"https://blog.csdn.net/weixin_45791458/article/details/142907328"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接
复制链接
相关推荐
发表评论
登录后才能发表评论和回复 注册

/ 登录

评论记录:

未查询到任何数据!
回复评论:

分类栏目

后端 (14832) 前端 (14280) 移动开发 (3760) 编程语言 (3851) Java (3904) Python (3298) 人工智能 (10119) AIGC (2810) 大数据 (3499) 数据库 (3945) 数据结构与算法 (3757) 音视频 (2669) 云原生 (3145) 云平台 (2965) 前沿技术 (2993) 开源 (2160) 小程序 (2860) 运维 (2533) 服务器 (2698) 操作系统 (2325) 硬件开发 (2492) 嵌入式 (2955) 微软技术 (2769) 软件工程 (2056) 测试 (2865) 网络空间安全 (2948) 网络与通信 (2797) 用户体验设计 (2592) 学习和成长 (2593) 搜索 (2744) 开发工具 (7108) 游戏 (2829) HarmonyOS (2935) 区块链 (2782) 数学 (3112) 3C硬件 (2759) 资讯 (2909) Android (4709) iOS (1850) 代码人生 (3043) 阅读 (2841)

热门文章

124
嵌入式
关于我们 隐私政策 免责声明 联系我们
Copyright © 2020-2025 蚁人论坛 (iYenn.com) All Rights Reserved.
Scroll to Top