欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Cortex-M3内核中的异常

发布时间:2025/4/5 编程问答 51 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Cortex-M3内核中的异常 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

文章目录

    • 1 Cortex-M3内核中的异常
    • 2 PendSV异常
    • 3 异常处理
      • 3.1 异常处理流程
      • 3.2 EXC_RETURN

1 Cortex-M3内核中的异常

系统异常列表:


2 PendSV异常

PendSVC异常用来实现任务的切换。 在一般的RTOS设计中,在执行具体的任务切换时,是通过向PendSVC异常发起请求,然后在PendSVC异常处理程序中具体执行任务切换的操作。

在PendSV中执行RTSO上下文切换(即不同任务间切换)。工作原理:配置为最低优先级,上下文切换的请求将自动延迟到其它的ISR都完成后才处理,并且可被其它异常/中断抢占。


3 异常处理

3.1 异常处理流程

进入异常:
刚进入异常时,硬件自动会将以下寄存器压入当前堆栈(当前使用的堆栈是MSP就压入MSP中,使用的是PSP就压入PSP中)。之后硬件自动跳转到PendSVC异常处理程序中运行。

退出异常:
退出异常时,硬件会自动出栈,这个次序与进入异常时压栈的顺序刚好相反。可以理解为进入异常时保存了部分寄存器状态,退出时正好恢复。此外,在退出异常时,还会用到EXC_RETURN,RTSO中只用到了0xFFFF_FFFD(即返回异常时进入线程模式,使用PSP堆栈)。

步骤如下:

  • 执行返回指令,如BX LR。
  • 恢复先前入栈的寄存器,出栈顺序与入栈时的相对应,堆栈指针的值也改回去。
  • 从原中断发生位置继续往下运行。
  • 注意:在返回时,会根据EXC_RETURN的值来决定返回动作。

    3.2 EXC_RETURN


    EXC_RETURN是用于程序从异常中断中返回的。

    根据Cortex-M3的异常处理流程,当发生异常时,CPU先将核心寄存器压入当前堆栈(如果当前是线程模式,则压入PSP堆栈,如果当前是Handler模式,则压入MSP堆栈),然后CPU会将LR设置为一个特殊的值,比如0xFFFFFFFD,然后切换到Handler模式,切换成MSP堆栈,最后进入异常处理例程(异常处理例程总是使用MSP堆栈)。在异常处理例程完成后需要从中断返回时,就将LR的值载入到PC中(通常是BX LR指令,也可以是MOV PC,LR指令,或者POP {…, PC}等指令,只要能将LR赋给PC即可),由于LR的值是0xFFFFFFFD,CPU检测到向PC中载入的是这个特殊值时,就知道是中断返回,于是做中断返回的动作(与压入动作相反:从堆栈中弹出核心寄存器的值,恢复到线程模式或Handler模式等)。

    这里这个特殊的值(0xFFFFFFFD)就是EXC_RETURN,它的特点是高28位全部是1,只有低4位可变化,不同的低4位表示不同的中断返回动作。


    参考资料:

  • 【李述铜】从0到1自己动手写嵌入式操作系统
  • 总结

    以上是生活随笔为你收集整理的Cortex-M3内核中的异常的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。