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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
你的问题比较难全部回答,因为没有你说的那个开发板,下载对应的资料分析的话,需要很多精力。建议你弄个JTAG调试器跟踪调试,这样比较好找到问题;
你的第三个问题,如果0X30000000开始的这个地址下面只有16K字节的RAM的话,你说的那个情况就不会出错,而且copy到0X30000000+0x4000*n的范围内都不会出错,(n的范围保证寻址不会超出0X30000000存储器的片选寻址范围)
一周热门 更多>