?? startup.s
字號:
;/****************************************Copyright (c)**************************************************
;**
;** 西南科技大學計算機學院
;**
;** http://cs.swust.edu.cn
;**
;** 日期: 2004.11.9
;** 描述: startup.s文件,堆棧大小定義,操作模式定義,異常向量表的定義
;**
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
;/********************************************************************************************************/
;各操作模式下堆棧大小定義
USR_STACK_LEGTH EQU 256
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 16
IRQ_STACK_LEGTH EQU 256
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
NoInt EQU 0x80
;操作模式定義
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
PINSEL2 EQU 0xE002C014
BCFG0 EQU 0xFFE00000
BCFG1 EQU 0xFFE00004
BCFG2 EQU 0xFFE00008
BCFG3 EQU 0xFFE0000C
;引入的外部標號在這聲明
IMPORT FIQ_Exception ;快速中斷異常處理程序
IMPORT __main ;C語言主程序入口
IMPORT TargetResetInit ;目標板基本初始化
IMPORT StackUsr
IMPORT bottom_of_heap
;給外部使用的標號在這聲明
EXPORT Reset
EXPORT __rt_div0
EXPORT __user_initial_stackheap
;/*******************************************************************************
;** 中斷向量表的定義,子程序名:vectors.存儲器重定位時利用該名字實現重新映射
;** 平時用戶主要使用的異常主要為非向量中斷,向量中斷,以及快速中斷
;********************************************************************************/
CODE32
AREA vectors,CODE,READONLY
ENTRY
Reset
LDR PC, ResetAddr
LDR PC, UndefinedAddr
LDR PC, SWI_Addr
LDR PC, PrefetchAddr
LDR PC, DataAbortAddr
DCD 0xb9205f80
LDR PC, [PC, #-0xff0]
LDR PC, FIQ_Addr
ResetAddr DCD ResetInit
UndefinedAddr DCD Undefined
SWI_Addr DCD SoftwareInterrupt
PrefetchAddr DCD PrefetchAbort
DataAbortAddr DCD DataAbort
Nouse DCD 0
IRQ_Addr DCD 0
FIQ_Addr DCD FIQ_Handler
;未定義指令
Undefined
B Undefined
;軟中斷
SoftwareInterrupt
B SoftwareInterrupt
;取指令中止
PrefetchAbort
B PrefetchAbort
;取數據中止
DataAbort
B DataAbort
;快速中斷
FIQ_Handler
STMFD SP!, {R0-R3, LR}
BL FIQ_Exception
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
;/*********************************************************************************************************
;** 程序名稱,InitStack, 用于初始化處理器各種模式下堆棧的大小以及堆棧指針,
;** 每個工程模塊必須做這樣的操作,否則導致中斷程序的
;** 不能正常返回,或函數調用的返回失敗。
;********************************************************************************************************/
InitStack
MOV R0, LR
;設置管理模式堆棧
MSR CPSR_c, #0xd3
LDR SP, StackSvc
;設置中斷模式堆棧
MSR CPSR_c, #0xd2
LDR SP, StackIrq
;設置快速中斷模式堆棧
MSR CPSR_c, #0xd1
LDR SP, StackFiq
;設置中止模式堆棧
MSR CPSR_c, #0xd7
LDR SP, StackAbt
;設置未定義模式堆棧
MSR CPSR_c, #0xdb
LDR SP, StackUnd
;設置系統模式堆棧
MSR CPSR_c, #0x5f;//#0xdf
LDR SP, =StackUsr
MOV PC, R0
;/*********************************************************************************************************
;** 函數名稱: ResetInit
;** 功能描述: 復位入口
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
ResetInit
;初始化外部總線控制器,根據目標板決定配置
LDR R0, =PINSEL2
IF :DEF: EN_CRP
LDR R1, =0x0f814910
ELSE
LDR R1, =0x0f814914
ENDIF
STR R1, [R0]
LDR R0, =BCFG0
LDR R1, =0x1000ffef
STR R1, [R0]
LDR R0, =BCFG1
LDR R1, =0x1000ffef
STR R1, [R0]
LDR R0, =BCFG2
LDR R1, =0x1000ffef
STR R1, [R0]
; LDR R0, =BCFG3
; LDR R1, =0x2000ffef
; STR R1, [R0]
BL InitStack ;初始化堆棧
BL TargetResetInit ;目標板基本初始化
;跳轉到c語言入口
B __main
;/*********************************************************************************************************
;** 函數名稱: __user_initial_stackheap
;** 功能描述: 庫函數初始化堆和棧,不能刪除
;**
;** 輸 入: 參考庫函數手冊
;**
;** 輸 出: 參考庫函數手冊
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__user_initial_stackheap
LDR r0,=bottom_of_heap
MOV pc,lr
;/*********************************************************************************************************
;** 函數名稱: __rt_div0
;** 功能描述: 整數除法除數為0錯誤處理函數,替代原始的__rt_div0減少目標代碼大小
;**
;** 輸 入: 參考庫函數手冊
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
__rt_div0
B __rt_div0
StackSvc DCD SvcStackSpace + (SVC_STACK_LEGTH - 1)* 4
StackIrq DCD IrqStackSpace + (IRQ_STACK_LEGTH - 1)* 4
StackFiq DCD FiqStackSpace + (FIQ_STACK_LEGTH - 1)* 4
StackAbt DCD AbtStackSpace + (ABT_STACK_LEGTH - 1)* 4
StackUnd DCD UndtStackSpace + (UND_STACK_LEGTH - 1)* 4
;/*********************************************************************************************************
;** 函數名稱: CrpData
;** 功能描述: 支持芯片加密功能
;**------------------------------------------------------------------------------------------------------
;********************************************************************************************************/
IF :DEF: EN_CRP
IF . >= 0x1fc
INFO 1,"\nThe data at 0x000001fc must be 0x87654321.\nPlease delete some source before this line."
ENDIF
CrpData
WHILE . < 0x1fc
NOP
WEND
CrpData1
DCD 0x87654321 ;/* 當此數為0x87654321時,用戶程序被保護 */
ENDIF
;/* 分配堆棧空間 */
AREA MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;管理模式堆棧空間
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;中斷模式堆棧空間
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;快速中斷模式堆棧空間
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;中止義模式堆棧空間
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;未定義模式堆棧
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -