?? 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 + -