启动文件分析

1. 简介:

对 stm32f103 工程的分析,需要从启动文件开始

2. 固件库中 stm32f103 的启动文件:

文件的名字:startup_stm32f10xhd.s 

前边是段的声明

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. MODULE  ?cstartup  
  2.       
  3.     ;; Forward declaration of sections.  
  4.     SECTION CSTACK:DATA:NOROOT(3)  
  5.   
  6.     SECTION .intvec:CODE:NOROOT(2)  
  7.   
  8.     EXTERN  __iar_program_start  
  9.     EXTERN  SystemInit          
  10.     PUBLIC  __vector_table  


【1】MODULE 控制指令是用来标记 modules 源码的开始和结束,后边的 ?cstartup 是模块的名字,此文档的最后的 END 表明模块的结束

【2】SECTION 指令是声明段,一个段不能同时包含 public symbol 和 pubweak symbol ,模块只有在相同的名字的模块没有被链接进来的时候才会被链接进来。

    语法格式:SECTION section:type [flag] [(align)]

        align,是用于指定地址对齐到 2^align,他的取值是 0 到 30

        flag,取值NOROOT、ROOT、REORDER、NOREORDER,默认是ROOT,NOROOT表示如果这个段中的符号没有被引用,将会被连接器舍弃,即可被优化。ROOT表示不可被优化。REORDER表示开始一个新的名字是 section 的段(section),NOREORDER表示开始一个新的名字为 section 的片段(fragment),多个片段组成一个段(section)

        type,memory 的类型,取值是 CODE、CONST、DATA

        section,段的名字

【3】EXTERN 用导入其他模块的 symbol(符号)

【4】PUBLIC 导出 symbol(符号)


[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. DATA  
  2.   
  3. _table  
  4. DCD     sfe(CSTACK)  
  5. DCD     Reset_Handler             ; Reset Handler  
  6. DCD     NMI_Handler               ; NMI Handler  
  7. DCD     HardFault_Handler         ; Hard Fault Handler  
  8. DCD     MemManage_Handler         ; MPU Fault Handler  
  9. DCD     BusFault_Handler          ; Bus Fault Handler  
  10. DCD     UsageFault_Handler        ; Usage Fault Handler  
  11. DCD     0                         ; Reserved  
  12. DCD     0                         ; Reserved  
  13. DCD     0                         ; Reserved  
  14. DCD     0                         ; Reserved  
  15. DCD     SVC_Handler               ; SVCall Handler  
  16. DCD     DebugMon_Handler          ; Debug Monitor Handler  
  17. DCD     0                         ; Reserved  
  18. DCD     PendSV_Handler            ; PendSV Handler  
  19. DCD     SysTick_Handler           ; SysTick Handler  
  20.   
  21.  ; External Interrupts  
  22. DCD     WWDG_IRQHandler           ; Window Watchdog  
  23. DCD     PVD_IRQHandler            ; PVD through EXTI Line detect  
  24. DCD     TAMPER_IRQHandler         ; Tamper  
  25. DCD     RTC_IRQHandler            ; RTC  
  26. DCD     FLASH_IRQHandler          ; Flash  
  27. DCD     RCC_IRQHandler            ; RCC  
  28. DCD     EXTI0_IRQHandler          ; EXTI Line 0  
  29. DCD     EXTI1_IRQHandler          ; EXTI Line 1  
  30. DCD     EXTI2_IRQHandler          ; EXTI Line 2  
  31. DCD     EXTI3_IRQHandler          ; EXTI Line 3  
  32. DCD     EXTI4_IRQHandler          ; EXTI Line 4  
  33. DCD     DMA1_Channel1_IRQHandler  ; DMA1 Channel 1  
  34. DCD     DMA1_Channel2_IRQHandler  ; DMA1 Channel 2  
  35. DCD     DMA1_Channel3_IRQHandler  ; DMA1 Channel 3  
  36. DCD     DMA1_Channel4_IRQHandler  ; DMA1 Channel 4  
  37. DCD     DMA1_Channel5_IRQHandler  ; DMA1 Channel 5  
  38. DCD     DMA1_Channel6_IRQHandler  ; DMA1 Channel 6  
  39. DCD     DMA1_Channel7_IRQHandler  ; DMA1 Channel 7  
  40. DCD     ADC1_2_IRQHandler         ; ADC1 & ADC2  
  41. DCD     USB_HP_CAN1_TX_IRQHandler  ; USB High Priority or CAN1 TX  
  42. DCD     USB_LP_CAN1_RX0_IRQHandler ; USB Low  Priority or CAN1 RX0  
  43. DCD     CAN1_RX1_IRQHandler       ; CAN1 RX1  
  44. DCD     CAN1_SCE_IRQHandler       ; CAN1 SCE  
  45. DCD     EXTI9_5_IRQHandler        ; EXTI Line 9..5  
  46. DCD     TIM1_BRK_IRQHandler       ; TIM1 Break  
  47. DCD     TIM1_UP_IRQHandler        ; TIM1 Update  
  48. DCD     TIM1_TRG_COM_IRQHandler   ; TIM1 Trigger and Commutation  
  49. DCD     TIM1_CC_IRQHandler        ; TIM1 Capture Compare  
  50. DCD     TIM2_IRQHandler           ; TIM2  
  51. DCD     TIM3_IRQHandler           ; TIM3  
  52. DCD     TIM4_IRQHandler           ; TIM4  
  53. DCD     I2C1_EV_IRQHandler        ; I2C1 Event  
  54. DCD     I2C1_ER_IRQHandler        ; I2C1 Error  
  55. DCD     I2C2_EV_IRQHandler        ; I2C2 Event  
  56. DCD     I2C2_ER_IRQHandler        ; I2C2 Error  
  57. DCD     SPI1_IRQHandler           ; SPI1  
  58. DCD     SPI2_IRQHandler           ; SPI2  
  59. DCD     USART1_IRQHandler         ; USART1  
  60. DCD     USART2_IRQHandler         ; USART2  
  61. DCD     USART3_IRQHandler         ; USART3  
  62. DCD     EXTI15_10_IRQHandler      ; EXTI Line 15..10  
  63. DCD     RTCAlarm_IRQHandler       ; RTC Alarm through EXTI Line  
  64. DCD     USBWakeUp_IRQHandler      ; USB Wakeup from suspend  
  65. DCD     TIM8_BRK_IRQHandler       ; TIM8 Break  
  66. DCD     TIM8_UP_IRQHandler        ; TIM8 Update  
  67. DCD     TIM8_TRG_COM_IRQHandler   ; TIM8 Trigger and Commutation  
  68. DCD     TIM8_CC_IRQHandler        ; TIM8 Capture Compare  
  69. DCD     ADC3_IRQHandler           ; ADC3  
  70. DCD     FSMC_IRQHandler           ; FSMC  
  71. DCD     SDIO_IRQHandler           ; SDIO  
  72. DCD     TIM5_IRQHandler           ; TIM5  
  73. DCD     SPI3_IRQHandler           ; SPI3  
  74. DCD     UART4_IRQHandler          ; UART4  
  75. DCD     UART5_IRQHandler          ; UART5  
  76. DCD     TIM6_IRQHandler           ; TIM6  
  77. DCD     TIM7_IRQHandler           ; TIM7  
  78. DCD     DMA2_Channel1_IRQHandler  ; DMA2 Channel1  
  79. DCD     DMA2_Channel2_IRQHandler  ; DMA2 Channel2  
  80. DCD     DMA2_Channel3_IRQHandler  ; DMA2 Channel3  
  81. DCD     DMA2_Channel4_5_IRQHandler ; DMA2 Channel4 & Channel5  
  82. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;  
【1】DATA 表示下边中的标签是 32 位的标签,THUMB 表示下边的标签是 16 位的标签,所谓的标签是 地址的别名,不占用代码空间,给编译器看的

【2】 DCD 是数据定义或者 重定位指令,为的是定义一个值,或者保留 memory,DCD 别名是 DC32,用于声明一个 32 位的常量,这部分是中断向量表的内容,需要注意的是,他们的顺序不能改变,此部分会放到 flash 的最开始部分,当系统启动的时候会加载前另个地址,第一个地址是 c 程序的栈的栈顶地址,第二个地址是向量表的开始地址,中断发生时会根据向量表的首地址和偏移量来找到程序的入口

【3】sfe 指令作用是返回栈的结尾,因为栈的增长方向是反方向的

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. ;;  
  2. ;; Default interrupt handlers.  
  3. ;;  
  4.         THUMB  
  5.   
  6.         PUBWEAK Reset_Handler  
  7.         SECTION .text:CODE:REORDER(2)  
  8. Reset_Handler  
  9.         LDR     R0, =SystemInit  
  10.         BLX     R0  
  11.         LDR     R0, =__iar_program_start  
  12.         BX      R0  
  13.                  
  14.         PUBWEAK NMI_Handler  
  15.         SECTION .text:CODE:REORDER(1)  
  16. NMI_Handler  
  17.         B NMI_Handler  
  18.   
  19.         PUBWEAK HardFault_Handler  
  20.         SECTION .text:CODE:REORDER(1)  
  21. HardFault_Handler  
  22.         B HardFault_Handler  
  23.   
  24.         PUBWEAK MemManage_Handler  
  25.         SECTION .text:CODE:REORDER(1)  
  26. MemManage_Handler  
  27.         B MemManage_Handler  
  28.   
  29.         PUBWEAK BusFault_Handler  
  30.         SECTION .text:CODE:REORDER(1)  
  31. BusFault_Handler  
  32.         B BusFault_Handler  
  33.   
  34.         PUBWEAK UsageFault_Handler  
  35.         SECTION .text:CODE:REORDER(1)  
  36. UsageFault_Handler  
  37.         B UsageFault_Handler  
  38.   
  39.         PUBWEAK SVC_Handler  
  40.         SECTION .text:CODE:REORDER(1)  
  41. SVC_Handler  
  42.         B SVC_Handler  
  43.   
  44.         PUBWEAK DebugMon_Handler  
  45.         SECTION .text:CODE:REORDER(1)  
  46. DebugMon_Handler  
  47.         B DebugMon_Handler  
  48.   
  49.         PUBWEAK PendSV_Handler  
  50.         SECTION .text:CODE:REORDER(1)  
  51. PendSV_Handler  
  52.         B PendSV_Handler  
  53.   
  54.         PUBWEAK SysTick_Handler  
  55.         SECTION .text:CODE:REORDER(1)  
  56. SysTick_Handler  
  57.         B SysTick_Handler  
  58.   
  59.         PUBWEAK WWDG_IRQHandler  
  60.         SECTION .text:CODE:REORDER(1)  
  61. WWDG_IRQHandler  
  62.         B WWDG_IRQHandler  
  63.   
  64.         PUBWEAK PVD_IRQHandler  
  65.         SECTION .text:CODE:REORDER(1)  
  66. PVD_IRQHandler  
  67.         B PVD_IRQHandler  
  68.   
  69.         PUBWEAK TAMPER_IRQHandler  
  70.         SECTION .text:CODE:REORDER(1)  
  71. TAMPER_IRQHandler  
  72.         B TAMPER_IRQHandler  
  73.   
  74.         PUBWEAK RTC_IRQHandler  
  75.         SECTION .text:CODE:REORDER(1)  
  76. RTC_IRQHandler  
  77.         B RTC_IRQHandler  
  78.   
  79.         PUBWEAK FLASH_IRQHandler  
  80.         SECTION .text:CODE:REORDER(1)  
  81. FLASH_IRQHandler  
  82.         B FLASH_IRQHandler  
  83.   
  84.         PUBWEAK RCC_IRQHandler  
  85.         SECTION .text:CODE:REORDER(1)  
  86. RCC_IRQHandler  
  87.         B RCC_IRQHandler  
  88.   
  89.         PUBWEAK EXTI0_IRQHandler  
  90.         SECTION .text:CODE:REORDER(1)  
  91. EXTI0_IRQHandler  
  92.         B EXTI0_IRQHandler  
  93.   
  94.         PUBWEAK EXTI1_IRQHandler  
  95.         SECTION .text:CODE:REORDER(1)  
  96. EXTI1_IRQHandler  
  97.         B EXTI1_IRQHandler  
  98.   
  99.         PUBWEAK EXTI2_IRQHandler  
  100.         SECTION .text:CODE:REORDER(1)  
  101. EXTI2_IRQHandler  
  102.         B EXTI2_IRQHandler  
  103.   
  104.         PUBWEAK EXTI3_IRQHandler  
  105.         SECTION .text:CODE:REORDER(1)  
  106. EXTI3_IRQHandler  
  107.         B EXTI3_IRQHandler  
  108.   
  109.         PUBWEAK EXTI4_IRQHandler  
  110.         SECTION .text:CODE:REORDER(1)  
  111. EXTI4_IRQHandler  
  112.         B EXTI4_IRQHandler  
  113.   
  114.         PUBWEAK DMA1_Channel1_IRQHandler  
  115.         SECTION .text:CODE:REORDER(1)  
  116. DMA1_Channel1_IRQHandler  
  117.         B DMA1_Channel1_IRQHandler  
  118.   
  119.         PUBWEAK DMA1_Channel2_IRQHandler  
  120.         SECTION .text:CODE:REORDER(1)  
  121. DMA1_Channel2_IRQHandler  
  122.         B DMA1_Channel2_IRQHandler  
  123.   
  124.         PUBWEAK DMA1_Channel3_IRQHandler  
  125.         SECTION .text:CODE:REORDER(1)  
  126. DMA1_Channel3_IRQHandler  
  127.         B DMA1_Channel3_IRQHandler  
  128.   
  129.         PUBWEAK DMA1_Channel4_IRQHandler  
  130.         SECTION .text:CODE:REORDER(1)  
  131. DMA1_Channel4_IRQHandler  
  132.         B DMA1_Channel4_IRQHandler  
  133.   
  134.         PUBWEAK DMA1_Channel5_IRQHandler  
  135.         SECTION .text:CODE:REORDER(1)  
  136. DMA1_Channel5_IRQHandler  
  137.         B DMA1_Channel5_IRQHandler  
  138.   
  139.         PUBWEAK DMA1_Channel6_IRQHandler  
  140.         SECTION .text:CODE:REORDER(1)  
  141. DMA1_Channel6_IRQHandler  
  142.         B DMA1_Channel6_IRQHandler  
  143.   
  144.         PUBWEAK DMA1_Channel7_IRQHandler  
  145.         SECTION .text:CODE:REORDER(1)  
  146. DMA1_Channel7_IRQHandler  
  147.         B DMA1_Channel7_IRQHandler  
  148.   
  149.         PUBWEAK ADC1_2_IRQHandler  
  150.         SECTION .text:CODE:REORDER(1)  
  151. ADC1_2_IRQHandler  
  152.         B ADC1_2_IRQHandler  
  153.   
  154.         PUBWEAK USB_HP_CAN1_TX_IRQHandler  
  155.         SECTION .text:CODE:REORDER(1)  
  156. USB_HP_CAN1_TX_IRQHandler  
  157.         B USB_HP_CAN1_TX_IRQHandler  
  158.   
  159.         PUBWEAK USB_LP_CAN1_RX0_IRQHandler  
  160.         SECTION .text:CODE:REORDER(1)  
  161. USB_LP_CAN1_RX0_IRQHandler  
  162.         B USB_LP_CAN1_RX0_IRQHandler  
  163.   
  164.         PUBWEAK CAN1_RX1_IRQHandler  
  165.         SECTION .text:CODE:REORDER(1)  
  166. CAN1_RX1_IRQHandler  
  167.         B CAN1_RX1_IRQHandler  
  168.   
  169.         PUBWEAK CAN1_SCE_IRQHandler  
  170.         SECTION .text:CODE:REORDER(1)  
  171. CAN1_SCE_IRQHandler  
  172.         B CAN1_SCE_IRQHandler  
  173.   
  174.         PUBWEAK EXTI9_5_IRQHandler  
  175.         SECTION .text:CODE:REORDER(1)  
  176. EXTI9_5_IRQHandler  
  177.         B EXTI9_5_IRQHandler  
  178.   
  179.         PUBWEAK TIM1_BRK_IRQHandler  
  180.         SECTION .text:CODE:REORDER(1)  
  181. TIM1_BRK_IRQHandler  
  182.         B TIM1_BRK_IRQHandler  
  183.   
  184.         PUBWEAK TIM1_UP_IRQHandler  
  185.         SECTION .text:CODE:REORDER(1)  
  186. TIM1_UP_IRQHandler  
  187.         B TIM1_UP_IRQHandler  
  188.   
  189.         PUBWEAK TIM1_TRG_COM_IRQHandler  
  190.         SECTION .text:CODE:REORDER(1)  
  191. TIM1_TRG_COM_IRQHandler  
  192.         B TIM1_TRG_COM_IRQHandler  
  193.   
  194.         PUBWEAK TIM1_CC_IRQHandler  
  195.         SECTION .text:CODE:REORDER(1)  
  196. TIM1_CC_IRQHandler  
  197.         B TIM1_CC_IRQHandler  
  198.   
  199.         PUBWEAK TIM2_IRQHandler  
  200.         SECTION .text:CODE:REORDER(1)  
  201. TIM2_IRQHandler  
  202.         B TIM2_IRQHandler  
  203.   
  204.         PUBWEAK TIM3_IRQHandler  
  205.         SECTION .text:CODE:REORDER(1)  
  206. TIM3_IRQHandler  
  207.         B TIM3_IRQHandler  
  208.   
  209.         PUBWEAK TIM4_IRQHandler  
  210.         SECTION .text:CODE:REORDER(1)  
  211. TIM4_IRQHandler  
  212.         B TIM4_IRQHandler  
  213.   
  214.         PUBWEAK I2C1_EV_IRQHandler  
  215.         SECTION .text:CODE:REORDER(1)  
  216. I2C1_EV_IRQHandler  
  217.         B I2C1_EV_IRQHandler  
  218.   
  219.         PUBWEAK I2C1_ER_IRQHandler  
  220.         SECTION .text:CODE:REORDER(1)  
  221. I2C1_ER_IRQHandler  
  222.         B I2C1_ER_IRQHandler  
  223.   
  224.         PUBWEAK I2C2_EV_IRQHandler  
  225.         SECTION .text:CODE:REORDER(1)  
  226. I2C2_EV_IRQHandler  
  227.         B I2C2_EV_IRQHandler  
  228.   
  229.         PUBWEAK I2C2_ER_IRQHandler  
  230.         SECTION .text:CODE:REORDER(1)  
  231. I2C2_ER_IRQHandler  
  232.         B I2C2_ER_IRQHandler  
  233.   
  234.         PUBWEAK SPI1_IRQHandler  
  235.         SECTION .text:CODE:REORDER(1)  
  236. SPI1_IRQHandler  
  237.         B SPI1_IRQHandler  
  238.   
  239.         PUBWEAK SPI2_IRQHandler  
  240.         SECTION .text:CODE:REORDER(1)  
  241. SPI2_IRQHandler  
  242.         B SPI2_IRQHandler  
  243.   
  244.         PUBWEAK USART1_IRQHandler  
  245.         SECTION .text:CODE:REORDER(1)  
  246. USART1_IRQHandler  
  247.         B USART1_IRQHandler  
  248.   
  249.         PUBWEAK USART2_IRQHandler  
  250.         SECTION .text:CODE:REORDER(1)  
  251. USART2_IRQHandler  
  252.         B USART2_IRQHandler  
  253.   
  254.         PUBWEAK USART3_IRQHandler  
  255.         SECTION .text:CODE:REORDER(1)  
  256. USART3_IRQHandler  
  257.         B USART3_IRQHandler  
  258.   
  259.         PUBWEAK EXTI15_10_IRQHandler  
  260.         SECTION .text:CODE:REORDER(1)  
  261. EXTI15_10_IRQHandler  
  262.         B EXTI15_10_IRQHandler  
  263.   
  264.         PUBWEAK RTCAlarm_IRQHandler  
  265.         SECTION .text:CODE:REORDER(1)  
  266. RTCAlarm_IRQHandler  
  267.         B RTCAlarm_IRQHandler  
  268.   
  269.         PUBWEAK USBWakeUp_IRQHandler  
  270.         SECTION .text:CODE:REORDER(1)  
  271. USBWakeUp_IRQHandler  
  272.         B USBWakeUp_IRQHandler  
  273.   
  274.         PUBWEAK TIM8_BRK_IRQHandler  
  275.         SECTION .text:CODE:REORDER(1)  
  276. TIM8_BRK_IRQHandler  
  277.         B TIM8_BRK_IRQHandler  
  278.   
  279.         PUBWEAK TIM8_UP_IRQHandler  
  280.         SECTION .text:CODE:REORDER(1)  
  281. TIM8_UP_IRQHandler  
  282.         B TIM8_UP_IRQHandler  
  283.   
  284.         PUBWEAK TIM8_TRG_COM_IRQHandler  
  285.         SECTION .text:CODE:REORDER(1)  
  286. TIM8_TRG_COM_IRQHandler  
  287.         B TIM8_TRG_COM_IRQHandler  
  288.   
  289.         PUBWEAK TIM8_CC_IRQHandler  
  290.         SECTION .text:CODE:REORDER(1)  
  291. TIM8_CC_IRQHandler  
  292.         B TIM8_CC_IRQHandler  
  293.   
  294.         PUBWEAK ADC3_IRQHandler  
  295.         SECTION .text:CODE:REORDER(1)  
  296. ADC3_IRQHandler  
  297.         B ADC3_IRQHandler  
  298.   
  299.         PUBWEAK FSMC_IRQHandler  
  300.         SECTION .text:CODE:REORDER(1)  
  301. FSMC_IRQHandler  
  302.         B FSMC_IRQHandler  
  303.   
  304.         PUBWEAK SDIO_IRQHandler  
  305.         SECTION .text:CODE:REORDER(1)  
  306. SDIO_IRQHandler  
  307.         B SDIO_IRQHandler  
  308.   
  309.         PUBWEAK TIM5_IRQHandler  
  310.         SECTION .text:CODE:REORDER(1)  
  311. TIM5_IRQHandler  
  312.         B TIM5_IRQHandler  
  313.   
  314.         PUBWEAK SPI3_IRQHandler  
  315.         SECTION .text:CODE:REORDER(1)  
  316. SPI3_IRQHandler  
  317.         B SPI3_IRQHandler  
  318.   
  319.         PUBWEAK UART4_IRQHandler  
  320.         SECTION .text:CODE:REORDER(1)  
  321. UART4_IRQHandler  
  322.         B UART4_IRQHandler  
  323.   
  324.         PUBWEAK UART5_IRQHandler  
  325.         SECTION .text:CODE:REORDER(1)  
  326. UART5_IRQHandler  
  327.         B UART5_IRQHandler  
  328.   
  329.         PUBWEAK TIM6_IRQHandler  
  330.         SECTION .text:CODE:REORDER(1)  
  331. TIM6_IRQHandler  
  332.         B TIM6_IRQHandler  
  333.   
  334.         PUBWEAK TIM7_IRQHandler  
  335.         SECTION .text:CODE:REORDER(1)  
  336. TIM7_IRQHandler  
  337.         B TIM7_IRQHandler  
  338.   
  339.         PUBWEAK DMA2_Channel1_IRQHandler  
  340.         SECTION .text:CODE:REORDER(1)  
  341. DMA2_Channel1_IRQHandler  
  342.         B DMA2_Channel1_IRQHandler  
  343.   
  344.         PUBWEAK DMA2_Channel2_IRQHandler  
  345.         SECTION .text:CODE:REORDER(1)  
  346. DMA2_Channel2_IRQHandler  
  347.         B DMA2_Channel2_IRQHandler  
  348.   
  349.         PUBWEAK DMA2_Channel3_IRQHandler  
  350.         SECTION .text:CODE:REORDER(1)  
  351. DMA2_Channel3_IRQHandler  
  352.         B DMA2_Channel3_IRQHandler  
  353.   
  354.         PUBWEAK DMA2_Channel4_5_IRQHandler  
  355.         SECTION .text:CODE:REORDER(1)  
  356. DMA2_Channel4_5_IRQHandler  
  357.         B DMA2_Channel4_5_IRQHandler  
  358.           
  359.           
  360.         END  

【1】THUMB 表明下边是 thumb 指令

【2】Reset_Handler 在开机或者复位的时候执行

    R0 = SystemInit

    跳转到 SystemInit 函数,并将处理器切换到 thumb 状态

    R0 = __iar_program_start

    跳转到 __iar_program_start 函数,状态也是切换到 thumb 状态

【3】此处的 __iar_program_start 在程序中找不到是因为它已经被封装到了 IAR 自带的C库启动代码中了,当我们编译的时候,在项目属性的 linker,library中勾选了 Automatic runtime library ,就告诉了编译器用库中的 __iar_program_start ,具体实现了什么,我们可以查看 IAR 工具为我们提供的源码,具体路径在 IAR 安装目录下的 arm\src\lib\thumb ,我们可以看到有的文件分别的提供了 汇编代码和 c 代码。

其中的 cstartup_M.s 文件中有

[cpp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #pragma required=__vector_table  
  2. void __iar_program_start( void )  
  3. {  
  4.   __iar_init_core();  
  5.   __iar_init_vfp();  
  6.   __cmain();  
  7. }  

【1】此段的程序中前两个函数是弱函数,在工程共没有定义

【2】__cmain 函数作用是初始化段和底层硬件,最后调用main


至此,库文件中的启动文件先分析到这里


3. FreeRTOS 中的汇编代码:

当 FreeRTOS 和 stm32 移植好后,会用到 FreeRTOS 中的源码文件 portasm.s 中的函数

xPortPendSVHandler 函数:

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. xPortPendSVHandler:  
  2.     mrs r0, psp  
  3.     isb  
  4.     ldr r3, =pxCurrentTCB  /* 获取当前任务的控制块(TCB)指针. */  
  5.     ldr r2, [r3]  
  6.   
  7.     stmdb r0!, {r4-r11}  /* 保存 R4-R11 到该任务的堆栈. */  
  8.     str r0, [r2]         /* 将最后的堆栈指针保存到任务控制块的 pxTopOfStack. */  
  9.   
  10.     stmdb sp!, {r3, r14}  
  11.     mov r0, #configMAX_SYSCALL_INTERRUPT_PRIORITY /* 关闭中断 */  
  12.     msr basepri, r0  
  13.     dsb  
  14.     isb  
  15.     bl vTaskSwitchContext /* 切换任务上下文,pxCurrentTCB 已指向新的任务 */  
  16.     mov r0, #0  
  17.     msr basepri, r0  
  18.     ldmia sp!, {r3, r14}  
  19.   
  20.     ldr r1, [r3]  /* 恢复新任务的上下文到各寄存器 */  
  21.     ldr r0, [r1]        /* The first item in pxCurrentTCB is the task top of stack. */  
  22.     ldmia r0!, {r4-r11} /* Pop the registers. */  
  23.     msr psp, r0  
  24.     isb  
  25.     bx r14  

【1】这个函数的功能是请求切换任务

【2】任务切换的示意图如下:


vPortSVCHandler 函数:直接切换任务用于vPortStartFirstTask第一次启动任务时初始化堆栈和各寄存器

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. vPortSVCHandler:  
  2.     /* Get the location of the current TCB. */  
  3.     ldr r3, =pxCurrentTCB  
  4.     ldr r1, [r3]  
  5.     ldr r0, [r1]  
  6.     /* Pop the core registers. */  
  7.     ldmia r0!, {r4-r11}  
  8.     msr psp, r0  
  9.     isb  
  10.     mov r0, #0  
  11.     msr basepri, r0  
  12.     orr r14, r14, #13  
  13.     bx r14  


函数:启动第一个任务的汇编实现

[plain]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. vPortStartFirstTask  
  2.     /* Use the NVIC offset register to locate the stack. */  
  3.     ldr r0, =0xE000ED08 /* 向量表偏移量寄存器 (VTOR) */  
  4.     ldr r0, [r0]  
  5.     ldr r0, [r0]  
  6.     /* Set the msp back to the start of the stack. */  
  7.     msr msp, r0 /* 将堆栈地址保存到主堆栈指针msp中 */  
  8.     /* Call SVC to start the first task, ensuring interrupts are enabled. */  
  9.     cpsie i /* 触发SVC软中断,由vPortSVCHandler()完成第一个任务的具体切换工作 */  
  10.     cpsie f  
  11.     dsb  
  12.     isb  
  13.     svc 0  

【1】此部分参照 (伟研科技 http://www.gzweiyan.com) 资料

【2】内核调度器启动的流程如下:


  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
S32K144是一款基于ARM Cortex-M4的32位微控制器,启动文件是该微控制器系统启动时运行的一段代码。对于S32K144启动文件的解析,需要从以下几个方面进行分析。 首先,S32K144启动文件包含有关芯片系统时钟的配置,包括时钟源的选择、时钟分频器的设置等。这些内容是在系统启动前配置的,它们的正确性直接影响了整个系统运行的稳定性和速度。 其次,启动文件也包含有关中断向量表的定义和初始化。中断向量表是存储中断服务程序地址的数组,当中断发生时,由中断控制器根据中断编号在向量表中查找对应的中断服务程序地址并执行。中断向量表是系统中断处理的关键数据结构,因此在启动文件中对其的定义和初始化非常重要。 此外,启动文件还包含了对片上Flash和RAM的初始化代码。这些初始化代码设置了Flash和RAM的起始地址、大小、读写属性等,为后续程序的正常运行提供了必要的基础环境。 最后,启动文件中还会有一些基本的程序运行环境初始化,如堆栈空间的设置、全局变量的初始化等。这些内容是为程序的正常运行所必需的,是启动文件中必不可少的部分。 总的来说,S32K144启动文件是一段非常关键的代码,在系统启动时扮演着重要的角色。对于S32K144启动文件的解析,需要深入了解芯片的硬件架构和系统设计理念,才能编写出正确、高效的启动代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值