微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > ARM 中断状态和SVC状态的堆栈切换 (异常)

ARM 中断状态和SVC状态的堆栈切换 (异常)

时间:11-20 来源:互联网 点击:

:

: "r" (stk),

PLC (PSR_F_BIT | PSR_I_BIT | IRQ_MODE),

"I" (offsetof(struct stack,irq[0])),

PLC (PSR_F_BIT | PSR_I_BIT | ABT_MODE),

"I" (offsetof(struct stack,abt[0])),

PLC (PSR_F_BIT | PSR_I_BIT | UND_MODE),

"I" (offsetof(struct stack,und[0])),

PLC (PSR_F_BIT | PSR_I_BIT | SVC_MODE)

: "r14");

函数:cpu_init()文件:setup.c

通过msr设置了cpsr寄存器。然后通过mov指令把具体的参数地址写入sp寄存器。

其中offsetof(struct stack, irq[0])这个表达式表示的是偏移量。既是在结构体中的偏移量。

其实在这个函数中初始化的irq堆栈只有4 bytes x 3。这么小的堆栈空间是否可以满足中端的需求。答案是:可以。在中端进入的函数中其实并没有完全使用irq模式下sp_irq指向的堆栈空间。在进入函数中马上有利用了msr指令进行了模式切换,切换到了svc模式。并且放弃了irq的模式。从中端返回也是从svc模式返回,而非irq模式。

代码:

vector_\name:

.if \correction

sub lr, lr, #\correction

.endif

@

@ Save r0, lr_(parent PC) and spsr_

@ (parent CPSR)

@

@ 注释 1:

stmia sp, {r0, lr} @ save r0,lr

mrs lr, spsr

str lr, [sp, #8] @ save spsr

@

@ Prepare for SVC32 mode. IRQs remain disabled.

@

mrs r0, cpsr

eor r0, r0, #(\mode ^ SVC_MODE) 进入SVC模式

msr spsr_cxsf, r0

@

@ the branch table mustimmediately follow this code

@

and lr, lr, #0x0f

mov r0, sp

ldr lr, [pc, lr, lsl #2]

@注释 2:

movs pc, lr @ branch tohandler in SVC mode

参照ARM的参考

ENDPROC(vector_\name)

注释 1 :

保存irq模式下的sp和lr指针到前面初始的sp_irq中。记住只有4 bytes x 3大小的空间。在后面的代码中还会看到str lr, [sp, #8]保存了最后一个参数到sp_irq的空间中。这里要注意:stmia sp, {r0, lr}这条指令。没有使用“!”号。这样一来尽管指令执行后sp指针指向的地址不会自加。因此在正式切换到SVC模式之前sp_irq所指向的地址并没有变化。这样再次进入中断模式时候,sp_irq不需要调整,可以重复使用。

注释 2:

参照ARM 的芯片设计手册可以发现,离开异常,从异常情况返回以后会自动把spsr的内同拷贝到cpsr中。所以在执行BL Lr指令之前使用的堆栈其实并位切换。

这样一来尽管是中断的模式进入系统,但是由中断模式切换至SVC模式。在SVC模式中完成了中断的后续相应和操作。

文章只是做了学习笔记已被后用,把这些思路罗列出来也给自己以后再回忆查找提供方便。

如果文章中有什么不对的地方,还请高手指正。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top