嵌入式杂谈之中断向量表

更新时间:2023-05-23 09:28:17 阅读: 评论:0

嵌⼊式杂谈之中断向量表
虽说接触了好久的单⽚机或者说嵌⼊式开发,不过对于有些概念还是⽐较模糊,因此此系列将会从⼀些零碎的⼩知识点出发,慢慢的遍历整张嵌⼊式开发的地图。
这次先来看⼀下中断向量表。
⾄于为什么会提到中断向量表,主要是因为我⾃⼰在学习嵌⼊式Linux开发的过程中,好像学到的所有开始阶段都是要通过汇编完成的,好像没有汇编程序,整套系统就⽆法运⾏,那作为⼀套完整的系统,究竟从上电开始程序究竟是怎么运⾏起来的,发⽣中断的时候,程序⼜是怎么跳转到指定的函数去执⾏的呢,在这⾥将会给⼤家⼀个⼀个具体的轮廓,从感性上理解,究竟系统是怎么⼯作起来的。
程序是从main函数执⾏的吗
⾸先明确⼀点,单⽚机上电开始执⾏的第⼀条指令肯定不是我们在main函数中写的第⼀条指令,在此之前,我们需要汇编程序完成⼀些初始化的⼯作,那么这时候有⼀个问题,hujiang
汇编程序的第⼀条代码从哪⾥开始运⾏的呢??
在ARM架构的芯⽚下,不出意外,程序都是从0X00000000最开始的位置执⾏的,那程序从这⾥运⾏,
接下来要完成什么⼯作呢,那就不得不提到中断向量表,说是中断向量表,不如说是从0X00000000开始的固定的⼀段内容。
over
这段内容以四个字节为单位,每个字节保存⼀个地址,当芯⽚处于不同的状态时,就会根据这段内容跳转到对应的地址去执⾏对应的程序。以Cortex-A7的i.MX6ULL芯⽚为例,可以看到,从0开始的每四个字节对应⼀个中断类型,这个表的顺序是固定的,每个位置存储的都是⼀个要跳转到的地址。
那么知道了每个位置存放⼀个跳转地址之后,我们的程序究竟是怎么开始的。
芯⽚上电程序执⾏流程
当芯⽚上电以后,我们在上⾯表格中寻找⼀个于程序上电⽐较接近的中断,毫⽆意外,我们选择复位中断,平常玩单⽚机的时候,⼤家不都是出了bug,队友就说,复位⼀下单⽚机吧,这⾥的复位可以是我们去按单⽚机的复位按钮,也可以断电重新上电,所以重新上电约等于复位这个思想在我们的脑⼦⾥是根深蒂固的。
nostril那么结果显⽽易见,芯⽚上电了,他发现⾃⼰是重新上电⽽产⽣的复位中断,由上图可知,那么程序会在0X00开始执⾏,但是这个地⽅只保存了⼀个地址,那么程序跳转到0X00之后会⽴马跳转到这个位置保存的地址执⾏,程序就跳转到了另⼀个地⽅,然后在这⾥通过汇编代码进⾏堆栈设置,为C语⾔运⾏创造条件,最后再跳转到main函数执⾏,这才是真正到了main函数。
由具体代码也可以看出来
_start:
micky什么意思ldr pc, =Ret_Handler /* 复位中断 */
ldr pc, =Undefined_Handler /* 未定义指令中断 */
ldr pc, =SVC_Handler /* SVC(Supervisor)中断 */
ofdmldr pc, =PrefAbort_Handler /* 预取终⽌中断 */
ldr pc, =DataAbort_Handler /* 数据终⽌中断 */
ldr pc, =NotUd_Handler /* 未使⽤中断 */王森蛋糕学校
ldr pc, =IRQ_Handler /* IRQ 中断 */
ldr pc, =FIQ_Handler /* FIQ(快速中断)未定义中断 */
# 此处省略好多
/* 复位中断 */
英语校规
Ret_Handler:
# 此处再省略好多
b main /* 跳转到 main 函数 *
上⾯的b代表跳转,后⾯跟什么,就代表跳转到哪⾥
上⾯的_start可以暂时理解为将中断像量表进⾏规定,然后出现复位中断就将pc指针指向复位中断函
数,pc指针表⽰程序运⾏位置,换句话说,pc指针在哪,程序就在哪开始运⾏,这都是arm架构规定的。
同理发⽣了中断,程序跑到那⾥
还是由上表可知,与中断有关的应该是第七和第⼋个,外部中断与快速中断,因此显⽽易见,当中断发⽣时,⽆论当前程序在哪⾥运⾏,都会跑到这个表所指向的地址,在这个地址处,我们就可以编写⾃⼰的中断处理函数了,当然还要涉及到具体的中断号以及中断优先级的判断,这⾥不展开论述
那表中其他内容表⽰什么
其实可以不⽤深究,因为i⼀般情况下,我们只处理复位中断与外部中断的情况,也就是针对这两种情况进⾏程序编写,其他情况⼀律都是视为程序卡死,这也是我们经常遇到的,芯⽚上电了,也没发⽣中断,但是确实没在执⾏程序,主要就是因为我们没有处理其他异常情况,导致程序执⾏出现异常以后没有跳转到合适的地⽅,或者在⼀个地⽅转圈。
forgiven⽐如下⾯程序程序就是进⼊异常处理程序,然后周⽽复始,就给我们造成了,程序卡死的假象。
/* 数据终⽌中断 */
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就是我们刚才说的复位中断,由此可知程序会跳转Ret_Handler接着执⾏,我们再往下跟踪下去
上⾯的汇编代码相当于将main函数地址放⼊R0,然后跳转到这个地址,也就相当于跳转到了main函数
⾄于为什么是_main是因为_main是⼀个C语⾔提供的库函数,在这个函数⾥会跳转到main,所以终究是从这⾥到达main函数的。瓶子用英语怎么说
序号3就是其他的中断向量,⼤家⼀起组成中断向量表,来给我们添⿇烦(哦,不,是给我们带来知识)。
总结来说
汇编程序是必不可少的,就像stm32其实也有,只不过我们⼀般不需要进⾏修改,但是为了更加灵活的掌握,还是不得不去研究,就⽐如说有些店家提供的函数源码就会在汇编中进⾏⼀些⽂件的修改,
我们听说的bootloader更加离不开汇编,当然中断向量表也是有⽤的,这就表⽰我写的这个⽂章不是没有意义的。
希望给⼤家带来了新的收获
了解更多技术⽂章,欢迎关注我的个⼈公众号

本文发布于:2023-05-23 09:28:17,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/119385.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:中断   程序   复位   跳转   地址   函数   开始   中断向量
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图