嵌入式杂谈之中断向量表

嵌入式杂谈之中断向量表虽说接触了好久的单片机或者说嵌入式开发 不过对于有些概念还是比较模糊 因此此系列将会从一些零碎的小知识点出发 慢慢的遍历整张嵌入式开发的地图 这次先来看一下中断向量表 至于为什么会提到中断向量表 主要是因为我自己在学习嵌入式 Linux 开发的过程中 好像学到的所有开始阶段都是要通过汇编完成的 好像没有汇编程序 整套系统就无法运行 那作为一套完整的系统 究竟从上电开始程序究竟是怎么运行起来的 发生

虽说接触了好久的单片机或者说嵌入式开发,不过对于有些概念还是比较模糊,因此此系列将会从一些零碎的小知识点出发,慢慢的遍历整张嵌入式开发的地图。

这次先来看一下中断向量表。

至于为什么会提到中断向量表,主要是因为我自己在学习嵌入式Linux开发的过程中,好像学到的所有开始阶段都是要通过汇编完成的,好像没有汇编程序,整套系统就无法运行,那作为一套完整的系统,究竟从上电开始程序究竟是怎么运行起来的,发生中断的时候,程序又是怎么跳转到指定的函数去执行的呢,在这里将会给大家一个一个具体的轮廓,从感性上理解,究竟系统是怎么工作起来的。

程序是从main函数执行的吗???

首先明确一点,单片机上电开始执行的第一条指令肯定不是我们在main函数中写的第一条指令,在此之前,我们需要汇编程序完成一些初始化的工作,那么这时候有一个问题,

汇编程序的第一条代码从哪里开始运行的呢??

ARM架构的芯片下,不出意外,程序都是从0X00000000最开始的位置执行的,那程序从这里运行,接下来要完成什么工作呢,那就不得不提到中断向量表,说是中断向量表,不如说是从0X00000000开始的固定的一段内容。
这段内容以四个字节为单位,每个字节保存一个地址,当芯片处于不同的状态时,就会根据这段内容跳转到对应的地址去执行对应的程序。
以Cortex-A7的i.MX6ULL芯片为例,可以看到,从0开始的每四个字节对应一个中断类型,这个表的顺序是固定的,每个位置存储的都是一个要跳转到的地址。
嵌入式杂谈之中断向量表






那么知道了每个位置存放一个跳转地址之后,我们的程序究竟是怎么开始的。

芯片上电程序执行流程

当芯片上电以后,我们在上面表格中寻找一个于程序上电比较接近的中断,毫无意外,我们选择复位中断,平常玩单片机的时候,大家不都是出了bug,队友就说,复位一下单片机吧,这里的复位可以是我们去按单片机的复位按钮,也可以断电重新上电,所以重新上电约等于复位这个思想在我们的脑子里是根深蒂固的。
那么结果显而易见,芯片上电了,他发现自己是重新上电而产生的复位中断,由上图可知,那么程序会在0X00开始执行,但是这个地方只保存了一个地址,那么程序跳转到0X00之后会立马跳转到这个位置保存的地址执行,程序就跳转到了另一个地方,然后在这里通过汇编代码进行堆栈设置,为C语言运行创造条件,最后再跳转到main函数执行,这才是真正到了main函数。
由具体代码也可以看出来




_start: ldr pc, =Reset_Handler /* 复位中断 */ ldr pc, =Undefined_Handler /* 未定义指令中断 */ ldr pc, =SVC_Handler /* SVC(Supervisor)中断 */ ldr pc, =PrefAbort_Handler /* 预取终止中断 */ ldr pc, =DataAbort_Handler /* 数据终止中断 */ ldr pc, =NotUsed_Handler /* 未使用中断 */ ldr pc, =IRQ_Handler /* IRQ 中断 */ ldr pc, =FIQ_Handler /* FIQ(快速中断)未定义中断 */ # 此处省略好多 /* 复位中断 */ Reset_Handler: # 此处再省略好多 b main /* 跳转到 main 函数 * 

上面的b代表跳转,后面跟什么,就代表跳转到哪里
上面的_start可以暂时理解为将中断像量表进行规定,然后出现复位中断就将pc指针指向复位中断函数,pc指针表示程序运行位置,换句话说,pc指针在哪,程序就在哪开始运行,这都是arm架构规定的。

同理发生了中断,程序跑到那里???

还是由上表可知,与中断有关的应该是第七和第八个,外部中断与快速中断,因此显而易见,当中断发生时,无论当前程序在哪里运行,都会跑到这个表所指向的地址,在这个地址处,我们就可以编写自己的中断处理函数了,当然还要涉及到具体的中断号以及中断优先级的判断,这里不展开论述

那表中其他内容表示什么???

其实可以不用深究,因为i一般情况下,我们只处理复位中断与外部中断的情况,也就是针对这两种情况进行程序编写,其他情况一律都是视为程序卡死,这也是我们经常遇到的,芯片上电了,也没发生中断,但是确实没在执行程序,主要就是因为我们没有处理其他异常情况,导致程序执行出现异常以后没有跳转到合适的地方,或者在一个地方转圈
比如下面程序程序就是进入异常处理程序,然后周而复始,就给我们造成了,程序卡死的假象。

/* 数据终止中断 */ DataAbort_Handler: ldr r0, =DataAbort_Handler bx r0 
  1. 复位中断(Rest)。 CPU 复位以后就会进入复位中断,我们可以在复位中断服务函数里面
    做一些初始化工作,比如初始化 SP 指针、 DDR 等等。

  2. 未定义指令中断(Undefined Instruction),如果指令不能识别的话就会产生此中断。
  3. 软中断(Software Interrupt,SWI),由 SWI 指令引起的中断, Linux 的系统调用会用 S WI指令来引起软中断,通过软中断来陷入到内核空间。
  4. 指令预取中止中断(Prefetch Abort),预取指令的出错的时候会产生此中断。
  5. 数据访问中止中断(Data Abort),访问数据出错的时候会产生此中断。
  6. IRQ 中断(IRQ Interrupt),外部中断,前面已经说了,芯片内部的外设中断都会引起此
    中断的发生。

  7. FIQ 中断(FIQ Interrupt),快速中断,如果需要快速处理中断的话就可以使用

最后大家可以看一下stm32的启动文件

序号1单词为vector正好就是向量的意思,也从另一方面说明这是中断向量表。

序号2就是我们刚才说的复位中断,由此可知程序会跳转Reset_Handler接着执行,我们再往下跟踪下去
嵌入式杂谈之中断向量表
上面的汇编代码相当于将main函数地址放入R0,然后跳转到这个地址,也就相当于跳转到了main函数
至于为什么是_main是因为_main是一个C语言提供的库函数,在这个函数里会跳转到main,所以终究是从这里到达main函数的。






序号3就是其他的中断向量,大家一起组成中断向量表,来给我们添麻烦(哦,不,是给我们带来知识)。

总结来说

汇编程序是必不可少的,就像stm32其实也有,只不过我们一般不需要进行修改,但是为了更加灵活的掌握,还是不得不去研究,就比如说有些店家提供的函数源码就会在汇编中进行一些文件的修改,我们听说的bootloader更加离不开汇编,当然中断向量表也是有用的,这就表示我写的这个文章不是没有意义的。

希望给大家带来了新的收获

了解更多技术文章,欢迎关注我的个人公众号

嵌入式杂谈之中断向量表

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/206145.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午4:21
下一篇 2026年3月19日 下午4:22


相关推荐

  • 【高数】高数第七章节——微分方程概念&一阶微分方程&高阶微分方程

    【高数】高数第七章节——微分方程概念&一阶微分方程&高阶微分方程高数第七章节 微分方程概念 amp 一阶微分方程 amp 高阶微分方程 1 微分方程的基本概念 1 1 微分方程的定义 1 2 解微分方程 1 3 基本概念 2 一阶微分方程 2 1 微分方程的解 2 2 微分方程的通解不一定包括所有的解 2 3 微分方程解法一 可分离变量的微分方程 2 3 1 可分离变量的微分方程的定义 y dy x dx phi y dy psi x dx y dy x dx2 3 2 求通解的步骤 2 3 3 例题 两端积分求通解 2 4 微分方程解法二 一阶线性微分方程 2 4 1 线

    2026年3月18日
    3
  • 回归分析数学建模_matlab 回归分析

    回归分析数学建模_matlab 回归分析一元线性回归变量之间的关系大致可分为两大类:确定性的关系:可以用精确的函数关系来表达。例如矩形面积S与边长a,b的关系。非确定性的关系:变量之间既互相联系但又不是完全确定的关系,称为相关关系。例如人的身高与体重、农作物产量与降雨量等的关系。从数量的角度去研究这种非确定性的关系,是数理统计的一个任务.包括通过观察和试验数据去判断变量之间有无关系,对其关系大小作数量上的估计、推断和预测,等等.回归分析就是研究相关关系的一种重要的数理统计方法.一元正态线性回归模型只有两个变量的回归分析,称

    2025年6月12日
    4
  • phpstorm2020激活码【在线破解激活】

    phpstorm2020激活码【在线破解激活】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月16日
    116
  • maven本地仓库配置文件_maven默认仓库地址

    maven本地仓库配置文件_maven默认仓库地址maven配置本地仓库

    2026年2月21日
    6
  • 欧拉角_欧拉角 图

    欧拉角_欧拉角 图欧拉角来源 https://www.zhihu.com/question/47736315参考 https://zhuanlan.zhihu.com/p/45404840为何

    2022年8月2日
    13
  • python 矩阵乘法

    python 矩阵乘法python 矩阵乘法 python 矩阵有两种形式 array 和 matrix 对象 它们的区别在这里就不说了 下面介绍相关乘法 1 np multiply 对 array 和 matrix 对象的操作相同 1 a 和 b 维度相同都是每行对应元素相乘 即对应内积的第一步 不求和 gt gt gt a np array 1 2 1 2 gt gt

    2026年3月20日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号