5390|5

64

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

有关ARM926EJ-S 的异常向量表的问题 [复制链接]

ARM926EJ-S 的spec. 说异常向量表要么放在0x00000000,要么放在0xffff0000. 这取决于cp15 的控制寄存器c1的设置。我设置相应位,以使向量表地址位于0x00000000. 但是,当我触发一个异常是CPU没有跳到这个向量表的相应位置的指令, 而是跳到了另一个异常向量表的一个指令。这个向量表不在0x00000000地址。
请问高手一下,这是为什么吗?我已经花了两天去找这个问题的答案。如有提示,不胜感激。
此帖出自ARM技术论坛

最新回复

一般来说,从ROM启动时,ROM的开始部分会被Remap到地址0,以处理异常。 处理器通常允许再次进行REMAP,把其它地址上的Memory映射到地址0,如果你没有做 这一步,则你向地址0写异常向量表的过程可能是不成功的:那个地址上的其实仍是ROM。  详情 回复 发表于 2007-9-18 08:31
点赞 关注
 

回复
举报

71

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我大概说一下这个问题:
    1.ARM系统,在0x0地址,是RESET的中断向量。系统上电复位后,自动执行该条跳转指令,跳转到相应的启动代码处执行。显然,0x0物理地址都应该是非易失存储器,比如Flash,NVRAM,ROM之类。如果你不用硬件调试器,是无法跟踪到该条跳转指令的。
    2.你的问题是MMU配置问题。MMU配置的其中一个功能,就是把一个合适的物理地址映射到0x00000000的虚拟地址。在系统从硬件0x0地址启动后,由于0x0物理地址通常的非易失存储器速度要比SRAM或者SDRAM一类存储器的速度慢得多,而系统经常需要执行的IRQ,FIQ中断,我们当然希望其速度快一些,因此用MMU映射一下,使0x0的虚拟地址,对应一个快速的物理地址(比如SDRAM)。
    因此,你的问题应该在MMU配置中寻找答案。看看MMU把虚拟地址0x0给了哪个物理地址了。
此帖出自ARM技术论坛
 
 
 

回复

57

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
Hi ningxin,
谢谢你的回复,非常感谢。我想我的问题有点跟你想的不一样。
这里,我想给这个问题多一些背景介绍。我用的TI的Davinci开发板,其SOC上的ARM CPU基于arm926ej-s核.SOC上有内部RAM和内部ROM,其中可以存放指令的内部RAM地址范围是0x0~~0x00003fff. 我配置的启动模式是从FLASH(NOR FLASH)启动,地址是从0x02000000开始的。u-boot就存放在0x02000000地址。而从0x80000000~~0x8fffffff的256M空间是外部RAM。
开机上电,CPU从0x02000000开始执行指令。请注意,在u-boot 和后续的程序执行过程中,MMU都是被disable掉的,并且Exception Vector Table 的地址被设成0x0。u-boot会把自己relocate到0x81080000的RAM上,然后进行完整的运行。当u-boot进入命令交互模式后,我用命令'tftpboot 0x84000000 myapp;go 0x84000000'把myapp下载到内存并运行。这时CPU的控制完全从u-boot移交给了myapp。 myapp运行之初会把Exception Vector Table 拷贝到0x0。 在稳定运行后,利用myapp的命令交互触发一个'data abort'的异常。 可这时CPU跳转到的异常向量表项不是基于0x0 地址的。 经过推测应该是0x02000000地址的那个向量表被用来异常跳转了。
我是这样推测的:把0x0--0x3c的异常向量表清零, 把0x81080000--0x8108003c的值也清零,这时只剩下flash上0x02000000 -- 0x0200003c的向量表存在了,但是,触发中断之后,指针跳转跟前面一样,不受影响。

你能根据这些情况,再给我作一回复吗?先谢谢了。
下面附加一些内存的DUMP以供参考.
Here are two captures for the two exception vector table that is mentioned previously:
*****************myapp's exception vector table************************************
00000000: ea000017 e59ff014 e59ff014 e59ff014
00000010: e59ff014 e59ff014 e59ff014 e59ff014
00000020: 84000140 840001a0 84000200 84000260
00000030: 840002c0 84000320 84000380 deadbeef
*****************************************************
*****************u-boot's exception vector table************************************
02000000: ea000012 e59ff014 e59ff014 e59ff014
02000010: e59ff014 e59ff014 e59ff014 e59ff014
02000020: 81080100 81080160 810801c0 81080220
02000030: 81080280 810802e0 81080340 deadbeef
*****************************************************
note: 0x81080000 is the entry address of  relocated u-boot, which originally starts to run at 0x02000000.
    0x81080220 is the address of data-abort handling routine of u-boot.
    0x84000260 is the address of data-abort handling routine of myapp.
    There is no exception vector table at address 0x00000000 before myapp copys its exception vector table to that space.

此帖出自ARM技术论坛
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(初级)

4
 
你这个有bootrom吧,其实还是从0地址开始的,只不过被bootrom又重定位到你的启动地址了。
此帖出自ARM技术论坛
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

5
 
一般来说,从ROM启动时,ROM的开始部分会被Remap到地址0,以处理异常。
处理器通常允许再次进行REMAP,把其它地址上的Memory映射到地址0,如果你没有做
这一步,则你向地址写异常向量表的过程是不成功的:那个地址上的其实仍是ROM。
此帖出自ARM技术论坛
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

6
 
一般来说,从ROM启动时,ROM的开始部分会被Remap到地址0,以处理异常。
处理器通常允许再次进行REMAP,把其它地址上的Memory映射到地址0,如果你没有做
这一步,则你向地址0写异常向量表的过程可能是不成功的:那个地址上的其实仍是ROM。
此帖出自ARM技术论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表