ARM7中断向量重映射的问题

[复制链接]
4064|14
 楼主| MCU2me 发表于 2013-4-7 22:36 | 显示全部楼层 |阅读模式
有这么一段:
_RAM_STARTADDRESS定义在了SDRAM起始地址,0x0c000000。
//中断向量重映射
for (cc = _RAM_STARTADDRESS;cc < (_RAM_STARTADDRESS + 0x20);cc += 4)
{
  *((volatile unsigned *)cc) = 0xEA000000 + ((unsigned int)Image$$RO$$Base - 0x0c000000 - 8) / 4;
}
功能是把向量表重映射到0x0c000000之后的任意位置。
大概的意思是明白了,0xEA是‘b’的反汇编。Image$$RO$$Base放的是重映射的向量表首地址。-8是因为三级流水线。对最后为什么要 /4不理解……

huangxz 发表于 2013-4-7 23:02 | 显示全部楼层
本帖最后由 huangxz 于 2013-4-7 23:05 编辑

4字节对齐?没那么简单感觉楼主这个表达式有问题
 楼主| MCU2me 发表于 2013-4-8 08:36 | 显示全部楼层
huangxz 发表于 2013-4-7 23:02
4字节对齐?没那么简单感觉楼主这个表达式有问题

程序应该是好用的,随板子自带的程序。
我感觉不用/4呀……
huangxz 发表于 2013-4-8 09:52 | 显示全部楼层
MCU2me 发表于 2013-4-8 08:36
程序应该是好用的,随板子自带的程序。
我感觉不用/4呀……

不太可能啊,中断向量向量难道都是同一个地址?
 楼主| MCU2me 发表于 2013-4-8 10:08 | 显示全部楼层
huangxz 发表于 2013-4-8 09:52
不太可能啊,中断向量向量难道都是同一个地址?

有个for循环嘛。每次+4了
huangxz 发表于 2013-4-8 10:09 | 显示全部楼层
MCU2me 发表于 2013-4-8 10:08
有个for循环嘛。每次+4了

+4是在表达左边,而表达式又边是常数喱
 楼主| MCU2me 发表于 2013-4-8 10:15 | 显示全部楼层
huangxz 发表于 2013-4-8 10:09
+4是在表达左边,而表达式又边是常数喱

右边不是常数。0xEA是一条反汇编,b。
huangxz 发表于 2013-4-8 10:24 | 显示全部楼层
MCU2me 发表于 2013-4-8 10:15
右边不是常数。0xEA是一条反汇编,b。

0xEA000000 + ((unsigned int)Image$$RO$$Base - 0x0c000000 - 8) / 4;

0xEA000000 是常数吧
Image$$RO$$Base也是常数

没有变量啊

评论

右边是一条语句,不是常数,再结合看一下楼下的回答~  发表于 2013-4-8 11:13
john_lee 发表于 2013-4-8 10:33 | 显示全部楼层
跳转指令的 offset 是以 4 字节为单位的,CPU 会把 offset 左移两位(乘4)并符号扩展到 32 位,然后加到 PC 上。
Branch instructions contain a signed 2's complement 24 bit offset. This is shifted left two bits, sign extended to 32 bits, and added to the PC.
所以在合成跳转指令时,要把目标地址右移两位(除4)。

评论

大神啊……  发表于 2013-4-8 11:14

评分

参与人数 1威望 +3 收起 理由
MCU2me + 3

查看全部评分

 楼主| MCU2me 发表于 2013-4-8 11:19 | 显示全部楼层
感谢版主大神~越发觉得汇编深不可测……
huangxz 发表于 2013-4-8 11:24 | 显示全部楼层
john_lee 发表于 2013-4-8 10:33
跳转指令的 offset 是以 4 字节为单位的,CPU 会把 offset 左移两位(乘4)并符号扩展到 32 位,然后加到 P ...

版主解释了b指令的用法,但是并未解释为啥表达式右侧不是常数
b ((unsigned int)Image$$RO$$Base - 0x0c000000 - 8)/4
中断向量是个表,在arm7里面有8个向量地址
这8个地址起码有几个是不一样的,不可能8个向量都一样啊,

这是个典型的向量表

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
江枫渔火 发表于 2013-4-8 12:24 | 显示全部楼层
我看到AT91芯片重定向时,直接拷贝ROM(开头的向量部分)到RAM就行了。不用搞这么麻烦啰嗦
 楼主| MCU2me 发表于 2013-4-8 13:07 | 显示全部楼层
huangxz 发表于 2013-4-8 11:24
版主解释了b指令的用法,但是并未解释为啥表达式右侧不是常数
b ((unsigned int)Image$$RO$$Base - 0x0c00 ...

右侧是一个相对于PC的跳转。左侧在每次循环改变基地址。这么说明白了吧~?
 楼主| MCU2me 发表于 2013-4-8 13:10 | 显示全部楼层
江枫渔火 发表于 2013-4-8 12:24
我看到AT91芯片重定向时,直接拷贝ROM(开头的向量部分)到RAM就行了。不用搞这么麻烦啰嗦 ...

它可能是要实现这样一个功能,Uboot定义了向量表在0x0c000000,但我调试的时候可以选择其后的某个地址开始,比如把RO定义在0x0c008000
xinzha 发表于 2013-4-8 16:52 | 显示全部楼层
b是根据当前pc的相对跳转,因为你每一个入口点的pc值不一样,所以即使一模一样的b指令也是跳往不同的地址。

评论

说的没错!  发表于 2013-4-8 18:51
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

79

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部