打印

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

[复制链接]
1603|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
纯金属|  楼主 | 2009-1-4 09:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我现在出现的问题和你一样,在帖子中并没有找到解决方法。
我的程序目:2410 NAND启动,用自带前4K RAM完成了LED实验,按键中断实验,现在想学习代码搬运。
;Copy and paste RW data/zero initialized data
    ldr    r0, =|Image$$RO$$Base|
    ldr    r1, =|Image$$RO$$Limit| ; Get pointer to ROM data
    ldr    r2, =|Image$$RW$$Base|  ; and RAM copy
    ldr    r3, =|Image$$ZI$$Base|  
    
    ;Zero init base => top of initialised data
    SUB r1,r1,r0;
    SUB r3,r3,r2;
    ADD r1,r1,r3;
0
    LDR r3,[r0],#4;
    LDR r3,[r2],#4;
    SUBS r1,r1,#4;
    
    BNE %B0

根据我自己的理解,在ADS--arm linker--out put--R0 base设置0X3000 0000
这样是不行的,因为ADS会把程序加载到0x3000 0000位置去运行了,还怎么实验啊。
但程序里需要 |Image$$RO$$Base| 地址,那么不在ADS里设置 还可以在哪儿啊?
如果把这个问题解决了,其它都迎刃而解。
还请大家多指教。

相关帖子

沙发
阿南| | 2009-1-4 09:55 | 只看该作者

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

启动代码的,也详细介绍了您这一部分

使用特权

评论回复
板凳
纯金属|  楼主 | 2009-1-4 10:11 | 只看该作者

你的书我买了

书放家里了,我对启动代码看的还比较仔细,并没有发现你提到过讲代码搬运啊

使用特权

评论回复
地板
阿南| | 2009-1-4 14:29 | 只看该作者

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

使用特权

评论回复
5
纯金属|  楼主 | 2009-1-5 07:56 | 只看该作者

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

我的情况正如你书上写的:程序大于4K,保存在NAND,没有BOOTLOADER的情况。
书上没有细讲,也没有例子可以参照。
我想是不是这样的流程:
ADS 里配置 RO=0X3000 0000
2410init.s 里做好中断向量,SDRAM,NAND初始化,
接着把没有执行过的复制到0x3000 0000处。
(这里有点疑问,那不是要计算NANDFLASH存储的程序代码地址了么?这样对我来说有难度,该怎么做?)
再是ldr pc,=0x3000 0000

谢谢,帮我看看。

使用特权

评论回复
6
纯金属|  楼主 | 2009-1-5 15:28 | 只看该作者

我这样做可以么?

ADS 设置RO=0
参考vivi里
  bl        init_nand          ;初始化NAND Flash
     ;将NAND Flash中地址4096开始的1024字节代码(main.c编译得到)复制到SDRAM中
                            ;nand_read_ll函数需要3个参数:
    ldr        r0,     =0x30000000    ;1. 目标地址=0x30000000,这是SDRAM的起始地址
            
            mov         r1,     #0        ;2.  源地址   = 4096,连接的时候,main.c中的代码都存在NAND Flash地址4096开始处
            mov        r2,     #1024*8            ;3.  复制长度= 1024(bytes),对于本实验的main.c,这是足够了
            bl        nand_read_ll            ;调用C函数nand_read_ll

            ldr        sp,    =0x34000000        ;设置堆栈
            ;ldr        lr,    =halt_loop        ;设置返回地址
            ;ldr        pc,    =0x1dc;Main                 ;b指令和bl指令只能前后跳转32M的范围,所以这里使用向pc赋值的方法进行跳转             
            ldr r0,=on_the_ram            ;get the address of label on_the_ram
        ldr r1,=0x30000000      ;load the startup code ram base adderss after the copy
        add r0,r0,r1                ;add it together to get the jump address
        mov pc,r0                    ;load it to pc,jump to ram
            
            ldr pc, =setup_stack
setup_stack
        ldr sp, =0x33ffffff
        bl Main
            
            
            
on_the_ram

...
....
RW,RZ的搬运
然后我用SJF2410烧到NANDFLASH里
上电运行LED,按键程序正常。但是用AXD仿真时,
到这步就有点异常了;
mov pc,r0    ;load it to pc,jump to ram
;r0 等于0x3000 0000+未执行的偏移量

具体现象是:
。。。
[0xea000002]   dcd      0xea000002  ....
[0xe5930054]   dcd      0xe5930054  T...
[0xe3800040]   dcd      0xe3800040  @...
[0xe5830054]   dcd      0xe5830054  T...
[0xe5930054]   dcd      0xe5930054  T...
[0xe3100008]   dcd      0xe3100008  ....
[0x1a000003]   dcd      0x1a000003  ....
[0xe5930054]   dcd      0xe5930054  T...
[0xe3c00080]   dcd      0xe3c00080  ....
[0xe5830054]   dcd      0xe5830054  T...
[0xea000002]   dcd      0xea000002  ....
[0xe5930054]   dcd      0xe5930054  T...
。。。
PC在这些区域循环执行,但看不见代码。倒比较像我程序里的while(1)循环。

使用特权

评论回复
7
纯金属|  楼主 | 2009-1-5 16:03 | 只看该作者

RE

这个窗口可以右击 选择ARM汇编 便可以看到代码。
可还看不到C代码,着急。
请大家帮帮忙。

使用特权

评论回复
8
playlinus| | 2009-1-5 16:45 | 只看该作者

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

214

帖子

0

粉丝