• Cortex-M系列内核 启动文件分析


    原文:https://www.cnblogs.com/w-smile/p/7738291.html

    在开始之前先铺垫一下,启动文件里涉及到的汇编指令的用法

    其中DCD 相当于C语言力的&,定义地址。

    启动文所做的操作主要有:

    • 初始化栈
    • 初始化堆
    • 初始化中断向量表
    • 系统初始化
    • 函数声明

    1,初始化栈

    复制代码
    Stack_Size      EQU     0x00000400  :0x00000400=1024
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
    Stack_Mem       SPACE   Stack_Size
    __initial_sp
    复制代码

    其中第二行汇编了数据段STACK 其中 NOINIT 表示未初始化,READWRITE可读可写,ALLGN 2*3 = 8 八字节对齐,第三行为STACK分配了大小为1KB的内存空间,紧跟着后面的__initial_sp 因为其是紧跟着栈分配内存后所以其为栈顶(递减栈)。最终__init_sp为1KB空间栈的栈顶,栈主要用于函数局部变量和形参的及调用过程的临时存储,属于编译器自动分配和释放的内存,所以这里需要注意如果你的函数所占的内存大过这个空间应调整其大小但一定要小于内部SARM的大小。堆是程序员进行分配和释放的,如果程序中未释放最后由系统回收。

    2,初始化堆

    复制代码
    Heap_Size       EQU     0x00000200   ;0x00000200 = 1000  
    
                    AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    __heap_base
    Heap_Mem        SPACE   Heap_Size
    __heap_limit
    
                    PRESERVE8
                    THUMB
    复制代码

    其中第二行汇编了一个数据段HEAP   NOINIT 未初始化,READWRITE可读可写,ALLGN 2*3 = 8 八字节对齐,第三行定义堆的起始地址 __heap_base 接下来就按汇编的数据类型和大小分配堆的1000B内存同样 __heap_limit就为堆的最后一个地址。对于内存可以看这个博客:http://blog.csdn.net/qq_29119171/article/details/53764823

      PRESERVE8 编译器指令8字节对齐 

      THUMB 选择芯片的指令集到此堆初始化完成

    2,初始化中断向量表

    复制代码
    ; Vector Table Mapped to Address 0 at Reset
                    AREA    RESET, DATA, READONLY
                    EXPORT  __Vectors
                    EXPORT  __Vectors_End
                    EXPORT  __Vectors_Size
    
    __Vectors       DCD     __initial_sp               ; Top of Stack
                    DCD     Reset_Handler              ; Reset Handler
                    DCD     NMI_Handler                ; NMI Handler
                    DCD     HardFault_Handler          ; Hard Fault Handler
                    DCD     MemManage_Handler          ; MPU Fault Handler
                    DCD     BusFault_Handler           ; Bus Fault Handler
                    DCD     UsageFault_Handler         ; Usage Fault Handler
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     SVC_Handler                ; SVCall Handler
                    DCD     DebugMon_Handler           ; Debug Monitor Handler
                    DCD     0                          ; Reserved
                    DCD     PendSV_Handler             ; PendSV Handler
                    DCD     SysTick_Handler            ; SysTick Handler
    
                    ; External Interrupts
                    DCD     WWDG_IRQHandler                   ; Window WatchDog                                        
                    DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection                        
                    DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
                    DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
                    DCD     FLASH_IRQHandler                  ; FLASH                                           
                    DCD     RCC_IRQHandler                    ; RCC                                             
                    DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             
                    DCD     EXTI1_IRQHandler                  ; EXTI Line1                                             
                    DCD     EXTI2_IRQHandler                  ; EXTI Line2                                             
                    DCD     EXTI3_IRQHandler                  ; EXTI Line3                                             
                    DCD     EXTI4_IRQHandler                  ; EXTI Line4                                             
                    DCD     DMA1_Stream0_IRQHandler           ; DMA1 Stream 0                                   
                    DCD     DMA1_Stream1_IRQHandler           ; DMA1 Stream 1                                   
                    DCD     DMA1_Stream2_IRQHandler           ; DMA1 Stream 2                                   
                    DCD     DMA1_Stream3_IRQHandler           ; DMA1 Stream 3                                   
                    DCD     DMA1_Stream4_IRQHandler           ; DMA1 Stream 4                                   
                    DCD     DMA1_Stream5_IRQHandler           ; DMA1 Stream 5                                   
                    DCD     DMA1_Stream6_IRQHandler           ; DMA1 Stream 6                                   
                    DCD     ADC_IRQHandler                    ; ADC1, ADC2 and ADC3s                            
                    DCD     CAN1_TX_IRQHandler                ; CAN1 TX                                                
                    DCD     CAN1_RX0_IRQHandler               ; CAN1 RX0                                               
                    DCD     CAN1_RX1_IRQHandler               ; CAN1 RX1                                               
                    DCD     CAN1_SCE_IRQHandler               ; CAN1 SCE                                               
                    DCD     EXTI9_5_IRQHandler                ; External Line[9:5]s                                    
                    DCD     TIM1_BRK_TIM9_IRQHandler          ; TIM1 Break and TIM9                   
                    DCD     TIM1_UP_TIM10_IRQHandler          ; TIM1 Update and TIM10                 
                    DCD     TIM1_TRG_COM_TIM11_IRQHandler     ; TIM1 Trigger and Commutation and TIM11
                    DCD     TIM1_CC_IRQHandler                ; TIM1 Capture Compare                                   
                    DCD     TIM2_IRQHandler                   ; TIM2                                            
                    DCD     TIM3_IRQHandler                   ; TIM3                                            
                    DCD     TIM4_IRQHandler                   ; TIM4                                            
                    DCD     I2C1_EV_IRQHandler                ; I2C1 Event                                             
                    DCD     I2C1_ER_IRQHandler                ; I2C1 Error                                             
                    DCD     I2C2_EV_IRQHandler                ; I2C2 Event                                             
                    DCD     I2C2_ER_IRQHandler                ; I2C2 Error                                               
                    DCD     SPI1_IRQHandler                   ; SPI1                                            
                    DCD     SPI2_IRQHandler                   ; SPI2                                            
                    DCD     USART1_IRQHandler                 ; USART1                                          
                    DCD     USART2_IRQHandler                 ; USART2                                          
                    DCD     USART3_IRQHandler                 ; USART3                                          
                    DCD     EXTI15_10_IRQHandler              ; External Line[15:10]s                                  
                    DCD     RTC_Alarm_IRQHandler              ; RTC Alarm (A and B) through EXTI Line                  
                    DCD     OTG_FS_WKUP_IRQHandler            ; USB OTG FS Wakeup through EXTI line                        
                    DCD     TIM8_BRK_TIM12_IRQHandler         ; TIM8 Break and TIM12                  
                    DCD     TIM8_UP_TIM13_IRQHandler          ; TIM8 Update and TIM13                 
                    DCD     TIM8_TRG_COM_TIM14_IRQHandler     ; TIM8 Trigger and Commutation and TIM14
                    DCD     TIM8_CC_IRQHandler                ; TIM8 Capture Compare                                   
                    DCD     DMA1_Stream7_IRQHandler           ; DMA1 Stream7                                           
                    DCD     FSMC_IRQHandler                   ; FSMC                                            
                    DCD     SDIO_IRQHandler                   ; SDIO                                            
                    DCD     TIM5_IRQHandler                   ; TIM5                                            
                    DCD     SPI3_IRQHandler                   ; SPI3                                            
                    DCD     UART4_IRQHandler                  ; UART4                                           
                    DCD     UART5_IRQHandler                  ; UART5                                           
                    DCD     TIM6_DAC_IRQHandler               ; TIM6 and DAC1&2 underrun errors                   
                    DCD     TIM7_IRQHandler                   ; TIM7                   
                    DCD     DMA2_Stream0_IRQHandler           ; DMA2 Stream 0                                   
                    DCD     DMA2_Stream1_IRQHandler           ; DMA2 Stream 1                                   
                    DCD     DMA2_Stream2_IRQHandler           ; DMA2 Stream 2                                   
                    DCD     DMA2_Stream3_IRQHandler           ; DMA2 Stream 3                                   
                    DCD     DMA2_Stream4_IRQHandler           ; DMA2 Stream 4                                   
                    DCD     ETH_IRQHandler                    ; Ethernet                                        
                    DCD     ETH_WKUP_IRQHandler               ; Ethernet Wakeup through EXTI line                      
                    DCD     CAN2_TX_IRQHandler                ; CAN2 TX                                                
                    DCD     CAN2_RX0_IRQHandler               ; CAN2 RX0                                               
                    DCD     CAN2_RX1_IRQHandler               ; CAN2 RX1                                               
                    DCD     CAN2_SCE_IRQHandler               ; CAN2 SCE                                               
                    DCD     OTG_FS_IRQHandler                 ; USB OTG FS                                      
                    DCD     DMA2_Stream5_IRQHandler           ; DMA2 Stream 5                                   
                    DCD     DMA2_Stream6_IRQHandler           ; DMA2 Stream 6                                   
                    DCD     DMA2_Stream7_IRQHandler           ; DMA2 Stream 7                                   
                    DCD     USART6_IRQHandler                 ; USART6                                           
                    DCD     I2C3_EV_IRQHandler                ; I2C3 event                                             
                    DCD     I2C3_ER_IRQHandler                ; I2C3 error                                             
                    DCD     OTG_HS_EP1_OUT_IRQHandler         ; USB OTG HS End Point 1 Out                      
                    DCD     OTG_HS_EP1_IN_IRQHandler          ; USB OTG HS End Point 1 In                       
                    DCD     OTG_HS_WKUP_IRQHandler            ; USB OTG HS Wakeup through EXTI                         
                    DCD     OTG_HS_IRQHandler                 ; USB OTG HS                                      
                    DCD     DCMI_IRQHandler                   ; DCMI                                            
                    DCD     CRYP_IRQHandler                   ; CRYP crypto                                     
                    DCD     HASH_RNG_IRQHandler               ; Hash and Rng
                    DCD     FPU_IRQHandler                    ; FPU
                                             
    __Vectors_End
    
    __Vectors_Size  EQU  __Vectors_End - __Vectors
    复制代码

     这是一个中断向量表,向量表从FLASH 的0x00000000 地址开始放置,以4 个字节为一个单位,地址0 存放的是栈顶(sp_init)地址,0X00000004 存放的是复位程序的地址,以此类推。从代码上看,向量表中存放的都是中断服务函数的函数名,可我们知道C 语言中的函数名就是一个地址。(由此知道,中断函数的函数名都已经知道了)。 从那里对应地址取出服务例程的入口地址并跳入。要注意的是这里有个另类:0 号类型并不是什么入口地址,而是给出了复位后MSP 的初值。

    3.系统初始化函数及中断函数声明

    复制代码
    AREA    |.text|, CODE, READONLY
    
    ; Reset handler
    Reset_Handler    PROC
                     EXPORT  Reset_Handler             [WEAK]
            IMPORT  SystemInit
            IMPORT  __main
    
                     LDR     R0, =SystemInit
                     BLX     R0
                     LDR     R0, =__main
                     BX      R0
                     ENDP
    
    ; Dummy Exception Handlers (infinite loops which can be modified)
    
    NMI_Handler     PROC
                    EXPORT  NMI_Handler                [WEAK]
                    B       .
                    ENDP
    HardFault_Handler
                    PROC
                    EXPORT  HardFault_Handler          [WEAK]
                    B       .
                    ENDP
    MemManage_Handler
                    PROC
                    EXPORT  MemManage_Handler          [WEAK]
                    B       .
                    ENDP
    BusFault_Handler
                    PROC
                    EXPORT  BusFault_Handler           [WEAK]
                    B       .
                    ENDP
    UsageFault_Handler
                    PROC
                    EXPORT  UsageFault_Handler         [WEAK]
                    B       .
                    ENDP
    SVC_Handler     PROC
                    EXPORT  SVC_Handler                [WEAK]
                    B       .
                    ENDP
    DebugMon_Handler
                    PROC
                    EXPORT  DebugMon_Handler           [WEAK]
                    B       .
                    ENDP
    PendSV_Handler  PROC
                    EXPORT  PendSV_Handler             [WEAK]
                    B       .
                    ENDP
    SysTick_Handler PROC
                    EXPORT  SysTick_Handler            [WEAK]
                    B       .
                    ENDP
    
    Default_Handler PROC
    
                    EXPORT  WWDG_IRQHandler                   [WEAK]                                        
                    EXPORT  PVD_IRQHandler                    [WEAK]                      
                    EXPORT  TAMP_STAMP_IRQHandler             [WEAK]         
                    EXPORT  RTC_WKUP_IRQHandler               [WEAK]                     
                    EXPORT  FLASH_IRQHandler                  [WEAK]                                         
                    EXPORT  RCC_IRQHandler                    [WEAK]                                            
                    EXPORT  EXTI0_IRQHandler                  [WEAK]                                            
                    EXPORT  EXTI1_IRQHandler                  [WEAK]                                             
                    EXPORT  EXTI2_IRQHandler                  [WEAK]                                            
                    EXPORT  EXTI3_IRQHandler                  [WEAK]                                           
                    EXPORT  EXTI4_IRQHandler                  [WEAK]                                            
                    EXPORT  DMA1_Stream0_IRQHandler           [WEAK]                                
                    EXPORT  DMA1_Stream1_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream2_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream3_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream4_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream5_IRQHandler           [WEAK]                                   
                    EXPORT  DMA1_Stream6_IRQHandler           [WEAK]                                   
                    EXPORT  ADC_IRQHandler                    [WEAK]                         
                    EXPORT  CAN1_TX_IRQHandler                [WEAK]                                                
                    EXPORT  CAN1_RX0_IRQHandler               [WEAK]                                               
                    EXPORT  CAN1_RX1_IRQHandler               [WEAK]                                                
                    EXPORT  CAN1_SCE_IRQHandler               [WEAK]                                                
                    EXPORT  EXTI9_5_IRQHandler                [WEAK]                                    
                    EXPORT  TIM1_BRK_TIM9_IRQHandler          [WEAK]                  
                    EXPORT  TIM1_UP_TIM10_IRQHandler          [WEAK]                
                    EXPORT  TIM1_TRG_COM_TIM11_IRQHandler     [WEAK] 
                    EXPORT  TIM1_CC_IRQHandler                [WEAK]                                   
                    EXPORT  TIM2_IRQHandler                   [WEAK]                                            
                    EXPORT  TIM3_IRQHandler                   [WEAK]                                            
                    EXPORT  TIM4_IRQHandler                   [WEAK]                                            
                    EXPORT  I2C1_EV_IRQHandler                [WEAK]                                             
                    EXPORT  I2C1_ER_IRQHandler                [WEAK]                                             
                    EXPORT  I2C2_EV_IRQHandler                [WEAK]                                            
                    EXPORT  I2C2_ER_IRQHandler                [WEAK]                                               
                    EXPORT  SPI1_IRQHandler                   [WEAK]                                           
                    EXPORT  SPI2_IRQHandler                   [WEAK]                                            
                    EXPORT  USART1_IRQHandler                 [WEAK]                                          
                    EXPORT  USART2_IRQHandler                 [WEAK]                                          
                    EXPORT  USART3_IRQHandler                 [WEAK]                                         
                    EXPORT  EXTI15_10_IRQHandler              [WEAK]                                  
                    EXPORT  RTC_Alarm_IRQHandler              [WEAK]                  
                    EXPORT  OTG_FS_WKUP_IRQHandler            [WEAK]                        
                    EXPORT  TIM8_BRK_TIM12_IRQHandler         [WEAK]                 
                    EXPORT  TIM8_UP_TIM13_IRQHandler          [WEAK]                 
                    EXPORT  TIM8_TRG_COM_TIM14_IRQHandler     [WEAK] 
                    EXPORT  TIM8_CC_IRQHandler                [WEAK]                                   
                    EXPORT  DMA1_Stream7_IRQHandler           [WEAK]                                          
                    EXPORT  FSMC_IRQHandler                   [WEAK]                                             
                    EXPORT  SDIO_IRQHandler                   [WEAK]                                             
                    EXPORT  TIM5_IRQHandler                   [WEAK]                                             
                    EXPORT  SPI3_IRQHandler                   [WEAK]                                             
                    EXPORT  UART4_IRQHandler                  [WEAK]                                            
                    EXPORT  UART5_IRQHandler                  [WEAK]                                            
                    EXPORT  TIM6_DAC_IRQHandler               [WEAK]                   
                    EXPORT  TIM7_IRQHandler                   [WEAK]                    
                    EXPORT  DMA2_Stream0_IRQHandler           [WEAK]                                  
                    EXPORT  DMA2_Stream1_IRQHandler           [WEAK]                                   
                    EXPORT  DMA2_Stream2_IRQHandler           [WEAK]                                    
                    EXPORT  DMA2_Stream3_IRQHandler           [WEAK]                                    
                    EXPORT  DMA2_Stream4_IRQHandler           [WEAK]                                 
                    EXPORT  ETH_IRQHandler                    [WEAK]                                         
                    EXPORT  ETH_WKUP_IRQHandler               [WEAK]                     
                    EXPORT  CAN2_TX_IRQHandler                [WEAK]                                               
                    EXPORT  CAN2_RX0_IRQHandler               [WEAK]                                               
                    EXPORT  CAN2_RX1_IRQHandler               [WEAK]                                               
                    EXPORT  CAN2_SCE_IRQHandler               [WEAK]                                               
                    EXPORT  OTG_FS_IRQHandler                 [WEAK]                                       
                    EXPORT  DMA2_Stream5_IRQHandler           [WEAK]                                   
                    EXPORT  DMA2_Stream6_IRQHandler           [WEAK]                                   
                    EXPORT  DMA2_Stream7_IRQHandler           [WEAK]                                   
                    EXPORT  USART6_IRQHandler                 [WEAK]                                           
                    EXPORT  I2C3_EV_IRQHandler                [WEAK]                                              
                    EXPORT  I2C3_ER_IRQHandler                [WEAK]                                              
                    EXPORT  OTG_HS_EP1_OUT_IRQHandler         [WEAK]                      
                    EXPORT  OTG_HS_EP1_IN_IRQHandler          [WEAK]                      
                    EXPORT  OTG_HS_WKUP_IRQHandler            [WEAK]                        
                    EXPORT  OTG_HS_IRQHandler                 [WEAK]                                      
                    EXPORT  DCMI_IRQHandler                   [WEAK]                                             
                    EXPORT  CRYP_IRQHandler                   [WEAK]                                     
                    EXPORT  HASH_RNG_IRQHandler               [WEAK]
                    EXPORT  FPU_IRQHandler                    [WEAK]
    //如下定义一个空函数
    WWDG_IRQHandler                                                       
    PVD_IRQHandler                                      
    TAMP_STAMP_IRQHandler                  
    RTC_WKUP_IRQHandler                                
    FLASH_IRQHandler                                                       
    RCC_IRQHandler                                                            
    EXTI0_IRQHandler                                                          
    EXTI1_IRQHandler                                                           
    EXTI2_IRQHandler                                                          
    EXTI3_IRQHandler                                                         
    EXTI4_IRQHandler                                                          
    DMA1_Stream0_IRQHandler                                       
    DMA1_Stream1_IRQHandler                                          
    DMA1_Stream2_IRQHandler                                          
    DMA1_Stream3_IRQHandler                                          
    DMA1_Stream4_IRQHandler                                          
    DMA1_Stream5_IRQHandler                                          
    DMA1_Stream6_IRQHandler                                          
    ADC_IRQHandler                                         
    CAN1_TX_IRQHandler                                                            
    CAN1_RX0_IRQHandler                                                          
    CAN1_RX1_IRQHandler                                                           
    CAN1_SCE_IRQHandler                                                           
    EXTI9_5_IRQHandler                                                
    TIM1_BRK_TIM9_IRQHandler                        
    TIM1_UP_TIM10_IRQHandler                      
    TIM1_TRG_COM_TIM11_IRQHandler  
    TIM1_CC_IRQHandler                                               
    TIM2_IRQHandler                                                           
    TIM3_IRQHandler                                                           
    TIM4_IRQHandler                                                           
    I2C1_EV_IRQHandler                                                         
    I2C1_ER_IRQHandler                                                         
    I2C2_EV_IRQHandler                                                        
    I2C2_ER_IRQHandler                                                           
    SPI1_IRQHandler                                                          
    SPI2_IRQHandler                                                           
    USART1_IRQHandler                                                       
    USART2_IRQHandler                                                       
    USART3_IRQHandler                                                      
    EXTI15_10_IRQHandler                                            
    RTC_Alarm_IRQHandler                            
    OTG_FS_WKUP_IRQHandler                                
    TIM8_BRK_TIM12_IRQHandler                      
    TIM8_UP_TIM13_IRQHandler                       
    TIM8_TRG_COM_TIM14_IRQHandler  
    TIM8_CC_IRQHandler                                               
    DMA1_Stream7_IRQHandler                                                 
    FSMC_IRQHandler                                                            
    SDIO_IRQHandler                                                            
    TIM5_IRQHandler                                                            
    SPI3_IRQHandler                                                            
    UART4_IRQHandler                                                          
    UART5_IRQHandler                                                          
    TIM6_DAC_IRQHandler                            
    TIM7_IRQHandler                              
    DMA2_Stream0_IRQHandler                                         
    DMA2_Stream1_IRQHandler                                          
    DMA2_Stream2_IRQHandler                                           
    DMA2_Stream3_IRQHandler                                           
    DMA2_Stream4_IRQHandler                                        
    ETH_IRQHandler                                                         
    ETH_WKUP_IRQHandler                                
    CAN2_TX_IRQHandler                                                           
    CAN2_RX0_IRQHandler                                                          
    CAN2_RX1_IRQHandler                                                          
    CAN2_SCE_IRQHandler                                                          
    OTG_FS_IRQHandler                                                    
    DMA2_Stream5_IRQHandler                                          
    DMA2_Stream6_IRQHandler                                          
    DMA2_Stream7_IRQHandler                                          
    USART6_IRQHandler                                                        
    I2C3_EV_IRQHandler                                                          
    I2C3_ER_IRQHandler                                                          
    OTG_HS_EP1_OUT_IRQHandler                           
    OTG_HS_EP1_IN_IRQHandler                            
    OTG_HS_WKUP_IRQHandler                                
    OTG_HS_IRQHandler                                                   
    DCMI_IRQHandler                                                            
    CRYP_IRQHandler                                                    
    HASH_RNG_IRQHandler
    FPU_IRQHandler
    复制代码

     AREA |.text|, CODE, READONLY定义一个名称为.text 的代码段,可读程序段。

    PROC与ENDP组合在汇编中定义一段子函数

    类似与这种形式:EXPORT FPU_IRQHandler [WEAK]的用法,其中WEAK是弱定义的意思,如果外部定义了就先使用外部定义的内容,若未定义则会执行地下的空函数且返回到空函数(死循环)。

    4.用户堆栈的初始化

      这以部分也就是把初始化的堆栈地址赋值给单片机的对应寄存器以方便C程序进行分配释放使用。

     

    复制代码
     User Stack and Heap initialization
    ;*******************************************************************************
                     IF      :DEF:__MICROLIB //这一部分是关于是否使用微库
                    
                     EXPORT  __initial_sp
                     EXPORT  __heap_base
                     EXPORT  __heap_limit
                    
                     ELSE
                    
                     IMPORT  __use_two_region_memory
                     EXPORT  __user_initial_stackheap
                     
    __user_initial_stackheap
    
                     LDR     R0, =  Heap_Mem
                     LDR     R1, =(Stack_Mem + Stack_Size)
                     LDR     R2, = (Heap_Mem +  Heap_Size)
                     LDR     R3, = Stack_Mem
                     BX      LR
    
                     ALIGN
    
                     ENDIF
    
                     END
    复制代码

    使用微库与不使用微库的区别(参考:http://www.cnblogs.com/amanlikethis/p/3719529.html)

     

       使用微库就意味着我们不想使用MDK提供的库函数,而想用自己定义的库函数,比如说printf函数。那么这一点是怎样实现的呢?我们以printf函数为例进行说明。不使用微库而使用系统库在连接程序时,肯定会把系统中包含printf函数的库拿来调用参与连接,即代码段有系统库的参与。在启动过程中,不使用微库而使用系统库在初始化栈的时候,还需要初始化堆(猜测系统库需要用到堆),而使用微库则是不需要的。另外,在执行__main函数的过程中,不仅需要完成“使用微库”情况下的所有工作,额外的工作还需要进行库的初始化,才能使用系统库(这一部分我还没有深入)。使用微库而不使用系统库在程序连接时,不会把包含printf函数的库连接到终极目标文件中,而使用我们定义的库。启动时需要完成的工作就是之前论述的步骤相比使用系统库,启动过程步骤更少。

    6.总结

      启动文件XXX.s从头开始执行,(C语言上分为栈、堆、.bss、.data、.code段)依次定义了栈,堆,代码段|.text|,初始化向量表后又初始化了系统的时钟的及C函数的跳转,其中__main 是一个标准的C 库函数,主要作用是初始化用户堆栈(初始化数据段在.data段,未初始化数据段在.bss数据段上)最终调用main 函数。还需要清楚的一点是假设STM32被设置为从内部FLASH启动中断向量表起始地位为0x8000000; 则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。当STM32到复位信号后,则从0x80000004处取出复位中断服务入口地址继而执行复位中断服务程序,; 然后跳转__main函数最后在——main()函数的引导下进入C语言的用户main()函数开始执行。

    在开始之前先铺垫一下,启动文件里涉及到的汇编指令的用法

    其中DCD 相当于C语言力的&,定义地址。

    启动文所做的操作主要有:

    • 初始化栈
    • 初始化堆
    • 初始化中断向量表
    • 系统初始化
    • 函数声明

    1,初始化栈

    复制代码
    Stack_Size      EQU     0x00000400  :0x00000400=1024
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
    Stack_Mem       SPACE   Stack_Size
    __initial_sp
    复制代码

    其中第二行汇编了数据段STACK 其中 NOINIT 表示未初始化,READWRITE可读可写,ALLGN 2*3 = 8 八字节对齐,第三行为STACK分配了大小为1KB的内存空间,紧跟着后面的__initial_sp 因为其是紧跟着栈分配内存后所以其为栈顶(递减栈)。最终__init_sp为1KB空间栈的栈顶,栈主要用于函数局部变量和形参的及调用过程的临时存储,属于编译器自动分配和释放的内存,所以这里需要注意如果你的函数所占的内存大过这个空间应调整其大小但一定要小于内部SARM的大小。堆是程序员进行分配和释放的,如果程序中未释放最后由系统回收。

    2,初始化堆

    复制代码
    Heap_Size       EQU     0x00000200   ;0x00000200 = 1000  
    
                    AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    __heap_base
    Heap_Mem        SPACE   Heap_Size
    __heap_limit
    
                    PRESERVE8
                    THUMB
    复制代码

    其中第二行汇编了一个数据段HEAP   NOINIT 未初始化,READWRITE可读可写,ALLGN 2*3 = 8 八字节对齐,第三行定义堆的起始地址 __heap_base 接下来就按汇编的数据类型和大小分配堆的1000B内存同样 __heap_limit就为堆的最后一个地址。对于内存可以看这个博客:http://blog.csdn.net/qq_29119171/article/details/53764823

      PRESERVE8 编译器指令8字节对齐 

      THUMB 选择芯片的指令集到此堆初始化完成

    2,初始化中断向量表

    复制代码
    ; Vector Table Mapped to Address 0 at Reset
                    AREA    RESET, DATA, READONLY
                    EXPORT  __Vectors
                    EXPORT  __Vectors_End
                    EXPORT  __Vectors_Size
    
    __Vectors       DCD     __initial_sp               ; Top of Stack
                    DCD     Reset_Handler              ; Reset Handler
                    DCD     NMI_Handler                ; NMI Handler
                    DCD     HardFault_Handler          ; Hard Fault Handler
                    DCD     MemManage_Handler          ; MPU Fault Handler
                    DCD     BusFault_Handler           ; Bus Fault Handler
                    DCD     UsageFault_Handler         ; Usage Fault Handler
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     0                          ; Reserved
                    DCD     SVC_Handler                ; SVCall Handler
                    DCD     DebugMon_Handler           ; Debug Monitor Handler
                    DCD     0                          ; Reserved
                    DCD     PendSV_Handler             ; PendSV Handler
                    DCD     SysTick_Handler            ; SysTick Handler
    
                    ; External Interrupts
                    DCD     WWDG_IRQHandler                   ; Window WatchDog                                        
                    DCD     PVD_IRQHandler                    ; PVD through EXTI Line detection                        
                    DCD     TAMP_STAMP_IRQHandler             ; Tamper and TimeStamps through the EXTI line            
                    DCD     RTC_WKUP_IRQHandler               ; RTC Wakeup through the EXTI line                       
                    DCD     FLASH_IRQHandler                  ; FLASH                                           
                    DCD     RCC_IRQHandler                    ; RCC                                             
                    DCD     EXTI0_IRQHandler                  ; EXTI Line0                                             
                    DCD     EXTI1_IRQHandler                  ; EXTI Line1                                             
                    DCD     EXTI2_IRQHandler                  ; EXTI Line2                                             
                    DCD     EXTI3_IRQHandler                  ; EXTI Line3                                             
                    DCD     EXTI4_IRQHandler                  ; EXTI Line4                                             
                    DCD     DMA1_Stream0_IRQHandler           ; DMA1 Stream 0                                   
                    DCD     DMA1_Stream1_IRQHandler           ; DMA1 Stream 1                                   
                    DCD     DMA1_Stream2_IRQHandler           ; DMA1 Stream 2                                   
                    DCD     DMA1_Stream3_IRQHandler           ; DMA1 Stream 3                                   
                    DCD     DMA1_Stream4_IRQHandler           ; DMA1 Stream 4                                   
                    DCD     DMA1_Stream5_IRQHandler           ; DMA1 Stream 5                                   
                    DCD     DMA1_Stream6_IRQHandler           ; DMA1 Stream 6                                   
                    DCD     ADC_IRQHandler                    ; ADC1, ADC2 and ADC3s                            
                    DCD     CAN1_TX_IRQHandler                ; CAN1 TX                                                
                    DCD     CAN1_RX0_IRQHandler               ; CAN1 RX0                                               
                    DCD     CAN1_RX1_IRQHandler               ; CAN1 RX1                                               
                    DCD     CAN1_SCE_IRQHandler               ; CAN1 SCE                                               
                    DCD     EXTI9_5_IRQHandler                ; External Line[9:5]s                                    
                    DCD     TIM1_BRK_TIM9_IRQHandler          ; TIM1 Break and TIM9                   
                    DCD     TIM1_UP_TIM10_IRQHandler          ; TIM1 Update and TIM10                 
                    DCD     TIM1_TRG_COM_TIM11_IRQHandler     ; TIM1 Trigger and Commutation and TIM11
                    DCD     TIM1_CC_IRQHandler                ; TIM1 Capture Compare                                   
                    DCD     TIM2_IRQHandler                   ; TIM2                                            
                    DCD     TIM3_IRQHandler                   ; TIM3                                            
                    DCD     TIM4_IRQHandler                   ; TIM4                                            
                    DCD     I2C1_EV_IRQHandler                ; I2C1 Event                                             
                    DCD     I2C1_ER_IRQHandler                ; I2C1 Error                                             
                    DCD     I2C2_EV_IRQHandler                ; I2C2 Event                                             
                    DCD     I2C2_ER_IRQHandler                ; I2C2 Error                                               
                    DCD     SPI1_IRQHandler                   ; SPI1                                            
                    DCD     SPI2_IRQHandler                   ; SPI2                                            
                    DCD     USART1_IRQHandler                 ; USART1                                          
                    DCD     USART2_IRQHandler                 ; USART2                                          
                    DCD     USART3_IRQHandler                 ; USART3                                          
                    DCD     EXTI15_10_IRQHandler              ; External Line[15:10]s                                  
                    DCD     RTC_Alarm_IRQHandler              ; RTC Alarm (A and B) through EXTI Line                  
                    DCD     OTG_FS_WKUP_IRQHandler            ; USB OTG FS Wakeup through EXTI line                        
                    DCD     TIM8_BRK_TIM12_IRQHandler         ; TIM8 Break and TIM12                  
                    DCD     TIM8_UP_TIM13_IRQHandler          ; TIM8 Update and TIM13                 
                    DCD     TIM8_TRG_COM_TIM14_IRQHandler     ; TIM8 Trigger and Commutation and TIM14
                    DCD     TIM8_CC_IRQHandler                ; TIM8 Capture Compare                                   
                    DCD     DMA1_Stream7_IRQHandler           ; DMA1 Stream7                                           
                    DCD     FSMC_IRQHandler                   ; FSMC                                            
                    DCD     SDIO_IRQHandler                   ; SDIO                                            
                    DCD     TIM5_IRQHandler                   ; TIM5                                            
                    DCD     SPI3_IRQHandler                   ; SPI3                                            
                    DCD     UART4_IRQHandler                  ; UART4                                           
                    DCD     UART5_IRQHandler                  ; UART5                                           
                    DCD     TIM6_DAC_IRQHandler               ; TIM6 and DAC1&2 underrun errors                   
                    DCD     TIM7_IRQHandler                   ; TIM7                   
                    DCD     DMA2_Stream0_IRQHandler           ; DMA2 Stream 0                                   
                    DCD     DMA2_Stream1_IRQHandler           ; DMA2 Stream 1                                   
                    DCD     DMA2_Stream2_IRQHandler           ; DMA2 Stream 2                                   
                    DCD     DMA2_Stream3_IRQHandler           ; DMA2 Stream 3                                   
                    DCD     DMA2_Stream4_IRQHandler           ; DMA2 Stream 4                                   
                    DCD     ETH_IRQHandler                    ; Ethernet                                        
                    DCD     ETH_WKUP_IRQHandler               ; Ethernet Wakeup through EXTI line                      
                    DCD     CAN2_TX_IRQHandler                ; CAN2 TX                                                
                    DCD     CAN2_RX0_IRQHandler               ; CAN2 RX0                                               
                    DCD     CAN2_RX1_IRQHandler               ; CAN2 RX1                                               
                    DCD     CAN2_SCE_IRQHandler               ; CAN2 SCE                                               
                    DCD     OTG_FS_IRQHandler                 ; USB OTG FS                                      
                    DCD     DMA2_Stream5_IRQHandler           ; DMA2 Stream 5                                   
                    DCD     DMA2_Stream6_IRQHandler           ; DMA2 Stream 6                                   
                    DCD     DMA2_Stream7_IRQHandler           ; DMA2 Stream 7                                   
                    DCD     USART6_IRQHandler                 ; USART6                                           
                    DCD     I2C3_EV_IRQHandler                ; I2C3 event                                             
                    DCD     I2C3_ER_IRQHandler                ; I2C3 error                                             
                    DCD     OTG_HS_EP1_OUT_IRQHandler         ; USB OTG HS End Point 1 Out                      
                    DCD     OTG_HS_EP1_IN_IRQHandler          ; USB OTG HS End Point 1 In                       
                    DCD     OTG_HS_WKUP_IRQHandler            ; USB OTG HS Wakeup through EXTI                         
                    DCD     OTG_HS_IRQHandler                 ; USB OTG HS                                      
                    DCD     DCMI_IRQHandler                   ; DCMI                                            
                    DCD     CRYP_IRQHandler                   ; CRYP crypto                                     
                    DCD     HASH_RNG_IRQHandler               ; Hash and Rng
                    DCD     FPU_IRQHandler                    ; FPU
                                             
    __Vectors_End
    
    __Vectors_Size  EQU  __Vectors_End - __Vectors
    复制代码

     这是一个中断向量表,向量表从FLASH 的0x00000000 地址开始放置,以4 个字节为一个单位,地址0 存放的是栈顶(sp_init)地址,0X00000004 存放的是复位程序的地址,以此类推。从代码上看,向量表中存放的都是中断服务函数的函数名,可我们知道C 语言中的函数名就是一个地址。(由此知道,中断函数的函数名都已经知道了)。 从那里对应地址取出服务例程的入口地址并跳入。要注意的是这里有个另类:0 号类型并不是什么入口地址,而是给出了复位后MSP 的初值。

    3.系统初始化函数及中断函数声明

     View Code

     AREA |.text|, CODE, READONLY定义一个名称为.text 的代码段,可读程序段。

    PROC与ENDP组合在汇编中定义一段子函数

    类似与这种形式:EXPORT FPU_IRQHandler [WEAK]的用法,其中WEAK是弱定义的意思,如果外部定义了就先使用外部定义的内容,若未定义则会执行地下的空函数且返回到空函数(死循环)。

    4.用户堆栈的初始化

      这以部分也就是把初始化的堆栈地址赋值给单片机的对应寄存器以方便C程序进行分配释放使用。

     

    复制代码
     User Stack and Heap initialization
    ;*******************************************************************************
                     IF      :DEF:__MICROLIB //这一部分是关于是否使用微库
                    
                     EXPORT  __initial_sp
                     EXPORT  __heap_base
                     EXPORT  __heap_limit
                    
                     ELSE
                    
                     IMPORT  __use_two_region_memory
                     EXPORT  __user_initial_stackheap
                     
    __user_initial_stackheap
    
                     LDR     R0, =  Heap_Mem
                     LDR     R1, =(Stack_Mem + Stack_Size)
                     LDR     R2, = (Heap_Mem +  Heap_Size)
                     LDR     R3, = Stack_Mem
                     BX      LR
    
                     ALIGN
    
                     ENDIF
    
                     END
    复制代码

    使用微库与不使用微库的区别(参考:http://www.cnblogs.com/amanlikethis/p/3719529.html)

     

       使用微库就意味着我们不想使用MDK提供的库函数,而想用自己定义的库函数,比如说printf函数。那么这一点是怎样实现的呢?我们以printf函数为例进行说明。不使用微库而使用系统库在连接程序时,肯定会把系统中包含printf函数的库拿来调用参与连接,即代码段有系统库的参与。在启动过程中,不使用微库而使用系统库在初始化栈的时候,还需要初始化堆(猜测系统库需要用到堆),而使用微库则是不需要的。另外,在执行__main函数的过程中,不仅需要完成“使用微库”情况下的所有工作,额外的工作还需要进行库的初始化,才能使用系统库(这一部分我还没有深入)。使用微库而不使用系统库在程序连接时,不会把包含printf函数的库连接到终极目标文件中,而使用我们定义的库。启动时需要完成的工作就是之前论述的步骤相比使用系统库,启动过程步骤更少。

    6.总结

      启动文件XXX.s从头开始执行,(C语言上分为栈、堆、.bss、.data、.code段)依次定义了栈,堆,代码段|.text|,初始化向量表后又初始化了系统的时钟的及C函数的跳转,其中__main 是一个标准的C 库函数,主要作用是初始化用户堆栈(初始化数据段在.data段,未初始化数据段在.bss数据段上)最终调用main 函数。还需要清楚的一点是假设STM32被设置为从内部FLASH启动中断向量表起始地位为0x8000000; 则栈顶地址存放于0x8000000处,而复位中断服务入口地址存放于0x8000004处。当STM32到复位信号后,则从0x80000004处取出复位中断服务入口地址继而执行复位中断服务程序,; 然后跳转__main函数最后在——main()函数的引导下进入C语言的用户main()函数开始执行。

  • 相关阅读:
    struts2 类型转化(typeConverter)
    appfuse-maven-plugin(AMP)
    多项式求和,素数判定 HDU2011.2012
    A+B problems
    黑马程序员----java基础笔记中(毕向东)
    2015Web前端攻城之路
    黑马程序员----java基础笔记上(毕向东)
    黑马程序员----2015黑马之路-启程
    乱弹琴20140421
    读Thinking in java 4
  • 原文地址:https://www.cnblogs.com/lgslearn/p/14206491.html
Copyright © 2020-2023  润新知