菜鸟求教ARM问题

[复制链接]
2667|1
 楼主| 花花无落 发表于 2008-12-11 11:30 | 显示全部楼层 |阅读模式
<br />ADS的init.s中有以下代码:<br /><br />;&nbsp;On&nbsp;reset,&nbsp;an&nbsp;aliased&nbsp;copy&nbsp;of&nbsp;ROM&nbsp;is&nbsp;at&nbsp;0x0.<br />;&nbsp;Continue&nbsp;execution&nbsp;from&nbsp;'real'&nbsp;ROM&nbsp;rather&nbsp;than&nbsp;aliased&nbsp;copy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;=Instruct_2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />Instruct_2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />;&nbsp;Remap&nbsp;by&nbsp;setting&nbsp;Remap&nbsp;bit&nbsp;of&nbsp;the&nbsp;CM_ctl&nbsp;register<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;=CM_ctl_reg<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;[r1]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ORR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;r0,&nbsp;#Remap_bit<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;STR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;[r1]<br /><br />这个an&nbsp;aliased&nbsp;copy&nbsp;of&nbsp;ROM,是不是相当于芯片硬件完成的映射?但是为何还要有<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;=Instruct_2<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />Instruct_2&nbsp;&nbsp;<br />不明白这样有何意义?
flyingpigpig 发表于 2009-9-5 21:25 | 显示全部楼层
有的ARM核的芯片的Memory map是不一样的,比如normal mode下,地址0x0处是RAM,而地址0x24....处是flash,这样的memory map有一个问题:复位时,ARm会去地址0处找中断向量,显然会找不到正确的中断向量,为了避免这样的问题,硬件会做个复位时的alised copy,效果是:访问地址0就是访问0x24....,这样就能从flash中取到正确的中断向量。此动作是由硬件完成的,不用user做任何的设定。这是你的第一个问题。

复位中断正确的响应后,user写的firmware必须操作相应的register做地址重映射动作,导致的结果就是地址的重新分布。这样会导致的问题是:比如完成了抵制重映射时PC值为0x1,那么接下来就要执行地址0x2处的指令,由于此时地址分布已经改变,取地址0x2可能取到错误的指令,怎么办?解决办法就是你提到的那段指令:首先,在地址重映射前将重映射后该执行的指令地址保存下来,重映射后,由于arm的流水线机制, 指令“LDR     pc, =Instruct_2”的地址已经被载入,一定会被执行!而此指令的只用就是跳到地址去执行指令。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

40

帖子

1

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