xiehaolin 发表于 2012-6-16 17:41:20

请教各位老鸟,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指南所说,中断如何返回 ?***/}

xivisi 发表于 2012-6-16 19:12:48

嵌入汇编压栈运行完毕之后出栈

xiehaolin 发表于 2012-6-17 22:54:16

本帖最后由 xiehaolin 于 2012-6-17 22:55 编辑

谢谢,不过我记得对于中断响应的入栈是芯片自己完成的(不需要软件PUSH),那么它的出栈也是芯片自己完成的吗?(也就是说,出栈的时候,不需要我们POP)?
页: [1]
查看完整版本: 请教各位老鸟,CORTEX-M4中LR的问题