ARM 链接地址 重定向的问题

2019-07-16 09:35发布


           TQ2440 norflash启动 下载到0地址 连接到0x30000000
            主要想实现copy norflash到SDRAM并在SDRAM上运行(虽然nor上可以直接运行,只是想试一下)
问题:
(1)为什么当把以下屏蔽的两行(// ldr pc,=on_sdram //on_sdram:)屏蔽时,灯正常亮
不屏蔽灯不亮(虽然这里跳不跳转都一样执行),google了下 觉得有可能是什么连接地址出错 on_sdram标号储存的位置不对没读到 不懂 请大侠们指教
(2)为什么 以下的memsetup函数(就是sdram控制器设置)写成以上的依次赋值后点灯正常,但写成指针只赋头指针地址(韦东山老大的代码是这样写的,上面说位置无关代码,可copy过来不行,换成for形式的就可以)为什么会这样,贴出head.s, init.c中的memsetup,和反汇编,希望大神给解决一下,谢谢了

(3)有的copy到SDRAM的函数是copy到0x30004000这个地址,然后连接地址是0x30000000,会出错吗?

.extern     main
.text
.global _start
_start:
Reset:                  
    ldr sp, =0x4096           @ 设置栈指针,以下都是C函数,调用前需要设好栈
    bl  disable_watch_dog   @ 关闭WATCHDOG,否则CPU会不断重启
    bl  memsetup            @ 设置存储控制器以使用SDRAM
    bl  copy_steppingstone_to_sdram     @ 复制代码到SDRAM中

   // ldr pc,=on_sdram                   @ 跳到SDRAM中继续执行
//on_sdram:

    ldr sp, =0x34000000     @ 设置栈指针
    ldr lr, =halt_loop      @ 设置返回地址
    bl
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
1条回答
woodmice
1楼-- · 2019-07-16 12:34
没看到你贴的 ‘head.s, init.c中的memsetup,和反汇编’;

你的问题比较难全部回答,因为没有你说的那个开发板,下载对应的资料分析的话,需要很多精力。建议你弄个JTAG调试器跟踪调试,这样比较好找到问题;

你的第三个问题,如果0X30000000开始的这个地址下面只有16K字节的RAM的话,你说的那个情况就不会出错,而且copy到0X30000000+0x4000*n的范围内都不会出错,(n的范围保证寻址不会超出0X30000000存储器的片选寻址范围)

一周热门 更多>