?? startup.s
字號:
;*********************************************************************
;* Copyright (c) 2011-2012,李士偉
;* All rights reserved.
;*文 件 名:startup.s
;*描 述:LPC2103 ARM開發板啟動代碼
;*當前版本:V1.00
;*作 者:李士偉
;*創建日期:2011.09.24
;*********************************************************************
; 匯編代碼使用到的與處理器相關的宏定義
GET arch\lpc2103\asm_cpu.inc
; 引出內部函數標號
EXPORT __Reset_Handler
; 引入外部函數標號
IMPORT kernelmain
IMPORT __SWI_Handler
IMPORT memcpy
IMPORT memset
; 引入各時域地址符號
IMPORT |Image$$ER_RW$$Base|
IMPORT |Load$$ER_RW$$Base|
IMPORT |Image$$ER_RW$$Limit|
IMPORT |Image$$ER_ZI$$Base|
IMPORT |Image$$ER_ZI$$Limit|
; 引出內部各模式棧基址、棧底標號
EXPORT __FIQ_Stack_Base
EXPORT __FIQ_Stack_Bottom
EXPORT __ABT_Stack_Base
EXPORT __ABT_Stack_Bottom
EXPORT __UND_Stack_Base
EXPORT __UND_Stack_Bottom
EXPORT __SVC_Stack_Base
EXPORT __SVC_Stack_Bottom
EXPORT __IRQ_Stack_Base
EXPORT __IRQ_Stack_Bottom
EXPORT __SYS_Stack_Base
EXPORT __SYS_Stack_Bottom
; 定義棧大小
AREA STACK, NOINIT, READWRITE, ALIGN = 3
; Fiq stack
__FIQ_Stack_Base
SPACE FIQ_Stack_Size
__FIQ_Stack_Bottom
; Abort stack
__ABT_Stack_Base
SPACE ABT_Stack_Size
__ABT_Stack_Bottom
; Undefine stack
__UND_Stack_Base
SPACE UND_Stack_Size
__UND_Stack_Bottom
; Supervisor stack
__SVC_Stack_Base
SPACE SVC_Stack_Size
__SVC_Stack_Bottom
; Irq stack
__IRQ_Stack_Base
SPACE IRQ_Stack_Size
__IRQ_Stack_Bottom
; System stack
__SYS_Stack_Base
SPACE SYS_Stack_Size
__SYS_Stack_Bottom
; 定義堆大小
AREA HEAP, NOINIT, READWRITE, ALIGN = 3
__Heap_Base
SPACE Heap_Size
__Heap_Limit
; 0x00000000 起始代碼段
CODE32
PRESERVE8
AREA RESET, CODE, READONLY
ENTRY
; 向量表
Vectors
B __Reset_Handler
B __Und_Handler
B __SWI_Handler
B __PAbt_Handler
B __DAbt_Handler
NOP ; 保留向量
LDR PC, [PC, #-0x0FF0] ; 中斷控制器的向量寄存器保存了ISR地址
; 快速中斷 ,直接從向量處執行處理過程,加快響應過程
__FIQ_Handler
LDR SP, =__FIQ_Stack_Bottom
SUB LR, LR, #4
STMFD SP!, {R0-R7, LR}
; 這里添加FIQ處理代碼
LDMFD SP!, {R0-R7, PC}^
; 未定義指令中斷處理,返回下一條指令處執行
__Und_Handler
; LDR PC, =__Reset_Handler ; 復位重啟
LDR SP, =__UND_Stack_Bottom
STMFD SP!, {R0-R12, LR}
; 這里添加處理代碼
LDMFD SP!, {R0-R12, PC}^
; 預取指中止處理,返回中止指令處執行
__PAbt_Handler
; LDR PC, =__Reset_Handler
LDR SP, =__ABT_Stack_Bottom
; 返回中止指令處執行,注釋該指令則從下一條指令執行
; SUB LR, LR, #4
STMFD SP!, {R0-R12, LR}
; 這里添加處理代碼
LDMFD SP!, {R0-R12, PC}^
; 數據訪問中止處理,返回中止處指令
__DAbt_Handler
; LDR PC, =__Reset_Handler
LDR SP, =__ABT_Stack_Bottom
SUB LR, LR, #8 ; LR -8 為數據訪問中止處指令地址
STMFD SP!, {R0-R12, LR}
; 這里添加處理代碼
LDMFD SP!, {R0-R12, PC}^
; 復位初始化各模式棧
__Reset_Handler
; 進入未定義指令異常模式,設置其棧指針
MSR CPSR_c, #UND32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__UND_Stack_Bottom
; 進入中止異常模式,設置其棧指針
MSR CPSR_c, #ABT32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__ABT_Stack_Bottom
; 進入快速中斷模式,設置其棧指針
MSR CPSR_c, #FIQ32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__FIQ_Stack_Bottom
; 進入中斷模式,設置其棧指針
MSR CPSR_c, #IRQ32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__IRQ_Stack_Bottom
; 進入管理模式,設置其棧指針
MSR CPSR_c, #SVC32_MODE:OR:I_Bit:OR:F_Bit
LDR SP, =__SVC_Stack_Bottom
; 進入系統模式,初始化目標板各外圍部件
MSR CPSR_c, #SYS32_MODE:OR:I_Bit:OR:F_Bit
; 復制RW數據到內存
LDR SP, =__SYS_Stack_Bottom
LDR R0, =|Image$$ER_RW$$Base|
LDR R1, =|Load$$ER_RW$$Base|
LDR R2, =|Image$$ER_RW$$Limit|
SUB R2, R2, R0
BL memcpy
; 清零ER_ZI域
LDR R0, =|Image$$ER_ZI$$Base|
MOV R1, #0x00
LDR R2, =|Image$$ER_ZI$$Limit|
SUB R2, R2, R0
BL memset
; 啟動C程序代碼
LDR R0, =kernelmain
BX R0
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -