Cortex-M3内核中的异常
发布日期:2021-07-01 04:22:05 浏览次数:35 分类:技术文章

本文共 1059 字,大约阅读时间需要 3 分钟。

文章目录

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堆栈)。

步骤如下:

  1. 执行返回指令,如BX LR。
  2. 恢复先前入栈的寄存器,出栈顺序与入栈时的相对应,堆栈指针的值也改回去。
  3. 从原中断发生位置继续往下运行。

注意:在返回时,会根据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位表示不同的中断返回动作。


参考资料:

转载地址:https://muzimin.blog.csdn.net/article/details/101098376 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Linux中目录结构
下一篇:16位汇编相关寄存器

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年03月31日 20时11分42秒