清采NOTE

理解他人 善待自己

用户工具

站点工具


courses:embedded_system:sp_ini_ex

堆栈指针的初始化


SP_Ini.S
_ISR_STARTADDRESS	EQU	0xC7FF000
UserStack		EQU	_ISR_STARTADDRESS
SVCStack		EQU	_ISR_STARTADDRESS+256
UndefStack		EQU	_ISR_STARTADDRESS+256*2
AbortStack		EQU	_ISR_STARTADDRESS+256*3
IRQStack		EQU	_ISR_STARTADDRESS+256*4
FIQStack		EQU	_ISR_STARTADDRESS+256*5
 
UserMode		EQU	0x10
FIQMode			EQU	0x11
IRQMode			EQU	0x12
SVCMode			EQU	0x13
AbortMode		EQU	0x17
UndefMode		EQU	0x1B
SYSMode			EQU 	0x1F
 
ModeMask		EQU	0x1F
 
	AREA	Stack_Init, CODE, READONLY
	ENTRY
 
start
	MRS		R0, CPSR
	BIC		R0, #ModeMask
 
; 设置系统模式的SP(用户模式共用SP)
	ORR		R1, R0, #SYSMode
	MSR		CPSR_c, R1
	LDR		SP, = UserStack
 
; 设置快中断模式的SP
	ORR		R1, R0, #FIQMode
	MSR		CPSR_c, R1
	LDR		SP, = FIQStack
 
; 设置中断模式的SP
	ORR		R1, R0, #IRQMode
	MSR		CPSR_c, R1
	LDR		SP, = IRQStack
 
; 设置管理模式的SP
	ORR		R1, R0, #SVCMode
	MSR		CPSR_c, R1
	LDR		SP, = SVCStack
 
; 设置中止模式的SP
	ORR		R1, R0, #AbortMode
	MSR		CPSR_c, R1
	LDR		SP, = AbortStack
 
; 设置未定义模式的SP
	ORR		R1, R0, #UndefMode
	MSR		CPSR_c, R1
	LDR		SP, = UndefStack
 
Stop
	B		Stop
	END

注意:只有在特权模式(系统、管理、快中断、中断、中止、未定义)下才能进行工作模式的任意切换,切换至用户模式后不能用上面的指令切换到其他模式。