RT-Thread起動フロー

5905 ワード

RT-Thread起動フロー
1. Boot Loader
LPC 17 xxシリーズチップのBoot Loaderは一般的にstartup_と命名されている.LPC17xx.s.このファイルはCortex-M 3の起動ファイルで、起動ファイルはアセンブリ言語で構成されています.LPC 17 xxハードウェアの初期化は主に以下の機能を完成した.
1.スタックとスタックの初期化2.割り込みベクトルテーブル定義3.アドレス再マッピングおよび割り込みベクトルテーブルの遷移4.システムクロック周波数5を設定.割り込みレジスタの初期化6.Cアプリケーションへ
ここで、startup_LPC17xx.sは1、2、6の2つの機能を完成した.3、4、5の3つの機能はstartup_LPC17xx.sは、SystemInit関数を呼び出して完了します.以下はstartup_LPC17xx.sのコード実装.
  • スタックを初期化し、スタックトップポインタを__に設定initial_sp,スタックトップポインタを__に設定heap_limit
  • 
    Stack_Size      EQU     0x00000200
    
                    AREA    STACK, NOINIT, READWRITE, ALIGN=3
    Stack_Mem       SPACE   Stack_Size
    __initial_sp
    
    
    ;  Heap Configuration
    ;     Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
    ; 
    
    Heap_Size       EQU     0x00000000
    
                    AREA    HEAP, NOINIT, READWRITE, ALIGN=3
    __heap_base
    Heap_Mem        SPACE   Heap_Size
    __heap_limit 
    
    
  • 割り込みベクトルテーブルを初期化し、割り込みベクトルテーブルに格納されているのはポインタタイプの変数であり、最初の変数が初期スタックポインタを格納している以外は、対応する割り込み応答関数の関数ポインタである.
  • 
                    AREA    RESET, DATA, READONLY
                    EXPORT  __Vectors
    
    __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     WDT_IRQHandler            ; 16: Watchdog Timer
                    DCD     TIMER0_IRQHandler         ; 17: Timer0
                    DCD     TIMER1_IRQHandler         ; 18: Timer1
                    DCD     TIMER2_IRQHandler         ; 19: Timer2
                    DCD     TIMER3_IRQHandler         ; 20: Timer3
                    DCD     UART0_IRQHandler          ; 21: UART0
                    DCD     UART1_IRQHandler          ; 22: UART1
                    DCD     UART2_IRQHandler          ; 23: UART2
                    DCD     UART3_IRQHandler          ; 24: UART3
                    DCD     PWM1_IRQHandler           ; 25: PWM1
                    DCD     I2C0_IRQHandler           ; 26: I2C0
                    DCD     I2C1_IRQHandler           ; 27: I2C1
                    DCD     I2C2_IRQHandler           ; 28: I2C2
                    DCD     SPI_IRQHandler            ; 29: SPI
                    DCD     SSP0_IRQHandler           ; 30: SSP0
                    DCD     SSP1_IRQHandler           ; 31: SSP1
                    DCD     PLL0_IRQHandler           ; 32: PLL0 Lock (Main PLL)
                    DCD     RTC_IRQHandler            ; 33: Real Time Clock
                    DCD     EINT0_IRQHandler          ; 34: External Interrupt 0
                    DCD     EINT1_IRQHandler          ; 35: External Interrupt 1
                    DCD     EINT2_IRQHandler          ; 36: External Interrupt 2
                    DCD     EINT3_IRQHandler          ; 37: External Interrupt 3
                    DCD     ADC_IRQHandler            ; 38: A/D Converter
                    DCD     BOD_IRQHandler            ; 39: Brown-Out Detect
                    DCD     USB_IRQHandler            ; 40: USB
                    DCD     CAN_IRQHandler            ; 41: CAN
                    DCD     DMA_IRQHandler            ; 42: General Purpose DMA
                    DCD     I2S_IRQHandler            ; 43: I2S
                    DCD     ENET_IRQHandler           ; 44: Ethernet
                    DCD     RIT_IRQHandler            ; 45: Repetitive Interrupt Timer
                    DCD     MCPWM_IRQHandler          ; 46: Motor Control PWM
                    DCD     QEI_IRQHandler            ; 47: Quadrature Encoder Interface
                    DCD     PLL1_IRQHandler           ; 48: PLL1 Lock (USB PLL)
    
    
  • 割り込み応答関数
  • チップ起動時は主にReset_Handlerの割り込み応答関数が機能している.この関数はsystem_を先に呼び出します.LPC17xx.cの関数はシステムの時計回りなどを初期化し、main()関数にジャンプしてC言語コードを実行します.これで、チップ起動プログラムの実行が完了し、main()関数のアプリケーションにジャンプします.
  • EXPORT Reset_Handler [WEAK]

  • この文の[weak]は、ユーザが対応する割り込み応答関数を実装していない場合、このコードをその関数の実装としてコンパイル接続し、ユーザが自分の割り込み応答関数を実装している場合、この対応するアセンブリ言語コードは数え切れないことをコンパイラに伝える.ここでの役割の利点は,リロードやオブジェクト向けの虚関数の概念に似ている.しかし,C言語にはリロードメソッドという構文がないため,外部のC言語関数の実装も一度しか実現できず,この手法を用いてリロードメソッドの実装をシミュレートすることはできない.
     
    ; 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
    
    ; ……
    
    

    2.RT-Threadシステム起動コード
  • main関数
  • Boot Loaderファイルの実行が完了すると、プログラムはmain関数にジャンプします.RT-threadのmain関数は,RT-threadの割り込みと起動に関する2つのことしかしなかった.特定のシステム起動プロセスはrtthread_にあります.startup関数で実行します.
    
    int main(void)
    {
        /* disable interrupt first */
        rt_hw_interrupt_disable();
    
        /* startup RT-Thread RTOS */
        rtthread_startup();
    
        return 0;
    }
    
    
  • システム起動関数rtthread_startup