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