[ZLG-ARM] 请教周公,关于一个bootload区的问题

[复制链接]
3560|2
 楼主| cbqcgq 发表于 2007-6-19 11:15 | 显示全部楼层 |阅读模式
我看到LPC2000资料上说:<br />由于处理器复位后,映射到0x00000000-0x0000003F地址空间的异常向量表源于bootload子块,因此CPU开始执行的实际上是philips在芯片出厂前写入bootload的程序。<br />问题:<br />1,bootload区本来就有异常向量表吗?如果有,为什么还要用户自己写<br />2,bootload区又重新映射到片内FLASH的最高地址,这个是硬件自动完成的吗?<br />3,不管中断向量表在什么地方,运行中,总是以0x00-0x3f可见,那么我做SMARTARM2200的实验《2.13_存储器重映射实验》时,不是破坏了中断向量表了么?<br />我是ARM新手,对这个BOOTLOAD和REMAP感到难理解,望朋友们不吝赐教啊<br /><br />程序如下<br />/****************************************************************************<br />*&nbsp;文&nbsp;件&nbsp;名:REMAP.C<br />*&nbsp;功&nbsp;&nbsp;&nbsp;&nbsp;能:将存储器重映射到片内RAM(0x40000000~0x4000003F),然后更改0x40000000~<br />*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x4000003F的内容。<br />*&nbsp;说&nbsp;&nbsp;&nbsp;&nbsp;明:观察0x00000000~0x0000003F地址上的数据有何变化<br />****************************************************************************/<br />#include&nbsp;&nbsp;&quot;config.h&quot;<br /><br />#define&nbsp;&nbsp;&nbsp;VECTOR_RAM&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;((unsigned&nbsp;char&nbsp;*)&nbsp;0x40000000)<br /><br />/****************************************************************************<br />*&nbsp;名&nbsp;&nbsp;&nbsp;&nbsp;称:main()<br />*&nbsp;功&nbsp;&nbsp;&nbsp;&nbsp;能:存储器重映射。<br />****************************************************************************/<br />int&nbsp;&nbsp;main(void)<br />{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;uint8&nbsp;&nbsp;*addr;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MEMMAP&nbsp;=&nbsp;0x02;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断向量从静态RAM重映射(用户RAM模式)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;VECTOR_RAM;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt64;&nbsp;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;用0x55填充0x40000000~0x4000003F<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*addr&nbsp;=&nbsp;0x55;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;addr&nbsp;=&nbsp;VECTOR_RAM;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;&nbsp;i&lt64;&nbsp;i++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;用0xAA填充0x40000000~0x4000003F<br />&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*addr&nbsp;=&nbsp;0xAA;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;addr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;MEMMAP&nbsp;=&nbsp;0x00;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;中断向量从Boot&nbsp;Block重映射(Boot装载程序模式)<br />&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />&nbsp;&nbsp;&nbsp;&nbsp;return(0);<br />}<br />
zlgarm 发表于 2007-6-19 17:16 | 显示全部楼层

re:

1,bootload区本来就有异常向量表吗?如果有,为什么还要用户自己写<br />A:bootloader区的代码有自己的异常向量表,但是仅给bootloader使用的,再boot模式下使用。用户编写的异常向量表是给用户程序使用的。<br /><br />2,bootload区又重新映射到片内FLASH的最高地址,这个是硬件自动完成的吗?<br />A:是的,硬件自动映射的。<br /><br />3,不管中断向量表在什么地方,运行中,总是以0x00-0x3f可见,那么我做<br />SMARTARM2200的实验《2.13_存储器重映射实验》时,不是破坏了中断向量表了么?<br />A:该实验的确会破坏异常向量表,但是由于该程序没有产生异常,所以异常向量表的改动不会对程序运行造成影响。该实验是为了演示映射的现象。
 楼主| cbqcgq 发表于 2007-6-19 23:04 | 显示全部楼层

谢谢您得解答,我如释负重

为了解决这个问题我研究了好几天,如果直接用你们的模板是一点问题也没有,试验作的也很顺。可是总觉得不搞定这个体系结构,自己茶不思饭不香,不明白为什么两个向量表究竟如何区别,究竟为什么需要两个向量表。而且对于试验板提供的程序,也没有去想他仅仅是演示映射用的,不过疑问多了,解决了,算时进步吧,再次谢谢您。<br />有些东西虽然很简单,但是简单也总得有个理由啊。这是我在这几天寻求解答的过程中得出的结论之一。当我拿这个问题去问别人时,他们的解答仅仅是用书面的资料,再问下去,就没了。做技术得,还是得学会深究。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

10

主题

53

帖子

1

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