Cortex-M3内核中的异常

本文深入解析Cortex-M3内核中的异常机制,重点介绍PendSV异常如何实现RTOS中的任务切换,包括异常处理流程及EXC_RETURN在中断返回中的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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位表示不同的中断返回动作。


参考资料:

  1. 【李述铜】从0到1自己动手写嵌入式操作系统
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值