?? startup.s
字號(hào):
;/*******************************************************************************************************
;* 文件名:Startup.s
;* 功 能:開發(fā)板啟動(dòng)代碼。包含異常向量表,當(dāng)異常(包括復(fù)位)發(fā)生時(shí),程序?qū)漠惓O蛄勘砣≈高M(jìn)行跳轉(zhuǎn)。還包
;* 含對(duì)各模式系統(tǒng)堆棧的初始化代碼,接著調(diào)用開發(fā)板初始化代碼,最后跳轉(zhuǎn)到C語言main()函數(shù)入口處。
;* 另外,開/關(guān)IRQ中斷和FIQ中斷采用SWI的方式實(shí)現(xiàn),處理程序也在本文件中。
;* 作 者:POWER
;* 日 期:2006年5月25號(hào)
;* 斯凱科技主頁:www.armsky.net
;* 斯凱科技論壇:www.armsky.net/bbs
;********************************************************************************************************/
;/*定義堆棧的大小*/
SVC_STACK_LEGTH EQU 0
FIQ_STACK_LEGTH EQU 0
IRQ_STACK_LEGTH EQU 256
ABT_STACK_LEGTH EQU 0
UND_STACK_LEGTH EQU 0
NoInt EQU 0x80 ;// Bit7,I位
NoFIQ EQU 0x40 ;// Bit6,F(xiàn)位
USR32Mode EQU 0x10 ;// M[4:0]=10000,用戶模式
SVC32Mode EQU 0x13 ;// M[4:0]=10011,管理模式
SYS32Mode EQU 0x1f ;// M[4:0]=11111,系統(tǒng)模式
IRQ32Mode EQU 0x12 ;// M[4:0]=10010,IRQ中斷
FIQ32Mode EQU 0x11 ;// M[4:0]=10001,快速中斷
IMPORT __use_no_semihosting_swi
;/* 引入的外部標(biāo)號(hào)在這聲明 */
IMPORT FIQ_Exception ;// 快速中斷異常處理程序
IMPORT __main ;// C語言主程序入口
IMPORT TargetResetInit ;// 開發(fā)板基本初始化
;/* 給外部使用的標(biāo)號(hào)在這聲明 */
EXPORT bottom_of_heap
EXPORT StackUsr
EXPORT Reset
EXPORT __user_initial_stackheap
CODE32
AREA vectors,CODE,READONLY
ENTRY
;/* 中斷向量表 */
Reset
LDR PC, ResetAddr ;// 0x00000000,復(fù)位
LDR PC, UndefinedAddr ;// 0x00000004,未定義地址
LDR PC, SWI_Addr ;// 0x00000008,軟件中斷
LDR PC, PrefetchAddr ;// 0x0000000c,預(yù)取指中止
LDR PC, DataAbortAddr ;// 0x00000010,數(shù)據(jù)中止
DCD 0xb9205f80 ;// 0x00000014,保留
LDR PC, [PC, #-0xff0] ;// 0x00000018,IRQ中斷
LDR PC, FIQ_Addr ;// 0x0000001c,F(xiàn)IQ中斷
ResetAddr DCD ResetInit ;// 復(fù)位初始化處理程序地址
UndefinedAddr DCD Undefined ;// 未定義指令處理程序地址
SWI_Addr DCD SoftwareInterrupt ;// 軟件中斷處理程序地址
PrefetchAddr DCD PrefetchAbort ;// 預(yù)取指中止處理程序地址
DataAbortAddr DCD DataAbort ;// 數(shù)據(jù)中止處理程序地址
Nouse DCD 0 ;// 未使用
IRQ_Addr DCD 0 ;// IRQ中斷,已在"LDR PC,[PC,#-0xff0]"中處理
FIQ_Addr DCD FIQ_Handler ;// FIQ中斷處理程序地址
;/* 未定義指令 */
Undefined
B Undefined ;// 死循環(huán)
;/* 軟中斷,中斷號(hào)0~3已經(jīng)占用 */
SoftwareInterrupt
CMP R0, #4 ;// 判斷傳過來的參數(shù)是否大于4
LDRLO PC, [PC, R0, LSL #2] ;// 小于4(參數(shù)正確),進(jìn)行查表
MOVS PC, LR ;// 大于或等于4(參數(shù)出錯(cuò)),則返回
SwiFunction
DCD IRQDisable ;// 0號(hào)調(diào)用,禁止IRQ中斷
DCD IRQEnable ;// 1號(hào)調(diào)用,使能IRQ中斷
DCD FIQDisable ;// 2號(hào)調(diào)用,禁止FIQ中斷
DCD FIQEnable ;// 3號(hào)調(diào)用,使能FIQ中斷
IRQDisable
;/* 禁止IRQ中斷 */
MRS R0, SPSR ;// 讀取SPSR的值
ORR R0, R0, #NoInt ;// 置位I位,設(shè)置關(guān)IRQ中斷
MSR SPSR_c, R0 ;// 回寫SPSR
MOVS PC, LR ;// 返回
IRQEnable
;/* 使能IRQ中斷 */
MRS R0, SPSR ;// 讀取SPSR的值
BIC R0, R0, #NoInt ;// 清零I位,設(shè)置開IRQ中斷
MSR SPSR_c, R0 ;// 回寫SPSR
MOVS PC, LR ;// 返回
FIQDisable
;/* 禁止FIQ中斷 */
MRS R0, SPSR ;// 讀取SPSR的值
ORR R0, R0, #NoFIQ ;// 置位F位,設(shè)置關(guān)FIQ中斷
MSR SPSR_c, R0 ;// 回寫SPSR
MOVS PC, LR ;// 返回
FIQEnable
;/* 使能FIQ中斷 */
MRS R0, SPSR ;// 讀取SPSR的值
BIC R0, R0, #NoFIQ ;// 清零F位,設(shè)置開FIQ中斷
MSR SPSR_c, R0 ;// 回寫SPSR
MOVS PC, LR ;// 返回
;/* 取指令中止 */
PrefetchAbort
B PrefetchAbort ;// 死循環(huán)
;/* 取數(shù)據(jù)中止 */
DataAbort
B DataAbort ;// 死循環(huán)
;/* 快速中斷 */
FIQ_Handler
STMFD SP!, {R0-R3, LR} ;// 寄存器R0~R3,LR入棧
BL FIQ_Exception ;// 調(diào)用FIQ處理程序(在target.c中)
LDMFD SP!, {R0-R3, LR} ;// 寄存器R0~R3,LR出棧
SUBS PC, LR, #4 ;// 計(jì)算返回地址
;/*********************************************************************************************************
;* 函數(shù)名稱:InitStack
;* 功能描述:初始化堆棧
;* 入口參數(shù):無
;* 出口參數(shù):無
;* 注 意:當(dāng)進(jìn)行初始化堆棧時(shí),處理器狀態(tài)為ARM狀態(tài)(T=0
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -