Xtensa——中断及异常
小狼@http://blog.csdn.net/xiaolangyangyang
1、Xtensa异常向量
BEGIN iram0
0x2fb80000: instRam : iram0 : 0x40000 : executable, writable ;
iram0_0 : F : 0x2fb80000 - 0x2fb802df : .ResetVector.text .ResetHandler.literal .ResetHandler.text;
iram0_1 : C : 0x2fb802e0 - 0x2fb803ff : ;
iram0_2 : F : 0x2fb80400 - 0x2fb80577 : .WindowVectors.text;
iram0_3 : C : 0x2fb80578 - 0x2fb8057b : .Level2InterruptVector.literal;
iram0_4 : F : 0x2fb8057c - 0x2fb80597 : .Level2InterruptVector.text;
iram0_5 : C : 0x2fb80598 - 0x2fb8059b : .DebugExceptionVector.literal;
iram0_6 : F : 0x2fb8059c - 0x2fb805b7 : .DebugExceptionVector.text;
iram0_7 : C : 0x2fb805b8 - 0x2fb805bb : .NMIExceptionVector.literal;
iram0_8 : F : 0x2fb805bc - 0x2fb805d7 : .NMIExceptionVector.text;
iram0_9 : C : 0x2fb805d8 - 0x2fb805db : .KernelExceptionVector.literal;
iram0_10 : F : 0x2fb805dc - 0x2fb805f7 : .KernelExceptionVector.text;
iram0_11 : C : 0x2fb805f8 - 0x2fb805fb : .UserExceptionVector.literal;
iram0_12 : F : 0x2fb805fc - 0x2fb80617 : .UserExceptionVector.text;
iram0_13 : C : 0x2fb80618 - 0x2fb8061b : .DoubleExceptionVector.literal;
iram0_14 : F : 0x2fb8061c - 0x2fb80637 : .DoubleExceptionVector.text;
iram0_15 : C : 0x2fb80638 - 0x2fbbffff : .iram0.literal .literal .rtos.literal .clib.literal .iram0.text .text .clib.text .rtos.text .note.gnu.build-id;
END iram0
2、Xtensa中断优先级
中断入口:
1、KernelExceptionVector(PS.UM=0):异常及level1中断
2、UserExceptionVector(PS.UM=1):异常及level1中断
3、Level2InterruptVector~Level5InterruptVector:level2~level5中断
UserException可以在处理之前切换堆栈,而KernelException直接使用内核栈
中断优先级:
NMI最高,DEBUG次之,随着level越小,优先级越低
3、与中断有关的寄存器
PS.UM:KernelExceptionVector/UserExceptionVector选择
PS.EXCM:进入异常时为1
PS.INTLEVEL:中断屏蔽等级
INTCLEAR:Clear requests in INTERRUPT
INTENABLE:Interrupt enable bits
INTERRUPT:Interrupt request bits
INTSET:Set Requests in INTERRUPT
4、中断返回指令
5、异常处理函数
.section .UserExceptionVector.text, "ax"
.begin literal_prefix .UserExceptionVector
.align 4
_UserExceptionVector:
wsr a3, EXCSAVE_1
movi a3, _UserExceptionHandler
jx a3
.end literal_prefix
1、Xtensa有两个SP指针吗?
Xtensa只有一个SP指针,中断和OS使用独立堆栈是采用XT_RTOS_INT_ENTER和XT_RTOS_INT_EXIT修改SP值实现的
进入中断后,调用XT_RTOS_INT_ENTER将SP设置为系统栈,退出中断后,调用XT_RTOS_INT_EXIT将SP设置为任务栈。
2、Xtensa进异常会自动压栈吗?
Xtensa的异常和中断不会进行硬件自动压栈,进入中断后软件保存SP、PS、PC、A0(LR)等。