首页 > 其他分享 >STM32单片机芯片与内部20 中断管理

STM32单片机芯片与内部20 中断管理

时间:2024-12-14 13:02:10浏览次数:7  
标签:优先级 20 入栈 中断 fault STM32 单片机 服务例程 异常

目录

一、中断/异常的响应序列

1、入栈

2、取向量

3、更新寄存器

二、异常返回

三、嵌套中断

四、咬尾中断

五、晚到异常

六、异常返回值

七、中断延迟

八、异常相应期间的faults

1、入栈期间

2、出栈期间

3、取向量期间

4、无效返回时


        前面有提到定时器中断、外部中断,这个中断究竟是个什么呢?

一、中断/异常的响应序列

当CM3开始响应一个中断时:

  • 入栈: 把8个寄存器的值压入栈
  • 取向量:从向量表中找出对应的服务程序入口地址
  • 选择堆栈指针MSP/PSP,更新堆栈指针SP,更新连接寄存器LR,更新程序计数器PC

1、入栈

        响应异常的第一个行动,就是自动保存现场的必要部分:依次把xPSR, PC, LR, R12以及R3‐R0由硬件自动压入适当的堆栈中:如果当响应异常时,当前的代码正在使用PSP,则压入PSP,即使用线程堆栈;否则压入MSP,使用主堆栈。一旦进入了服务例程,就将一直使用主堆栈。

2、取向量

        当数据总线(系统总线)正在为入栈操作而忙得团团转时,指令总线(I‐Code总线)可不是凉快地坐着看热闹——它正在为响应中断紧张有序地执行另一项重要的任务:从向量表中找出正确的异常向量,然后在服务程序的入口处预取指。由此可以看到各自都有专用总线的好处:入栈与取指这两个工作能同时进行

3、更新寄存器

在入栈和取向量的工作都完毕之后,执行服务例程之前,还要更新一系列的寄存器:

  • SP:在入栈中会把堆栈指针(PSP或MSP)更新到新的位置。在执行服务例程后,将由MSP负责对堆栈的访问。
  • PSR: IPSR位段(地处PSR的最低部分)会被更新为新响应的异常编号。
  • PC:在向量取出完毕后, PC将指向服务例程的入口地址,
  • LR: LR的用法将被重新解释,其值也被更新成一种特殊的值,称为“EXC_RETURN”,并且在异常返回时使用。 EXC_RETURN的二进制值除了最低4位外全为1,而其最低4位则有另外的含义

        以上是在响应异常时通用寄存器的变化。另一方面,在NVIC中,也伴随着更新了与之相关的若干寄存器。例如,新响应异常的悬起位将被清除,同时其活动位将被置位。

二、异常返回

        当异常服务例程执行完毕后,需要很正式地做一个“异常返回”动作序列,从而恢复先前的系统状态,才能使被中断的程序得以继续执行。从形式上看,有3种途径可以触发异常返回序列,不管使用哪一种,都需要用到先前储的LR的值。

  • 出栈:先前压入栈中的寄存器在这里恢复。内部的出栈顺序与入栈时的相对应,堆栈指针的值也改回去。
  • 更新NVIC寄存器:伴随着异常的返回,它的活动位也被硬件清除。对于外部中断,倘若中断输入再次被置为有效,悬起位也将再次置位,新一次的中断响应序列也可随之再次开始。

三、嵌套中断

        事实上,我们要做的就只是为每个中断适当地建立优先级,不用再操心别的。

  1. NVIC和CM3处理器会为我们排出优先级解码的顺序。因此,在某个异常正在响应时,所有优先级不高于它的异常都不能抢占之,而且它自己也不能抢占自己
  2. 有了自动入栈和出栈,就不用担心在中断发生嵌套时,会使寄存器的数据损毁,从而可以放心地执行服务例程。

        所有服务例程都只使用主堆栈。所以当中断嵌套加深时,对主堆栈的压力会增大:每嵌套一级,就至少再需要8个字,即32字节的堆栈空间——而且这还没算上ISR对堆栈的额外需求,并且何时嵌套多少级也是不可预料的。如果主堆栈的容量本来就已经所剩无几了,中断嵌套又突然加深,则主堆栈有被用穿的凶险。

        相同的异常是不允许重入的。因为每个异常都有自己的优先级,并且在异常处理期间,同级或低优先级的异常是要阻塞的,因此对于同一个异常,只有在上次实例的服务例程执行完毕后,方可继续响应新的请求。

四、咬尾中断

        当处理器在响应某异常时,如果又发生其它异常,但它们优先级不够高,则被阻塞。那么在当前的异常执行返回后,系统处理悬起的异常时,倘若还是先POP然后又把POP出来的内容PUSH回去,这是白白浪费CPU时间

五、晚到异常

        刚才说的是低优先级或同优先级被阻塞,那更高的优先级呢

        当CM3对某异常的响应序列还处在早期:入栈的阶段,尚未执行其服务例程时,如果此时收到了高优先级异常的请求,则本次入栈就成了为高优先级中断所做的了——入栈后,将执行高优先级异常的服务例程

  • 中断进入阶段:

    • 当发生中断时,处理器首先会将当前的上下文(包括程序计数器PC、程序状态寄存器xPSR等)入栈,以便中断处理完后能够恢复执行。
    • 如果当前中断发生时,正在执行的代码还没有完全进入中断服务例程的执行(例如,还没有完成入栈操作),并且此时收到了比当前中断更高优先级的中断请求,那么 高优先级的中断会打断当前中断的入栈过程,立即开始执行高优先级的中断服务例程。
  • 中断嵌套:

    • 一旦中断服务例程(ISR)开始执行,即使更高优先级的中断到来,也不会打断当前正在执行的ISR。处理器会等待当前ISR执行完毕,才会开始处理更高优先级的中断。
    • 所以,只有在ISR执行完毕后,Cortex-M3才会检查是否有更高优先级的中断需要处理。

六、异常返回值

        在进入异常服务程序后, LR的值被自动更新为特殊的EXC_RETURN,这是一个高28位全为1的值,只有[3:0]的值有特殊含义。当异常服务例程把这个值送往PC时,就会启动处理器的中断返回序列。因为LR的值是由CM3自动设置的,所以只要没有特殊需求,就不要改动它。

合法的EXC_RETURN值共3个

        主程序在Handler模式下运行,则在服务例程中LR=0xFFFF_FFF1(主程序被打断前的LR已被自动入栈)。这时的“主程序”,其实更可能是被抢占的服务例程。事实上,在嵌套时,更深层ISR所看到的LR总是0xFFFF_FFF1。

        如果主程序在线程模式下运行,并且在使用MSP时被中断 ,则在服务例程中LR=0xFFFF_FFF9(主程序被打断前的LR已被自动入栈)。

        如果主程序在线程模式下运行 ,并且在使用PSP时被中断 ,则在服务例程中LR=0xFFFF_FFFD(主程序被打断前的LR已被自动入栈)。

七、中断延迟

        中断延迟的定义是:从检测到某中断请求,到执行了其服务例程的第一条指令时,已经流逝了的时间。在CM3中,若存储器系统够快,且总线系统允许入栈与取指同时进行,同时该中断可以立即响应,则中断延迟是雷打不动的12周期(满足硬实时所要求的确定性)。在这12个周期里,处理器内部一直开足马力,进行了入栈、取向量、更新寄存器以及服务例程取指的一系列操作。但若存储器太慢以至于引入等待周期,或者还有其它因素,则会引入额外的延时。

        当处理咬尾中断时,省去了堆栈操作,因此切入新异常服务例程的耗时可以短至6周期。有些指令需要较多的周期才能完成。它们是除法指令,双字传送指令LDRD/STRD以及多重数据传送指令(LDM/STM)。

        对于前两者, CM3将为了保证中断及时响应而取消它们的执行,待返回后重新开始——这牺牲了一点性能,以及某些子程序的一点个人利益,但换来了对意外事件的更快救援。

八、异常相应期间的faults

        Faults是运行时发生各种故障的表现,在中断响应期间的故障也不例外。中断响应的每一步骤都可以触发faults。

1、入栈期间

        如果在入栈期间引起了总线fault,则本次入栈操作将被强行中止,并且把总线异常悬起或者在允许时立即响应。若除能了总线fault,则此次故障将成为“硬伤”——上访至硬fault。

        在总线fault被使能的情况下,如果它的优先级比正在响应的异常高,则抢占之,否则将悬起直到引起fault的异常执行完毕。这种情况被称为“入栈错误” (stacking error),由总线fault状态寄存器(BFSR,地址: 0xE000_ED29)的STKERR位指示(位偏移: 4)。

        如果入栈操作引起MPU访问违例,则产生存储管理fault,并且必须立即执行MemFault服务例程,否则将无条件上访成硬fault。在发生入栈时访问违例时,存储管理fault寄存器(MFSR,地址:0xE000_ED28)中的MSTKERR位(位偏移: 4)被置位,用于指示该fault。

2、出栈期间

        如果在中断返回时的出栈期间引起了总线fault,则本次出栈操作将被强行中止,并且把总线异常悬起或立即响应。若除能了总线fault,则此次故障将成为“硬伤”——上访至硬fault。其它情况下,只要总线fault的优先级比当前的高(也包括比当前最深嵌套的优先级高),则可以立即响应。这种情况称为“出栈错误”(unstacking error),由BFSR.3指示(UNSTKERR位)。

        类似地,如果是因MPU访问违例造成的MemManage fault,由MFSR.3(MUNSTKERR)指示。且MemManage fault的服务例程必须能立即执行,否则无条件硬fault。

3、取向量期间

        若是在取向量期间发生总线fault,则比较罕见,这也是最严重的,因此直接上硬fault (MPU的限制则管不着取向量操作——译者注)。这种情况,由硬fault状态寄存器(HFSR,地址: 0xE000_ED2C)中的VECTTBL位(位偏移: 1)来指示。

4、无效返回时

        如果LR中的EXC_RETURN不是合法的值(合法值见表9.4,包括企图返回ARM状态),则引起用法fault。如果用法fault被除能,也上访成硬fault。此时,用法Fault状态寄存器(UFSR,地址: 0xE000_ED2A)中的INVPC位(位偏移: 2),或者是INVSTATE位(位偏移: 1)置位。

标签:优先级,20,入栈,中断,fault,STM32,单片机,服务例程,异常
From: https://blog.csdn.net/qq_39376872/article/details/144364351

相关文章

  • STM32单片机芯片与内部21 电源管理——低功耗 睡眠模式 停止模式 待机模式
    目录一、SMT32电源框图1、ADC电源与参考电压VDDA2、调压器供电电路VDD/1.8V3、备份域电路二、电源监控器1、上电复位与掉电复位(POR与PDR)2、可编程电压检测器PVD三、功耗模式1、睡眠模式2、停止模式3、待机模式        电源对电子设备的重要性不言而喻,它......
  • sql server 2008 r2 展开时报错:参数名:viewInfo ( Microsoft SqlServer Management S
    HR服务器的数据库报了一个不常见的错误,记录下来分享给大伙,如果遇到同样的问题,希望可以得到解决。服务器环境:windowsserver2008(64Bit)数据库版本:SQLserver2008R2错误提示:值不能为空。参数名:viewInfo(Microsoft.SqlServer.Management.SqlStudio.Expl;如下图:  在路径:C:\Us......
  • 特斯拉 Model Y 2022 款与 2024 款置换评估报告--多个AI对话模型能力测评报告
    特斯拉ModelY2022款与2024款置换评估报告题目:车主买modelY2022款花了280900元,贷款5年,首付是130000元,五年贷款有利息,月缴费是3072元,缴费了25个月,该车还贴了7242车身膜,2000的玻璃膜,第三方评估价值160000元,偿还招商银行的未还的金额后剩余的钱可以用来当新款的首付,考......
  • 2024.12.13 周五
    2024.12.13周五Q1.1000Polycarphasaproblem—hislaptopkeyboardisbroken.Now,whenhepressesthe'b'key,itactslikeanunusualbackspace:itdeletesthelast(rightmost)lowercaseletterinthetypedstring.Iftherearenolowercase......
  • 2024-2025-1 20241329 《计算机基础与程序设计》第十二周学习总结
    作业信息作业归属课程:2024-2025-1-计算机基础与程序设计作业要求:2024-2025-1计算机基础与程序设计第十二周作业作业目标:《C语言程序设计》第11章作业正文:2024-2025-120241329《计算机基础与程序设计》第十二周学习总结教材学习内容总结《C语言程序设计》第11章1.指针和......
  • 6个200以内的等差质数
    目录题目描述算法思路代码实现后记无注释满分代码代码如下:题目描述需要找到6个200一内的等差质数,没有输入,直接输出找到的这6个等差质数。算法思路1.此题没有输入数据,直接输出。2.了解等差数。等差数列是指从第二项起,每一项与它的前一项的差等于同一个常数的......
  • 20_需求分析报告(第三章)
    3不动产登记业务流程3.1总体业务流程整体业务流程利用“互联网+”模式,实现线上线下一体化的不动产登记业务办理。总体业务流程如图3.1所示:图3.1总体业务流程流程设计说明:第一部分:保证业务能够正常办理的基础数据部分。包括测绘的前置、测绘的监管、以图管不动产实现权......
  • 20222415 2024-2025-1 《网络与系统攻防技术》实验七实验报告
    1.实验内容1.实验内容(1)简单应用SET工具建立冒名网站(2)ettercapDNSspoof(3)结合应用两种技术,用DNSspoof引导特定访问到冒名网站。2.实验过程(1)简单应用SET工具建立冒名网站systemctlstartapache2开启apache2服务,然后输入setoolkit,进入set工具后选择1,社会工程学攻击再选2,......
  • 2024-2025-1 20241322 《计算机基础与程序设计》第十二周学习总结
    2024-2025-120241322《计算机基础与程序设计》第十二周学习总结作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK12这个作业的目标《C语言程序设计》......
  • 20222411 2024-2025-2 《网络与系统攻防技术》实验八实验报告
    1.实验内容1.1实验内容及要求(1)Web前端HTML能正常安装、启停Apache。理解HTML,理解表单,理解GET与POST方法,编写一个含有表单的HTML。(2)Web前端javascipt理解JavaScript的基本功能,理解DOM。在(1)的基础上,编写JavaScript验证用户名、密码的规则。在用户点击登陆按钮后回显“欢迎......