在C程序運行以前要設置好棧空間,在嵌入式ARM系統中,ARM 的啟動代碼可以實現此類功能,
etup Stack for each mode
LDR R0, =Stack_Top
; Enter Undefined Instruction Mode and set its Stack Pointer
MSR CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #UND_Stack_Size
; Enter Abort Mode and set its Stack Pointer
MSR CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #ABT_Stack_Size
; Enter FIQ Mode and set its Stack Pointer
MSR CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #FIQ_Stack_Size
; Enter IRQ Mode and set its Stack Pointer
MSR CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #IRQ_Stack_Size
; Enter Supervisor Mode and set its Stack Pointer
MSR CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
MOV SP, R0
SUB R0, R0, #SVC_Stack_Size
; Enter User Mode and set its Stack Pointer
MSR CPSR_c, #Mode_USR
以上是MDK的startup.s文件對各種處理器模式棧空間的設置,但是在多進程編程時我們希望棧空間的設置更靈活,我們可以使用幾條偽指令來實現棧空間的申請,
AREA |subr|, CODE, READONLY
;軟件中斷
SoftwareInterrupt
LDR SP, StackSvc ; 重新設置堆棧指針
STMFD SP!, {R0-R3, R12, LR}
StackSvc DCD (SvcStackSpace + SVC_STACK_LEGTH * 4 - 4)
在地址StackSvc的空間(SvcStackSpace + SVC_STACK_LEGTH * 4 - 4),這個值正好是下面用SPACE 申請的空間的高地址,ATPCS標準ARM采用FD棧,所以要去棧空間的高地址;
AREA SWIStacks, DATA, NOINIT,ALIGN=2
SvcStackSpace SPACE SVC_STACK_LEGTH * 4
使用SPACE 申請以SvcStackSpace標號為起始地址,空間為SVC_STACK_LEGTH * 4大小的空間。