?? startup.s
字號:
IRQ_Handler
SUB LR, LR, #4 ; 計算返回地址
STMFD SP!, {R0-R3, R12, LR} ; 保存任務環境
MRS R3, SPSR ; 保存狀態
STMFD SP, {R3, SP, LR}^ ; 保存用戶狀態的R3,SP,LR,注意不能回寫
; 如果回寫的是用戶的SP,所以后面要調整SP
LDR R2, =OSIntNesting ; OSIntNesting++
LDRB R1, [R2]
ADD R1, R1, #1
STRB R1, [R2]
SUB SP, SP, #4*3
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切換到系統模式
CMP R1, #1
LDREQ SP, =StackUsr
LDR R0, =INTPND
LDR R1, [R0] ; 讀取INTPND的值
; 找出當前中斷號(INTPND)
MOV R0, #0
FIND_NO
MOVS R1, R1, LSR #1
ADDNE R0, R0, #1
BNE FIND_NO
FIND_END
LDR R1, =VICVectAddr
MOV LR, PC ; 保存返回地址
LDR PC, [R1, R0, LSL #2] ; 跳轉到相應中斷服務程序
MSR CPSR_c, #(NoInt | SYS32Mode) ; 切換到系統模式
LDR R2, =OsEnterSum ; OsEnterSum,使OSIntExit退出時中斷關閉
MOV R1, #1
STR R1, [R2]
BL OSIntExit
LDR R2, =OsEnterSum ; 因為中斷服務程序要退出,所以OsEnterSum=0
MOV R1, #0
STR R1, [R2]
MSR CPSR_c, #(NoInt | IRQ32Mode) ; 切換回irq模式
LDMFD SP, {R3, SP, LR}^ ; 恢復用戶狀態的R3,SP,LR,注意不能回寫
; 如果回寫的是用戶的SP,所以后面要調整SP
LDR R0, =OSTCBHighRdy
LDR R0, [R0]
LDR R1, =OSTCBCur
LDR R1, [R1]
CMP R0, R1
ADD SP, SP, #4*3 ;
MSR SPSR_cxsf, R3
LDMEQFD SP!, {R0-R3, R12, PC}^ ; 不進行任務切換
LDR PC, =OSIntCtxSw ; 進行任務切換
; 快速中斷
FIQ_Handler
STMFD SP!, {R0-R3, LR}
; /* FIQ中斷處理 */
LDMFD SP!, {R0-R3, LR}
SUBS PC, LR, #4
;/*********************************************************************************************************
;** 函數名稱: Reset
;** 功能描述: 復位入口
;** 輸 入: 無
;** 輸 出: 無
;********************************************************************************************************/
ResetInit
BL InitStack ; 初始化堆棧
BL TargetInitReset ; 針對目標板的系統初始化
BL Remap ; 重映射操作
B __main ; 跳轉到c語言入口
;/*********************************************************************************************************
;** 函數名稱: Remap
;** 功能描述: 重映射向量表操作。
;** 輸 入: 無
;** 輸 出: 無
;** 說明:將向量表復制到0x0000000地址,所以要求系統為NAND Flash啟動方式。
;** 占用R0--R9寄存器。
;********************************************************************************************************/
Remap
IF :DEF: Release
MOV PC, LR
ELSE
MOV R0, #0x00000000
LDR R1, =Reset
LDMIA R1!, {R2-R9}
STMIA R0!, {R2-R9}
LDMIA R1!, {R2-R9}
STMIA R0!, {R2-R9}
MOV PC, LR
ENDIF
;/*********************************************************************************************************
;** 函數名稱: TargetInitReset
;** 功能描述: 針對目標板的系統初始化,包括WDT、中斷、PLL、SDRAM控制器等等。
;** 輸 入: 無
;** 輸 出: 無
;** 說明:占用R0--R8寄存器
;********************************************************************************************************/
TargetInitReset
LDR R0, =WTCON ; 關閉WDT
LDR R1, =0x0000
STR R1,[R0] ; WTCON=0x0000
LDR R0, =INTMSK ; 禁止所有中斷 (中斷控制器)
LDR R1, =0xFFFFFFFF
STR R1, [R0] ; INTMSK=0xFFFFFFFF
LDR R0, =INTSUBMSK
LDR R1, =0x07FF ; INTSUBMSK=0x07FF
STR R1, [R0]
LDR R0, =SRCPND ; 清除中斷標志 (add)
LDR R1, =0xFFFFFFFF
STR R1, [R0]
LDR R0, =INTPND
LDR R1, =0xFFFFFFFF
STR R1, [R0]
IF :DEF: Release
; 系統時鐘設置,啟用PLL
LDR R0, =LOCKTIME
LDR R1, =0x00FFFFFF ; 鎖定時間設置U_LTIME=0xFFF,M_LTIME=0xFFF
STR R1, [R0]
LDR R0, =CLKDIVN
MOV R1, #0x03 ; HCLK=FCLK/2,PCLK=HCLK/2
STR R1, [R0]
MRC p15, 0, R1, c1, c0, 0 ; (MMU設置) 讀控制寄存器
ORR R1, R1, #0xC0000000
MRC p15, 0, R1, c1, c0, 0
LDR R0, =MPLLCON
LDR R1, =MPLLCON_200 ; 設置CPU時鐘為200Mhz (FCLK)
STR R1, [R0]
; 總線設置,初始化SDRAM
LDR R0, =BUS_INIT
LDR R1, =BWSCON
LDMIA R0!, {R2-R8}
STMIA R1!, {R2-R8}
LDMIA R0!, {R2-R7}
STMIA R1!, {R2-R7}
ENDIF
MOV PC, LR ; 返回
; 總線配置數據表
BUS_INIT DCD (B7_BWCON<<28)|(B6_BWCON<<24)|(B5_BWCON<<20)|(B4_BWCON<<16) \
|(B3_BWCON<<12)|(B2_BWCON<<8)|(B1_BWCON<<4) ; BWSCON 寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON0寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON1寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON2寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON3寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON4寄存器
DCD (1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON5寄存器
DCD (3<<15)|(1<<2)|(1<<0) ; BANKCON6寄存器(SDRAM)
DCD (0<<15)|(1<<13)|(1<<11)|(7<<8)|(1<<6)|(1<<4)|(1<<2)|(0<<0) ; BANKCON7寄存器(SRAM )
DCD (1<<23)|(0<<22)|(0<<20)|(3<<18)|(1113) ; REFRESH 寄存器(SDRAM) ,period=15.6us, HCLK=60Mhz, (2048+1-15.6*60)
DCD (1<<7)|(1<<5)|(1<<4)|(2<<0) ; BANKSIZE寄存器(128MB)
DCD (3<<4) ; MRSRB6 寄存器
DCD (3<<4) ; MRSRB7 寄存器
;/*********************************************************************************************************
;** 函數名稱: InitStack
;** 功能描述: 初始化堆棧。最后返回時,處理器工作在系統模式。
;** 輸 入: 無
;** 輸 出: 無
;** 說 明: 由本文件開頭的USR_STACK_LEGTH、SVC_STACK_LEGTH等定義各工作模式的堆棧大小。
;********************************************************************************************************/
InitStack
MOV R0, LR
;設置管理模式堆棧
MSR CPSR_c, #(Mode_SVC | I_BIT | F_BIT) ; 0xd3
LDR SP, StackSvc
;設置中斷模式堆棧
MSR CPSR_c, #(Mode_IRQ | I_BIT | F_BIT) ; 0xd2
LDR SP, StackIrq
;設置快速中斷模式堆棧
MSR CPSR_c, #(Mode_FIQ | I_BIT | F_BIT) ; 0xd1
LDR SP, StackFiq
;設置中止模式堆棧
MSR CPSR_c, #(Mode_ABT | I_BIT | F_BIT) ; 0xd7
LDR SP, StackAbt
;設置未定義模式堆棧
MSR CPSR_c, #(Mode_UND | I_BIT | F_BIT) ; 0xdb
LDR SP, StackUnd
;設置系統模式堆棧
MSR CPSR_c, #(Mode_SYS | I_BIT | F_BIT) ; 0xdf
LDR SP, =StackUsr
MOV PC, R0
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
;/*********************************************************************************************************
;** 函數名稱: __user_initial_stackheap
;** 功能描述: 庫函數初始化堆和棧,不能刪除
;** 輸 入: 參考庫函數手冊
;** 輸 出: 參考庫函數手冊
;********************************************************************************************************/
__user_initial_stackheap
LDR r0, =bottom_of_heap
MOV pc, lr
; /* 分配堆棧空間 */
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 ;未定義模式堆棧
; /* IRQ中斷向量地址表定義 */
VICVectAddr SPACE 32*4
AREA Heap, DATA, READWRITE
bottom_of_heap SPACE 1
AREA Stacks, DATA, NOINIT
StackUsr
END
;/*********************************************************************************************************
;** End Of File
;********************************************************************************************************/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -