📄 sutupstart.s
字号:
;/************************************************************************************************
;定义系统中断向量表以及相应代码.
;07-11-12,huangsl,用于安装的 向量表.
;080325,huangsl,增加非法处理.
;/************************************************************************************************
INCLUDE CONDEFINE.s
;/*******************************************************************************************************
;** IMPORT LABELS 引用外部标号的声明
;********************************************************************************************************/
;/*******************************************************************************************************
;** EXPORT LABELS 输出内部标号供外部使用的声明
;********************************************************************************************************/
EXPORT SystemReset
EXPORT OSDisableInt
EXPORT OSEnableInt
IMPORT gSetupStack
IMPORT gSetupStackBotton
IMPORT SetupCrashHandler ;080325,HUANGSL,for setup crash.
CODE32
AREA |RESET|, CODE, READONLY
;中断向量表入口.
;/************************************************************************************************
SystemReset
LDR PC, ResetAddr ;跳到入口函数.
UndefinedAddr
LDR PC,DBG_Addr
;MOVS PC , LR ;直接返回
SwiAddr
LDR PC,DBG_Addr
;MOVS PC , LR ;直接返回
PrefetchAddr
LDR PC,DBG_Addr
;SUBS PC , LR , #4 ;直接返回
DataAbortAddr
LDR PC,DBG_Addr
;SUBS PC , LR , #4 ; #8 ;直接返回
ReservdAddr
LDR PC,DBG_Addr
;MOVS PC , LR ;直接返回
IRQAddr
LDR PC, IRQ_Addr
;SUBS PC , LR , #4 ;直接返回
FIQAddr
LDR PC,DBG_Addr
;SUBS PC , LR , #4 ;直接返回
ResetAddr DCD ResetHandler
IRQ_Addr DCD SetupIrqIsr
DBG_Addr DCD DebugSystem
DebugSystem
MSR CPSR_c, #SVCMODE|NOINT ;切换到 SVC 模式.
ldr sp , =gSetupStackBotton
ldr pc, __SetupCrashHandler
__SetupCrashHandler DCD SetupCrashHandler
;/********************************************************************************************************
;IRQ 处理函数
;080221,huangsl,RGB 屏的 显示需要产生中断.
;********************************************************************************************************/
IMPORT IrqCHandler ;IRQ C语言中断处理函数
SetupIrqIsr
SUB LR, LR, #4 ;计算返回地址
STMFD SP!, {R0-R3,r12,LR}
MOV LR,PC
LDR PC,IRQ_CHANDLE
LDMFD SP!, {R0-R3,r12,PC}^
IRQ_CHANDLE DCD IrqCHandler
;/********************************************************************************************************
;** RESET 复位入口
;071015,huangsl,直接跳到 C 入口即可.
;********************************************************************************************************/
ResetHandler
LDR SL , =gSetupStack
ldr sp , =gSetupStackBotton
;/********************************************************************************************************
IMPORT main
ldr pc, __main ; Jump to the entry point of C program 跳转到c语言入口
__main DCD main
OSDisableInt
MRS r0, cpsr ;由于任务和内核都运行在svc模式下,因此可方便地操作cpsr
; STMFD sp!, {r0} ; 保存当前的cpsr
ORR r1, r0, #0xc0 ;屏蔽FIQ,IRQ中断
MSR cpsr_c, r1 ;回写cpsr,只屏蔽IRQ中断
MOV pc, lr ;返回
OSEnableInt ;必须和 OSDisableInt 成对使用
; LDMFD sp!, {r0} ;弹出在 OSDisableInt 中被保存的cpsr
MRS r0, cpsr
BIC r0, r0, #0x80 ;开中断.
MSR cpsr_c, r0 ;恢复关中断前的cpsr
MOV pc, lr ;返回
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -