请教各位老鸟,CORTEX-M4中LR的问题
你好!看规格书中说,LR:在出入ISR的时候,LR的值将得到重新的诠释,这种特殊的值称为“EXC_RETURN”,在异常进入时由系统计算并赋给LR,并在异常返回时使用它。
EXC_RETURN位段详解:
位段
含义
EXC_RETURN的标识:必须全为1
:0=返回后进入Handler模式;1=返回后进入线程模式
:0=从主堆栈中做出栈操作,返回后使用MSP,;1=从进程堆栈中做出栈操作,返回后使用PSP
保留,必须为0
0=返回ARM状态;1=返回Thumb状态。在CM3中必须为1
EXC_RETURN数值功能:
0xFFFF_FFF1 返回handler模式
0xFFFF_FFF9 返回线程模式,并使用主堆栈(SP=MSP)
0xFFFF_FFFD 返回线程模式,并使用线程堆栈(SP=PSP)
我在调试的时候,发现,在刚进入中断的时候,LR的数据确实没错(0XFFFF FFFD),但是如果我再中断里面发生一个跳转的时候,LR的数据就被更改了(例如UCOs里面节拍的中断),等我要返回的时候,
LR已经不是原值了,那么如何确保返回的正确。
voidTmr_TickISR_Handler (void)
{ /**在这里LR = 0XFFFF FFFD **/
#if OS_CRITICAL_METHOD == 3
OS_CPU_SRcpu_sr;
#endif
OS_ENTER_CRITICAL(); /* Tell uC/OS-II that we are starting an ISR */
OSIntNesting++;
OS_EXIT_CRITICAL();
OSTimeTick(); /* Call uC/OS-II's OSTimeTick() */
OSIntExit(); /* Tell uC/OS-II that we are leaving the ISR */ /*** 由于出现子函数调用,LR出现的变化,那么按CORTEX-M3指南所说,中断如何返回 ?***/} 嵌入汇编压栈运行完毕之后出栈 本帖最后由 xiehaolin 于 2012-6-17 22:55 编辑
谢谢,不过我记得对于中断响应的入栈是芯片自己完成的(不需要软件PUSH),那么它的出栈也是芯片自己完成的吗?(也就是说,出栈的时候,不需要我们POP)?
页:
[1]