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

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

至于为什么会提到中断向量表,主要是因为我自己在学习嵌入式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更加离不开汇编,当然中断向量表也是有用的,这就表示我写的这个文章不是没有意义的。

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

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

c语言编写作息时间表_嵌入式杂谈之中断向量表相关推荐

  1. 红旗linux9支持软件,红旗linux系统下载|红旗Linux操作系统9.0正式版下载(c语言编写) 最新版_数码资源网...

    今天带来的红旗Linux操作系统9.0正式版相信是很多从事编程行业人员非常了解的,红旗Linux系统下载是非常专业的c语言编写软件,同时红旗Linux操作系统9.0正式版还拥有开关机加速.Firstc ...

  2. c语言编写对答机器人_用C语言机器人编程

    用 C 语言机器人编程 目前市场上机器人套装或完整的产品, 都提供一个图形化编程界面, 这些编程界面对机 器人入门教育取到了很大的作用. 它使初学者不用了解计算机语言就能进行基本的机器人操 控编程,汉 ...

  3. uml+oopc嵌入式c语言开发精讲_嵌入式开发中更接近底层的汇编与C语言

    分享本文,介绍下更接近硬件底层的C语言与汇编,解释 CPU 如何执行代码. 高级语言与低级语言 学习编程其实就是学习与计算机交流的语言.因为计算机不理解人类语言,通过编译器把人类写的代码转成二进制代码 ...

  4. 语言编写正反星星_厉害!浙理工师生原创短片《星星》入围5个国际电影节

    钱江晚报.小时新闻记者 郑琳 通讯员 聂玉玲 张可盈 日前,一部名为<星星>的原创短片在国际上崭露头角.这部短片接连入围了首尔国际儿童电影节竞赛单元.英国启航电影节电影新人展区.东南亚短片 ...

  5. java语言编写简易表达式_将简单的表达语言放入Java

    小编典典 您可以看到如何传递所有参数: ScriptEngineManager manager = new ScriptEngineManager(); ScriptEngine engine = m ...

  6. windows kernel 可以直接读写文件系统资料吗_嵌入式杂谈之文件系统

    作者:于宙 , 经授权转载:编辑略作调整: 文件系统可以说是嵌入式中绕不开的一大块内容.之前我对文件系统认知一直停留在在U盘格式的理解上,直到接触了嵌入式Linux才发现这里面大有文章,以Linux启 ...

  7. 作用python需要语言编写小游戏_作的解释|作的意思|汉典“作”字的基本解释

    详细字义 ◎ 作 zuō 〈名〉 (1) 作坊,手工业工场 [workshop] 明帝方修宫室而节气不合,-而 礼径至所作,不复重奏,称诏罢民.--<三国志·魏志> 又如:作房(作坊);作 ...

  8. c语言编写对答机器人_来,你也可以用 C 语言写一个聊天机器人

    来,你也可以用 C 语言写一个聊天机器人 你是不是一直在面对着枯燥的 C 语言特性.摸索着前人写过的各种算法,不是因为自己的兴趣,而是依靠自身的毅力,学得很苦吧. 好吧,我们找一个好玩一点的东西,一起 ...

  9. 用Java语言编写ajax设计模式_使用JavaScript发布订阅设计模式实现Ajax请求节流

    1. 说明一下主要逻辑 当我们发送多个请求时使用的时同一个接口,并且这个接口支持多个参数获取多个条数据,而我们不想要每次请求一条数据就发送一条请求 而是在指定的时间段类发送一次请求,得到一些数据,然后 ...

  10. c语言编写对答机器人_机器人 C语言

    #include#include/*机器人面向x轴正方向站在原点.当他接受到一个数字n时开始动作.当n=-1时,机器人左转,n=-2时,右转,n>0时,机器人前进n步.n=0时,结束.输... ...

最新文章

  1. 爬虫521错误(又是一次和可爱的前端vs的故事)
  2. 双语经典:告别单身的必杀技之情话连篇
  3. oracle脚本如何写,怎样写sql脚本
  4. Python类私有方法的陷阱
  5. caffe图像分类教程_跟我上手深度学习: 五分钟尝试第一个深度学习(Caffe)训练和图像分类(详细图文步骤)...
  6. 如何成为一名更出色的开发者?
  7. Enabled AWE
  8. 每日10行代码173:测试下yafu的质因数分解能力
  9. linux小米随身wifi驱动下载,小米随身wifi驱动
  10. android 照片同步到iphone,简明教程教你同步安卓设备照片到iCloud照片流
  11. 微软账户登录 win10 共享
  12. restore和recover区别
  13. 2010年暴笑网络流行语:语不惊人死不休!
  14. Linux下启动Tomcat项目
  15. 怎么把多个图片转成一个文字版的Word呢
  16. SIM卡、USIM卡、UICC卡、eSIM卡的区别
  17. juniper SSG防火墙与飞塔防火墙配置点到点IPSEC ***
  18. SDFormatter资源(免费)
  19. 财务自由之路——为什么选择淘宝(上)
  20. 输出100以内所有含7或7的倍数的值!

热门文章

  1. 可牛影像动感渐隐闪图教程
  2. 大数据管理平台-数据处理与数据集市
  3. 通用型免疫(共)沉淀(IP/Co-IP)工具箱(磁珠)实验
  4. r语言如何计算t分布临界值_「SPSS数据分析」SPSS差异分析(3)独立样本T检验操作步骤及解读...
  5. tvm relay inline pass的调研
  6. 「Golang」sync.Once用法以及源码讲解
  7. Java常量池与方法区
  8. android q mix3,Android Q+5G 小米MIX3流畅播放8K视频
  9. html5制作新年祝福,新年祝福视频制作教程
  10. 行人重识别论文阅读14-Learning by Aligning- Visible-Infrared Person Re-identification