深入内核理解ARM单片机的中断机制
以STM32F407为例,中断执行流程如下:a.中断触发(中断源):外设或内核产生中断信号,置位中断标志位。CPU检测到中断请求,若满足优先级条件(未被更高优先级中断抢占、当前指令执行完毕等),则暂停当前任务。自动保存现场(PC、寄存器等上下文)到栈中。根据中断向量表找到对应ISR地址并跳转执行。在ISR中完成具体功能(如数据读取、状态更新等),需手动清除中断标志位。执行完ISR后,自动恢复现场,
前言:
博主是一枚热爱嵌入式的大二小菜,此博客账号用于记录日常学习笔记以及分享一部分学习心得。本文会用像“交一个女朋友”一样的方法详细介绍中断的定义,结构,保存现场和恢复现场(这是从内核角度理解中断的关键所在),中断向量表以及涉及到的汇编指令,并总结中断执行流程。希望道友看完后不仅对中断有更加深入的了解,也能用此方法理解未来的道侣哈哈。至于为什么要用中断作为博主的第一篇文章呢?嗯…当然与其重要性逃不开,中断在嵌入式中极其重要,甚至在以后学习Freertos的时候,也是理解freertos实现机制的一个关键点,哈哈哈哈,提前剧透博主后面的内容了,下面正式开始中断的介绍:
一、中断是什么?(问她叫什么?)
其实学习就像交往一个女朋友一样,我们得先知道她叫什么,长什么样子,再去深入了解她的内心,类比到这里,我们得先知道中断是什么,有什么样的结构,再深入了解其核心。接下来让我们先看看中断是什么:
百度给的定义:中断是指在CPU执行正常程序时,因外部或内部事件的发生,打断当前程序的执行,转而处理紧急任务,然后再返回原程序继续执行。
博主举个“栗子”:比如博主现在正在宿舍看书,突然听到门外有阿姨敲门查寝,我会在书里面放一个书签(保存现场),然后去开门,阿姨查完寝之后,我再回来打开夹有书签的那一页继续看书(恢复现场)。
博主在“栗子”中写有保存现场和恢复现场,大家可能会有疑问?现场是什么?为什么要保存现场?不要着急,且听博主细细道来。
二、中断的结构(看看她长啥样)
中断结构其实很复杂,有非常多寄存器,但是博主在这里简化为三个部分:中断源 --> 中断控制器(NVIC)--> CPU,以下是博主学习韦东山老师的视频的时候画的一张简图:

上图最左边的中断其实就是中断源,中间的NVIC就是中断控制器,用来选择将哪一个中断信号递交给CPU,注意这里只是把中断标志交给CPU,让CPU判断要不要执行这个中断,其实还没有真正执行中断的内容,具体的中断内容的执行将在后面的中断向量表中详细介绍。
在这里加入了“异常”的概念,其实异常是指来自CPU内部的意外事件,也可以打断CPU当前的执行。异常可以分为:系统异常,内部中断和外部中断,由此可见,中断也是异常的一部分。这里博主主要介绍中断,所以异常就在此一笔带过了哈。
图中只是一个总结的框图,如果需要详细了解如NVIC,中断源等可以参考其他博主的资料,写的非常详细,比博主写的好哈哈哈哈哈哈哈哈哈。
三、中断向量表(函数指针数组)
前面写了这么多,终于到了中断的核心部分之一中断向量表啦,前面讲的中断控制器把中断信号交给CPU之后,如果CPU决定执行该中断,就会在中断向量表中找到对应的中断服务函数入口,那么具体的实现流程是怎么样的呢?博主接下来展开详细介绍:
中断向量表:可能会有一部分道友不是很清楚中断向量表,其实可以把它理解为一个函数指针数组,里面的每个成员都是一个函数指针,指向对应的中断服务函数。
中断服务函数一般是C语言编写的函数(这句话划重点,后面介绍保持现场和恢复现场时会用到)。
那么,中断向量表到底是什么样子呢?博主截了一部分STM32F407中启动文件的图片供道友参考:

各位道友请看,中断向量表其实是汇编文件里面的一部分,从__Vectors开始之后的就是向量表里面的内容,在里面放了很多中断服务函数的入口。例如:初始化堆栈,复位中断,SVC中断等等。
向量表中涉及了一条汇编指令DCD ,在这里简单介绍一下:在汇编语言中, DCD 是用于定义数据的伪指令,其作用是在内存中分配一个或多个32位(4字节)的存储空间,并将指定的数据存储在这些空间中。这也是为什么博主会在这章的标题后面写上函数指针数组,当然这是博主的个人理解哈,仅供参考。
写到这里,博主想预告一下下一篇文章,STM32的启动流程,也和中断向量表离不开,并且会详细介绍一下向量表得地址空间。
四、保存现场和恢复现场(深入了解她的内心)
如果你的女朋友老是说你不懂她不理解她,请不要慌张,认真看完这里,这里我将介绍中断的核心(内心),让你更懂中断,当然也希望道友更懂女朋友的嘛~
所谓现场就是指:R0~R15,xPSR这些CPU寄存器。
这些寄存器被分为两部分:调用者保存的寄存器(R0~R3,R12,LR,xPSR),被调用者保存的寄存器(R4~R11)。
R0~R3:用做调用者与被调用者之间的参数传递。
R4~R15:可能会被调用的函数使用,所以在被调用函数入口保存。
保存现场:保存现场可以分为硬件保存和软件保存两部分,其中硬件负责保存的cpu寄存器有(r0~r3,r12,LR,返回地址,xPSR和已经调用的栈),软件负责保存(r4~r11)。

(图中是硬件保存寄存器的示例)
恢复现场:当中断执行完以后会自动恢复所有保存的寄存器。
补充一丢丢:在调用C函数前,CM3和CM4内核得单片机会将LR置为一个特殊值(EXC_RETURN),用来从栈里恢复现场,更多详细的内核知识可以参考《ARM Cortex-M3权威指南》。
五、总结中断的执行流程
以STM32F407为例,中断执行流程如下:
a.中断触发(中断源):外设或内核产生中断信号,置位中断标志位。
b.中断响应(NVIC-->CPU): CPU检测到中断请求,若满足优先级条件(未被更高优先级中断抢占、当前指令执行完毕等),则暂停当前任务。自动保存现场(PC、寄存器等上下文)到栈中。
c.跳转中断服务函数(ISR):根据中断向量表找到对应ISR地址并跳转执行。
d.中断处理:在ISR中完成具体功能(如数据读取、状态更新等),需手动清除中断标志位。
e.中断返回:执行完ISR后,自动恢复现场,返回原程序继续执行。
关键点:需配置中断优先级分组、使能外设及NVIC中断通道,确保标志位正确清除。
好啦,到这里就全部介绍完啦,道友们如有什么见解欢迎私信交流,我会更正到文章中滴,然后就是工科男写作不易哈哈哈,给个一键三连是对俺最大的鼓励啦٩(๑^o^๑)۶,大家一起加油💪
更多推荐



所有评论(0)