STM 32 F 4 XX起動ファイル分析


STM 32 F 4 XX起動ファイル分析-STM 32 F 4 XX起動ファイルダウンロードアドレス
リード:STM 32 F 4 XX起動ファイルの役割
  • 初期化設定SP、すなわちスタックポインタ
  • 初期化設定PCポインタリセット割込み処理関数、すなわちPC=Reset_Handler
  • 割り込みサービスプログラム(ISR)アドレスを導入する割り込みベクトルテーブル
  • を設定する.
  • システムクロックとSTM 324 xG-EVALボードに外部からマウントSRAMをデータストレージとして使用し、外部で完了したSysteminitは
  • を完了する.
  • Cライブラリへ移動_main、すなわちmain()関数でコードの実行を行う
  • CortexM 4をリセットすると、プロセッサはスレッドモードになり、特権優先度となり、スタックは、ビットMSPメインスタック
  • に設定される.
    1、スタックの設定
    Stack_Size      EQU     0x00000400  ;      1024  
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3   ;    STACK,    ,    ,8    
    ;AREA                    ,ALIGN = 32 38  
    Stack_Mem       SPACE   Stack_Size  ;    ,   1024  ,        Stack_Mem
    __initial_sp    ;      ,      ,          ,STM32       

    アドレッシング方式
    説明
    pop=LDM
    push=STM
    FA
    フルインクリメント
    LDMFA
    LDMDA
    STMFA
    STMIB
    FD
    ぜんげんすい
    LDMFD
    LDMIA
    STMFD
    STMDB
    EA
    Nullインクリメント
    LDMEA
    LDMDB
    STMEA
    STMIA
    ED
    空の減算
    LDMED
    LDMIB
    STMED
    STMDA
    フルインクリメント:SPは最後の押し込まれた要素を指し、SPはメモリアドレスの増加方向にフルインクリメント:SPは最後の押し込まれた要素を指し、SPはメモリアドレスの減少方向に空インクリメントを増加する:SPは最後の押し込まれた要素の次の空のアドレスを指す.SPはメモリアドレスの増加方向に空の減少を増加します:SPは最後の押し込まれた要素の次の空のアドレスを指して、SPはメモリアドレスの減少方向に増加します
    2、ヒープの設置
    Heap_Size       EQU     0x00000200  ;      512  
    
                    AREA    HEAP, NOINIT, READWRITE, ALIGN=3    ;    HEAP,    ,    ,8    
    __heap_base                         ;     
    Heap_Mem        SPACE   Heap_Size   ;     
    __heap_limit                        ;     

    3、位置合わせと指令セットの設定
    PRESERVE8   ;        8    
    THUMB       ;  THUMB   ,        THUMB        

    4、割込みベクトルテーブルの設定
    AREA    RESET, DATA, READONLY   ;    RESET,   ,  ,  8    ,    PRESERVE8  
                    EXPORT  __Vectors       ;     
                    EXPORT  __Vectors_End   ;     
                    EXPORT  __Vectors_Size  ;     ,          
    ;EXPORT      (   linux       EXPORT_SYMBOL(symbol))
    ;DCD              ,              ,    8     
    __Vectors       DCD     __initial_sp               ;       ,         
                    DCD     Reset_Handler              ; Reset Handler
                    DCD     NMI_Handler                ; NMI Handler
                    DCD     HardFault_Handler          ;     
                    DCD     MemManage_Handler          ; MPU  
                    DCD     BusFault_Handler           ;     
                    DCD     UsageFault_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            ;              
    ;   STM32        
                    ; External Interrupts
                    DCD     WWDG_IRQHandler                   ; Window WatchDog                                        
                    ... ...                                    
                    DCD     HASH_RNG_IRQHandler               ; Hash and Rng
                    DCD     FPU_IRQHandler                    ; FPU                         
    __Vectors_End   ;         
    
    __Vectors_Size  EQU  __Vectors_End - __Vectors  ;                    

    5、割込みベクトル関数の構築
    AREA    |.text|, CODE, READONLY ;   .text(C           .text,      C        ),   ,  
    ; Reset handler
    Reset_Handler    PROC
                     EXPORT  Reset_Handler             [WEAK]   ;WEAK,        ,         
    
            IMPORT  SystemInit  ;  SystemInit  
            IMPORT  __main      ;  __main  ,   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
    
    ... ... ... ...

    6、ユーザースタックとスタックの初期化
     ALIGN ;       ,   4    
    
    ;*******************************************************************************
    ; User Stack and Heap initialization
    ;*******************************************************************************
     IF :DEF:__MICROLIB ;        ( keil  option target    )
    
     EXPORT __initial_sp ;      
     EXPORT __heap_base ;
     EXPORT __heap_limit ;
    
     ELSE
    
     IMPORT __use_two_region_memory ;    __use_two_region_memory
     EXPORT __user_initial_stackheap ;  __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 ;   mov pc, lr
     ;        ,      ARM   
    
     ALIGN
    
     ENDIF
    
     END

    7、プロセス全体の分析
  • まずスタックを割り当て、スタック
  • 割り込みベクトルテーブルセグメント
  • を設定する.
  • 初期化スタック(外部呼び出し)
  • は割り込み処理関数を構築し、コードセグメント(割り込みリセット処理関数が含まれており、システム全体を初期化しmain()関数にジャンプして実行できる)
  • を構築する.