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 割り込みベクトルテーブルを初期化し、割り込みベクトルテーブルに格納されているのはポインタタイプの変数であり、最初の変数が初期スタックポインタを格納している以外は、対応する割り込み応答関数の関数ポインタである. 割り込み応答関数 チップ起動時は主にReset_Handlerの割り込み応答関数が機能している.この関数はsystem_を先に呼び出します.LPC17xx.cの関数はシステムの時計回りなどを初期化し、main()関数にジャンプしてC言語コードを実行します.これで、チップ起動プログラムの実行が完了し、main()関数のアプリケーションにジャンプします. EXPORT Reset_Handler [WEAK]
この文の[weak]は、ユーザが対応する割り込み応答関数を実装していない場合、このコードをその関数の実装としてコンパイル接続し、ユーザが自分の割り込み応答関数を実装している場合、この対応するアセンブリ言語コードは数え切れないことをコンパイラに伝える.ここでの役割の利点は,リロードやオブジェクト向けの虚関数の概念に似ている.しかし,C言語にはリロードメソッドという構文がないため,外部のC言語関数の実装も一度しか実現できず,この手法を用いてリロードメソッドの実装をシミュレートすることはできない.
2.RT-Threadシステム起動コード main関数 Boot Loaderファイルの実行が完了すると、プログラムはmain関数にジャンプします.RT-threadのmain関数は,RT-threadの割り込みと起動に関する2つのことしかしなかった.特定のシステム起動プロセスはrtthread_にあります.startup関数で実行します.システム起動関数rtthread_startup
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のコード実装.
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)
この文の[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システム起動コード
int main(void)
{
/* disable interrupt first */
rt_hw_interrupt_disable();
/* startup RT-Thread RTOS */
rtthread_startup();
return 0;
}