📄 startup.s
字号:
;/************************************************************************************************
;定义系统中断向量表以及相应代码.
;07-09-17,huangsl,所有堆栈的大小都只使用 size 来定位.
;/************************************************************************************************
INCLUDE CONDEFINE.s
;/*******************************************************************************************************
;** IMPORT LABELS 引用外部标号的声明
;********************************************************************************************************/
IMPORT OSIrqIsr
IMPORT DebugSystem
;/*******************************************************************************************************
;** EXPORT LABELS 输出内部标号供外部使用的声明
;********************************************************************************************************/
EXPORT SystemReset
CODE32
AREA |RESET|, CODE, READONLY
;中断向量表入口.
;/************************************************************************************************
SystemReset
LDR PC, ResetAddr ;跳到入口函数.
UndefinedAddr
;MOVS PC , LR ;直接返回
LDR PC , DBG_Addr
SwiAddr
LDR PC, SWI_Addr ; SWI 中断处理函数
PrefetchAddr
;SUBS PC , LR , #4 ;直接返回
LDR PC , DBG_Addr
DataAbortAddr
;SUBS PC , LR , #4 ; #8 ;直接返回
LDR PC , DBG_Addr
ReservdAddr
;MOVS PC , LR ;直接返回
LDR PC , DBG_Addr
IRQAddr
LDR PC, IRQ_Addr ;跳到 IRQ 处理函数。
FIQAddr
;SUBS PC , LR , #4 ;直接返回
LDR PC , DBG_Addr
ResetAddr DCD ResetHandler
IRQ_Addr DCD OSIrqIsr ;HandleIRQ
DBG_Addr DCD DebugSystem
IF :DEF: ARMULATE ;only use at amulate
SWI_Addr DCD HandleSWI
IMPORT swiChandler
;软件中断
HandleSWI
STMFD SP!, {R0-R1}
LDR R1,[LR,#-4]
BIC R1, R1, #0xFF000000
CMP R1 ,#0
BNE SWIExit
CMP R0, #31
BHI SWIExit
STMFD SP! , {R0-R4 , R12, LR }
BL swiChandler
LDMFD SP! , {R0-R4 , R12, LR }
ADD R1,LR , #4
MRS R0 , SPSR ;当前状态
;切换到 IRQ 方式,通过 R0 传递返回地址
MSR CPSR_c, #IRQMODE|NOINT
STMFD SP!,{R0-R1}
MSR CPSR_c,#SVCMODE|NOINT
LDMFD SP!,{R0-R1}
;et IRQ INT
MSR CPSR_c, #IRQMODE|NOINT
LDR PC,IRQ_Addr
SWIExit
LDMFD SP!,{R0-R1}
MOVS PC , LR
ELSE ;NO ARMULATE
SWI_Addr DCD DebugSystem
ENDIF
;/********************************************************************************************************
;** RESET 复位入口
;071015,huangsl,直接跳到 C 入口即可.
;********************************************************************************************************/
IMPORT ISystemReboot
; IMPORT TASK_DUMP
; IMPORT OSCurrTaskDump
IMPORT ||Image$$REALTABLE_SDRAM$$ZI$$Limit||
; IMPORT gRockTaskStkArray //080319,huangsl,目前无用
ResetHandler
;设置堆栈指针 .设置为 SDRAM 的最末端.
;070922,huangsl,不能设置为 HEAP空间,否则在初始化时,STACK和HEAP 会重叠.
; gSysHeapStart 此空间与 PROC HEAP 重叠,会产生问题.
;||Image$$STACK_SDRAM$$ZI$$Limit|| 和 系统任务堆栈重叠,在建立 TASK初始化堆栈的时候会把 SP内容修改.
;比较可行的办法是利用 SRAM . 如此,不需要重新设置堆栈,但是初始化函数需要注意不能占用 > 0x300 的堆栈.
LDR SP, = ||Image$$REALTABLE_SDRAM$$ZI$$Limit||
; LDR SL, = gRockTaskStkArray ;Setup a default Stack Limit (when compiled with "-mapcs-stack-check")
;/********************************************************************************************************
IMPORT main
ldr pc, __main ; Jump to the entry point of C program 跳转到c语言入口
__main DCD main
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -