打印

ARM7中断向量重映射的问题

[复制链接]
3249|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呀……

不太可能啊,中断向量向量难道都是同一个地址?

使用特权

评论回复
5
MCU2me|  楼主 | 2013-4-8 10:08 | 只看该作者
huangxz 发表于 2013-4-8 09:52
不太可能啊,中断向量向量难道都是同一个地址?

有个for循环嘛。每次+4了

使用特权

评论回复
6
huangxz| | 2013-4-8 10:09 | 只看该作者
MCU2me 发表于 2013-4-8 10:08
有个for循环嘛。每次+4了

+4是在表达左边,而表达式又边是常数喱

使用特权

评论回复
7
MCU2me|  楼主 | 2013-4-8 10:15 | 只看该作者
huangxz 发表于 2013-4-8 10:09
+4是在表达左边,而表达式又边是常数喱

右边不是常数。0xEA是一条反汇编,b。

使用特权

评论回复
8
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也是常数

没有变量啊

使用特权

评论回复
评论
MCU2me 2013-4-8 11:13 回复TA
右边是一条语句,不是常数,再结合看一下楼下的回答~ 
9
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)。

使用特权

评论回复
评论
MCU2me 2013-4-8 11:14 回复TA
大神啊…… 
评分
参与人数 1威望 +3 收起 理由
MCU2me + 3
10
MCU2me|  楼主 | 2013-4-8 11:19 | 只看该作者
感谢版主大神~越发觉得汇编深不可测……

使用特权

评论回复
11
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个向量都一样啊,

这是个典型的向量表

使用特权

评论回复
12
江枫渔火| | 2013-4-8 12:24 | 只看该作者
我看到AT91芯片重定向时,直接拷贝ROM(开头的向量部分)到RAM就行了。不用搞这么麻烦啰嗦

使用特权

评论回复
13
MCU2me|  楼主 | 2013-4-8 13:07 | 只看该作者
huangxz 发表于 2013-4-8 11:24
版主解释了b指令的用法,但是并未解释为啥表达式右侧不是常数
b ((unsigned int)Image$$RO$$Base - 0x0c00 ...

右侧是一个相对于PC的跳转。左侧在每次循环改变基地址。这么说明白了吧~?

使用特权

评论回复
14
MCU2me|  楼主 | 2013-4-8 13:10 | 只看该作者
江枫渔火 发表于 2013-4-8 12:24
我看到AT91芯片重定向时,直接拷贝ROM(开头的向量部分)到RAM就行了。不用搞这么麻烦啰嗦 ...

它可能是要实现这样一个功能,Uboot定义了向量表在0x0c000000,但我调试的时候可以选择其后的某个地址开始,比如把RO定义在0x0c008000

使用特权

评论回复
15
xinzha| | 2013-4-8 16:52 | 只看该作者
b是根据当前pc的相对跳转,因为你每一个入口点的pc值不一样,所以即使一模一样的b指令也是跳往不同的地址。

使用特权

评论回复
评论
MCU2me 2013-4-8 18:51 回复TA
说的没错! 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

79

帖子

1

粉丝