请教PLAYLINUX你的2410代码搬运问题搞懂了?

[复制链接]
2291|7
 楼主| 纯金属 发表于 2009-1-4 09:44 | 显示全部楼层 |阅读模式
我现在出现的问题和你一样,在帖子中并没有找到解决方法。<br />我的程序目:2410&nbsp;NAND启动,用自带前4K&nbsp;RAM完成了LED实验,按键中断实验,现在想学习代码搬运。<br />;Copy&nbsp;and&nbsp;paste&nbsp;RW&nbsp;data/zero&nbsp;initialized&nbsp;data<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;=|Image$$RO$$Base|<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;=|Image$$RO$$Limit|&nbsp;;&nbsp;Get&nbsp;pointer&nbsp;to&nbsp;ROM&nbsp;data<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;=|Image$$RW$$Base|&nbsp;&nbsp;;&nbsp;and&nbsp;RAM&nbsp;copy<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;r3,&nbsp;=|Image$$ZI$$Base|&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;;Zero&nbsp;init&nbsp;base&nbsp;=&gt&nbsp;top&nbsp;of&nbsp;initialised&nbsp;data<br />&nbsp;&nbsp;&nbsp;&nbsp;SUB&nbsp;r1,r1,r0;<br />&nbsp;&nbsp;&nbsp;&nbsp;SUB&nbsp;r3,r3,r2;<br />&nbsp;&nbsp;&nbsp;&nbsp;ADD&nbsp;r1,r1,r3;<br />0<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;r3,[r0],#4;<br />&nbsp;&nbsp;&nbsp;&nbsp;LDR&nbsp;r3,[r2],#4;<br />&nbsp;&nbsp;&nbsp;&nbsp;SUBS&nbsp;r1,r1,#4;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;BNE&nbsp;%B0<br /><br />根据我自己的理解,在ADS--arm&nbsp;linker--out&nbsp;put--R0&nbsp;base设置0X3000&nbsp;0000<br />这样是不行的,因为ADS会把程序加载到0x3000&nbsp;0000位置去运行了,还怎么实验啊。<br />但程序里需要&nbsp;|Image$$RO$$Base|&nbsp;地址,那么不在ADS里设置&nbsp;还可以在哪儿啊?<br />如果把这个问题解决了,其它都迎刃而解。<br />还请大家多指教。
阿南 发表于 2009-1-4 09:55 | 显示全部楼层

楼主,参考一下《ARM Linux入门与实践》吧,有一章专门讲

启动代码的,也详细介绍了您这一部分
 楼主| 纯金属 发表于 2009-1-4 10:11 | 显示全部楼层

你的书我买了

书放家里了,我对启动代码看的还比较仔细,并没有发现你提到过讲代码搬运啊
阿南 发表于 2009-1-4 14:29 | 显示全部楼层

在书的P129页到P133页,都配有图说明,哈哈

  
 楼主| 纯金属 发表于 2009-1-5 07:56 | 显示全部楼层

南哥你的书上确实写了这部分内容

我的情况正如你书上写的:程序大于4K,保存在NAND,没有BOOTLOADER的情况。<br />书上没有细讲,也没有例子可以参照。<br />我想是不是这样的流程:<br />ADS&nbsp;里配置&nbsp;RO=0X3000&nbsp;0000<br />2410init.s&nbsp;里做好中断向量,SDRAM,NAND初始化,<br />接着把没有执行过的复制到0x3000&nbsp;0000处。<br />(这里有点疑问,那不是要计算NANDFLASH存储的程序代码地址了么?这样对我来说有难度,该怎么做?)<br />再是ldr&nbsp;pc,=0x3000&nbsp;0000<br /><br />谢谢,帮我看看。
 楼主| 纯金属 发表于 2009-1-5 15:28 | 显示全部楼层

我这样做可以么?

ADS&nbsp;设置RO=0<br />参考vivi里<br />&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;init_nand&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;初始化NAND&nbsp;Flash<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;将NAND&nbsp;Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中<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;;nand_read_ll函数需要3个参数:<br />&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r0,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0x30000000&nbsp;&nbsp;&nbsp;&nbsp;;1.&nbsp;目标地址=0x30000000,这是SDRAM的起始地址<br />&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;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r1,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;2.&nbsp;&nbsp;源地址&nbsp;&nbsp;&nbsp;=&nbsp;4096,连接的时候,main.c中的代码都存在NAND&nbsp;Flash地址4096开始处<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r2,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#1024*8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;3.&nbsp;&nbsp;复制长度=&nbsp;1024(bytes),对于本实验的main.c,这是足够了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nand_read_ll&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;调用C函数nand_read_ll<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sp,&nbsp;&nbsp;&nbsp;&nbsp;=0x34000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设置堆栈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lr,&nbsp;&nbsp;&nbsp;&nbsp;=halt_loop&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;设置返回地址<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;ldr&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pc,&nbsp;&nbsp;&nbsp;&nbsp;=0x1dc;Main&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转&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;ldr&nbsp;r0,=on_the_ram&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;get&nbsp;the&nbsp;address&nbsp;of&nbsp;label&nbsp;on_the_ram<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;r1,=0x30000000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;load&nbsp;the&nbsp;startup&nbsp;code&nbsp;ram&nbsp;base&nbsp;adderss&nbsp;after&nbsp;the&nbsp;copy<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;r0,r0,r1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;add&nbsp;it&nbsp;together&nbsp;to&nbsp;get&nbsp;the&nbsp;jump&nbsp;address<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mov&nbsp;pc,r0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;;load&nbsp;it&nbsp;to&nbsp;pc,jump&nbsp;to&nbsp;ram<br />&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;ldr&nbsp;pc,&nbsp;=setup_stack<br />setup_stack<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ldr&nbsp;sp,&nbsp;=0x33ffffff<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bl&nbsp;Main<br />&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;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />on_the_ram<br /><br />...<br />....<br />RW,RZ的搬运<br />然后我用SJF2410烧到NANDFLASH里<br />上电运行LED,按键程序正常。但是用AXD仿真时,<br />到这步就有点异常了;<br />mov&nbsp;pc,r0&nbsp;&nbsp;&nbsp;&nbsp;;load&nbsp;it&nbsp;to&nbsp;pc,jump&nbsp;to&nbsp;ram<br />;r0&nbsp;等于0x3000&nbsp;0000+未执行的偏移量<br /><br />具体现象是:<br />。。。<br />[0xea000002]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xea000002&nbsp;&nbsp;....<br />[0xe5930054]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xe5930054&nbsp;&nbsp;T...<br />[0xe3800040]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xe3800040&nbsp;&nbsp;@...<br />[0xe5830054]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xe5830054&nbsp;&nbsp;T...<br />[0xe5930054]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xe5930054&nbsp;&nbsp;T...<br />[0xe3100008]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xe3100008&nbsp;&nbsp;....<br />[0x1a000003]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0x1a000003&nbsp;&nbsp;....<br />[0xe5930054]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xe5930054&nbsp;&nbsp;T...<br />[0xe3c00080]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xe3c00080&nbsp;&nbsp;....<br />[0xe5830054]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xe5830054&nbsp;&nbsp;T...<br />[0xea000002]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xea000002&nbsp;&nbsp;....<br />[0xe5930054]&nbsp;&nbsp;&nbsp;dcd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0xe5930054&nbsp;&nbsp;T...<br />。。。<br />PC在这些区域循环执行,但看不见代码。倒比较像我程序里的while(1)循环。<br />
 楼主| 纯金属 发表于 2009-1-5 16:03 | 显示全部楼层

RE

这个窗口可以右击&nbsp;选择ARM汇编&nbsp;便可以看到代码。<br />可还看不到C代码,着急。<br />请大家帮帮忙。
playlinus 发表于 2009-1-5 16:45 | 显示全部楼层

nand代码搬运需要专门对nand操作的代码,和NOR不同

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

本版积分规则

41

主题

214

帖子

0

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