?? startup.s
字號:
;定義堆棧的大小
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
NoFIQ EQU 0X40 ;bit6,F位
USR32Mode EQU 0x10
SVC32Mode EQU 0x13
SYS32Mode EQU 0x1f
IRQ32Mode EQU 0x12
FIQ32Mode EQU 0x11
IMPORT __use_no_semihosting_swi
;The imported labels
;引入的外部標號在這聲明
IMPORT FIQ_Exception ;Fast interrupt exceptions handler 快速中斷異常處理程序
IMPORT __main ;The entry point to the main function C語言主程序入口
IMPORT TargetResetInit ;initialize the target board 目標板基本初始化
;給外部使用的標號在這聲明
EXPORT bottom_of_heap
EXPORT StackUsr
EXPORT Reset
EXPORT __user_initial_stackheap
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
;軟中斷,中斷號0~3已經占用
SoftwareInterrupt
CMP R0,#4 ;判斷傳過來的參數是否大于4
LDRLO PC,[PC,R0,LSL#2] ;小于的話參數正確,進行查表
MOVS PC,LR ;大于或者等于,參數出錯,則返回
SwiFunction
DCD IRQDisable ;0號調用
DCD IRQEnable ;1號調用
DCD FIQDisable ;2號調用,禁止FIQ中斷
DCD FIQEnable ;3號調用,使能FIQ中斷
IRQDisable
MRS R0,SPSR ;讀取SPSR的值
ORR R0,R0,#NoInt
MSR SPSR_c,R0 ;回寫SPSR
MOVS PC,LR ;返回
IRQEnable
MRS R0,SPSR
BIC R0,R0,#NoInt
MSR SPSR_c,R0
MOVS PC,LR ;返回
FIQDisable ;禁止FIQ中斷
MRS R0,SPSR ;
ORR R0,R0,#NoFIQ ;置位F位,設置關FIQ中斷
MSR SPSR_c,R0 ;
MOVS PC,LR ;返回
FIQEnable ;使能FIQ
MRS R0,SPSR
BIC R0,R0,#NoFIQ ;清零F位,設置開FIQ中斷
MSR SPSR_c,R0 ;
MOVS PC,LR ;返回
;取指令中止
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
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, #0xdf
LDR SP, =StackUsr
MOV PC, R0
ResetInit
BL InitStack ;初始化堆棧 Initialize the stack
BL TargetResetInit ;目標板基本初始化 Initialize the target board
;跳轉到c語言入口 Jump to the entry point of C program
B __main
__user_initial_stackheap
LDR r0,=bottom_of_heap
; LDR r1,=StackUsr
MOV pc,lr
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
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 ;/*When the Data is 為0x87654321,user code be protected. 當此數為0x87654321時,用戶程序被保護 */
ENDIF
;/* 分配堆棧空間 */
AREA MyStacks, DATA, NOINIT, ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4 ;Stack spaces for Administration Mode 管理模式堆棧空間
IrqStackSpace SPACE IRQ_STACK_LEGTH * 4 ;Stack spaces for Interrupt ReQuest Mode 中斷模式堆棧空間
FiqStackSpace SPACE FIQ_STACK_LEGTH * 4 ;Stack spaces for Fast Interrupt reQuest Mode 快速中斷模式堆棧空間
AbtStackSpace SPACE ABT_STACK_LEGTH * 4 ;Stack spaces for Suspend Mode 中止義模式堆棧空間
UndtStackSpace SPACE UND_STACK_LEGTH * 4 ;Stack spaces for Undefined Mode 未定義模式堆棧
AREA Heap, DATA, NOINIT
bottom_of_heap SPACE 1
AREA Stacks, DATA, NOINIT
StackUsr
END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -