OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5840|回复: 5

关于imx6ul的中断向量表创建的疑惑

[复制链接]

2

主题

5

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2019-1-23
在线时间
19 小时
发表于 2019-11-5 17:42:17 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 可怕派 于 2019-11-5 17:43 编辑

新人看原子哥教程时有惑,为什么下面一连串的“ldr pc”指令是创建一个向量表(即将以下的中断函数的地址放在内存相应的地方),我对于下面这几行代码的理解是“ldr pc”指令用于跳到相应的函数去执行,而不是将中断函数的地址放在内存某个位置形成一个中断向量表,求解?,而且pc寄存器不是会被覆盖吗?
_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(快速中断)未定义中断                         */

最佳答案

查看完整内容[请看2#楼]

前8个地址是异常入口,这些异常入口都对应这指定的异常,这个是CPU定义好的。当异常发生(中断)的时候就会直接跳转到这些地址处,然后运行这些地址出对应的指令,比如复位中断的话就是0x0地址,然后0x0地址出的指令就是ldr pc,=Rest_Handler,也就是向pc寄存器加载Reset_Handler函数地址,不就是跳转到Reset_Handler函数了吗?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2019-11-5 17:42:18 | 显示全部楼层
前8个地址是异常入口,这些异常入口都对应这指定的异常,这个是CPU定义好的。当异常发生(中断)的时候就会直接跳转到这些地址处,然后运行这些地址出对应的指令,比如复位中断的话就是0x0地址,然后0x0地址出的指令就是ldr pc,=Rest_Handler,也就是向pc寄存器加载Reset_Handler函数地址,不就是跳转到Reset_Handler函数了吗?
回复

使用道具 举报

9

主题

890

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2390
金钱
2390
注册时间
2019-9-25
在线时间
397 小时
发表于 2019-11-5 21:41:53 | 显示全部楼层
我个人的理解是:将中断函数的地址放在内存某个位置形成一个中断向量表,哪个中断发生执行哪个。
ldr pc,=labr 伪指令,表示从内存的某个位置读出数据,并赋给pc寄存器,如果Reset_Handler 发生,上面的ldr pc, =Reset_Handler 执行完了,如果此时有PrefAbort_Handler终端发生,他会继续执行PrefAbort_Handler这个中断。
回复

使用道具 举报

3

主题

91

帖子

1

精华

高级会员

Rank: 4

积分
977
金钱
977
注册时间
2016-12-8
在线时间
398 小时
发表于 2019-11-6 01:12:50 | 显示全部楼层
我想,应该是这样理解的  ldr pc, =Reset_Handle ~ldr pc, =FIQ_Handler 这个8条汇编指令,存放的地址分别是0x0、0x4、0x8....0x1C,
这些地址就是这些异常向量的入口地址,当CPU发生异常的时候,就跳转到对应入口地址执里面存放的指令。楼主说的pc会被覆盖的问题,然而PC并不会被覆盖,因为上面的程序并不是一条条按顺序往下执行的。还有我前面说的,也许看一下反汇编就更好理解了,由于代码会被复制到DDR,链接地址是0x87800000,所以从反汇编看这些异常向量被存放到了0x87800000~0x8780001C这些地址里。
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2019-8-27
在线时间
4 小时
发表于 2020-3-10 09:57:38 | 显示全部楼层
这和Cortex-M中断处理是有区别的,Cortex-M中断向量表存放的是中断处理函数的入口地址。而A7中断向量表存放的是指令,可以这样理解么
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2017-10-30
在线时间
2 小时
发表于 2020-11-27 16:32:16 | 显示全部楼层
zuozhongkai 发表于 2019-11-5 17:42
前8个地址是异常入口,这些异常入口都对应这指定的异常,这个是CPU定义好的。当异常发生(中断)的时候就会直 ...

如果是这样,那么每个中断所能寻址的范围就不是32位的地址范围了吧,因为将ldr pc, =handler翻译成机器码,如果hanlder是32位的,那翻译后的机器码岂不是超过了四个字节,会影响后面中断表的设置?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-25 19:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表