[ZLG-ARM] lpc2132 remap的不解

[复制链接]
 楼主| randomkuan 发表于 2008-3-12 14:24 | 显示全部楼层 |阅读模式
<br /><br />#define&nbsp;VECTOR_RAM&nbsp;((unsigned&nbsp;int&nbsp;*)0x40000000)<br />#define&nbsp;VECTOR_ROM&nbsp;((unsigned&nbsp;int&nbsp;*)0x00000000)<br /><br />__swi(0x00)&nbsp;void&nbsp;SWI_Task(void);<br /><br />void&nbsp;SWI_Exception(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}<br />int&nbsp;main()<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;volatile&nbsp;unsigned&nbsp;int&nbsp;*RamAddr,*RomAddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;i;<br />&nbsp;&nbsp;&nbsp;&nbsp;RamAddr&nbsp;=&nbsp;VECTOR_RAM;<br />&nbsp;&nbsp;&nbsp;&nbsp;RomAddr&nbsp;=&nbsp;VECTOR_ROM;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;for(i=0;i&lt16;i++)//拷贝中断向量表<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*RamAddr&nbsp;=&nbsp;*RomAddr;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RamAddr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RomAddr++;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;MEMMAP&nbsp;=&nbsp;0x2;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;RamAddr&nbsp;=&nbsp;(unsigned&nbsp;int&nbsp;*)0x40000028;<br />&nbsp;&nbsp;&nbsp;&nbsp;*RamAddr&nbsp;=&nbsp;(unsigned&nbsp;int&nbsp;)SWI_Exception;//修改SWI中断向量<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;SWI_Task();//执行SWI中断<br />&nbsp;&nbsp;&nbsp;&nbsp;while(1);<br />}<br />&nbsp;&nbsp;AREA&nbsp;&nbsp;&nbsp;&nbsp;vectors,CODE,READONLY<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ENTRY<br />;interrupt&nbsp;vectors<br />;中断向量表<br />Reset<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;ResetAddress<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;UndefineAddress<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;SWI_Address<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;PrefetchAddress<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;AbortAddress<br />&nbsp;&nbsp;&nbsp;&nbsp;NOP<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;[PC,#-0xFF0]&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PC,&nbsp;FIQ_Address<br /><br />ResetAddress&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;Reset_Handler<br />UndefineAddress&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;Undefine_Handler<br />SWI_Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;SWI_Handler&nbsp;<br />PrefetchAddress&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;Prefetch_Handler<br />AbortAddress&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;Abort_Handler<br />FIQ_Address&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DCD&nbsp;&nbsp;&nbsp;&nbsp;FIQ_Handler<br /><br /><br />SWI_Handler&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;SWI_Handler<br /><br /><br />RO_base&nbsp;=0<br />RW_base=0x40000000<br /><br />问题:为什么remap&nbsp;之后执行SWI软件指令,还是跳转到SWI_Handler,而不是到SWI_Exception()呢?
zlgarm 发表于 2008-3-12 18:06 | 显示全部楼层

程序问题

randomkuan&nbsp;&nbsp;您好:<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;这个是您程序的问题,请看下面,<br /><br />&nbsp;&nbsp;SWI_Handler&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;SWI_Handler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//程序一直在这里执行<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;by&nbsp;zlgarm_zhanghuping
 楼主| randomkuan 发表于 2008-3-12 21:22 | 显示全部楼层

to zlgarm ,我已经改了中断向量啊!

感谢zlgarm!<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;但是你看我的程序<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RamAddr&nbsp;=&nbsp;(unsigned&nbsp;int&nbsp;*)0x40000028;<br />&nbsp;&nbsp;&nbsp;&nbsp;*RamAddr&nbsp;=&nbsp;(unsigned&nbsp;int&nbsp;)SWI_Exception;//修改SWI中断向量<br />&nbsp;&nbsp;&nbsp;&nbsp;已经修改了SWI的中断向量啊,按理来说不是执行新的函数吗?
 楼主| randomkuan 发表于 2008-3-13 13:32 | 显示全部楼层

问题困扰很久了,希望有人能指点迷津

问题困扰很久了,希望有人能指点迷津
zlgarm 发表于 2008-3-13 13:56 | 显示全部楼层

函数

randomkuan&nbsp;&nbsp;您好:<br />&nbsp;&nbsp;&nbsp;&nbsp;如果您的意图是通过指针来调用函数,应该用函数指针来操作。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;zlgarm_lijintao
 楼主| randomkuan 发表于 2008-3-13 14:26 | 显示全部楼层

remap后是否从0X40000000开始中断?

ram的0x40000000~0x40000003F拷贝了ROM的0x00000000~0x0000003F的,也就是说40000028存放的是原来SWI_Handler&nbsp;的地址,经过<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;RamAddr&nbsp;=&nbsp;(unsigned&nbsp;int&nbsp;*)0x40000028;<br />&nbsp;&nbsp;&nbsp;&nbsp;*RamAddr&nbsp;=&nbsp;(unsigned&nbsp;int&nbsp;)SWI_Exception;//修改SWI中断向量<br />0x40000028存放的是SWI_Exception的地址,看汇编也看到0x40000028的数据已经变成SWI_Exception的地址了,remap后中断应该从0x40000000开始啊,甘SWI软中断应该从0x40000008开始,读取0X40000028单元所存放的数据啊,请ZLGARM再教导教导!
armfan 发表于 2008-3-14 12:56 | 显示全部楼层

re

帮你顶,希望工程师能给我们一个满意的答复
zlgarm 发表于 2008-3-14 13:18 | 显示全部楼层

中断

randomkuan&nbsp;&nbsp;您好!<br />&nbsp;&nbsp;&nbsp;&nbsp;1、首先设置映射寄存器MEMMAP&nbsp;=&nbsp;0x02<br />&nbsp;&nbsp;&nbsp;&nbsp;2、如果RIQ中断则跳到40000018处执行指令<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;On&nbsp;duty&nbsp;zlgarm_lijintao
ZlGaRm 发表于 2008-3-14 14:04 | 显示全部楼层

楼主

您好!<br />&nbsp;&nbsp;有点看不明白您的意思。您一发帖,一上来就是一堆代码,然后是一个有点让人摸不着头脑的问题。<br />&nbsp;&nbsp;您最关心的问题究竟是什么呢?建议您将您的问题简化成概念问题。大多数问题都可以转化成概念问题的。<br />&nbsp;&nbsp;将具体的问题转化成抽象的概念问题很有好处,避免被提问者还要耗费很多时间和精力看代码、学习和理解代码相关的背景知识、细枝末节,问题也能得到更快的解决。<br />&nbsp;&nbsp;所以,我想请您梳理一下思路,然后重新提问,告诉大家您到底想问什么。问题的形式,最好能是和您的代码没有关系。<br />&nbsp;&nbsp;例如:“remap后是否从0X40000000开始中断?”的表达形式就好回答得多了:<br />&nbsp;&nbsp;“remap到内存后,真正被执行的异常向量表就是位于内存的起始地址了”。&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;zlgarm_ltt<br />&nbsp;&nbsp;<br />&nbsp;&nbsp; <br /> 相关链接:<a href='http://bbs.21ic.com/upfiles/img/20083/200831414333886.pdf'>http://bbs.21ic.com/upfiles/img/20083/200831414333886.pdf</a>
armfan 发表于 2008-3-14 15:01 | 显示全部楼层

re

ZlGaRm:<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;您好<br />&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;首先声明randomkuan是问题的作者,不是我。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其次您所说“randomkuan问了一个摸不着头脑的问题”,我所理解他的意思应该是问“我把软中断的从新定义了函数进行了处理,及《《《&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*RamAddr&nbsp;=&nbsp;(unsigned&nbsp;int&nbsp;)SWI_Exception&nbsp;&nbsp;&nbsp;&nbsp;》》》,但是为什么还执行&nbsp;<br /><br />&nbsp;&nbsp;SWI_Handler&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B&nbsp;&nbsp;&nbsp;&nbsp;SWI_Handler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;”<br /><br />我也是一名初学者,我之所以花费10分钟的时间来回贴,是想解除心中的疑惑。
ZlGaRm 发表于 2008-3-14 16:08 | 显示全部楼层

Re

&nbsp;&nbsp;&nbsp;&nbsp;就这个问题而言,我想先看一看楼主是否能将问题转化一下。<br />&nbsp;&nbsp;&nbsp;&nbsp;说实话,我们的精力确实有限(每天要处理多达30个以上的帖子),既无能力也无义务帮客户看客户的代码。其实就代码而言,我们是只对光盘例程进行技术支持的。<br />&nbsp;&nbsp;&nbsp;&nbsp;很多时候,在论坛上,我们之所以帮客户费力看他的代码,只是出于当事工程师的善意和热心,这只是个人行为,但公司并不提倡这类个人行为。希望客户在我们不能仔细看您的代码时,给予一点理解。更希望大家能体谅一下回答者,费点心思把问题转化一下。不要问“为什么我的程序这里有问题、那里有问题”之类的问题了,毕竟您的程序并不是别人的产品,而且别人不是您,也不容易理解您的思路,别人回答起来真地很费力,呵呵。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;By&nbsp;zlgarm_ltt
armfan 发表于 2008-3-14 16:50 | 显示全部楼层

re

感谢zlg的工程师们的无私的奉献,祝工作顺利,天天开心。
 楼主| randomkuan 发表于 2008-3-17 16:37 | 显示全部楼层

我想知道我的思路错在哪里!

我也是用ZLG的光盘的例程,但Remap的例程只是叫人看数据的变化而没有真正的应用,所以我想自己能够真正的理解和应用Remap,我的程序的意思是这样的:<br /><br />ARM上电复位后,执行的是ZLG提供的启动代码,然后跳到main()函数,在main()函数里面,拷贝FLASH的0x00000000~0x0000003F的代码到RAM的0x40000000~0x4000003F,然后执行MEMMAP&nbsp;=&nbsp;0x2,remap到内存后,真正被执行的异常向量表就是位于内存的起始地址了(0x40000000),然后我改变内存单元(0x40000028)的内容,原来的是指向SWI_Handler()函数,改变后指向SWI_Exception()函数,最后执行SWI软中断.(在编译器ADS设置RO_base&nbsp;=0<br />RW_base=0x40000000)<br /><br />问题是:1.remap后是否从0X40000000开始中断?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.remap后SWI软中断是否从0x40000008开始,读取0X40000028单元所存放的数据(LDR&nbsp;PC,&nbsp;SWI_Address&nbsp;.....&nbsp;SWI_Address&nbsp;DCD&nbsp;SWI_Handler)也就是SWI中断函数的地址,赋给PC,然后执行SWI中断函数?<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.改变0X40000028的数据,是否可以改变SWI中断的指向?<br />我遇到的情况就是我改变了0X40000028的内容,SWI中断还是指向原来的地址,而不是指向修改后的地址,我想知道我的思路错在哪里!<br />感谢zlg的工程师们的无私的奉献!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

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

1

主题

7

帖子

0

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