韦东山Linux嵌入式课程社区
直播中

常静娜

7年用户 162经验值
私信 关注

请问裸机程序怎么做才可以直接下载到SDRAM中运行?

       最近一直在看韦老大的书和视频,不过是先从移植U-Boot和Linux开始的,因为之前做过一些裸机程序的验证性试验(使用ADS编译,通过Nor Flash自带bootloader下载到SDRAM中),对裸机程序多少有些了解。就是因为前面做过的这些验证性试验,编译出的bin文件可以直接下载到SDRAM中运行,而韦老大的这些裸机程序还是比较明确的规定要烧到NAND Flash的0地址处的。当然也直接下载到SDRAM尝试过,自然是没有反应的(因为head.s文件几乎就标明了从0地址开始)。
       因为对汇编程序了解较少,所以不敢妄下结论。但通过与我做过的验证性实验的程序相比较,感觉是要修改head.s文件和main.c文件。感觉是除了调用main函数外,head.s文件中调用的其他C函数都要挪到main.c中来初始化。
       因为现在已经将U-Boot烧到了NAND Flash的0地址处,内核与根文件系统也都烧写好了,再将这些裸机程序烧写到NAND Flash的0地址处的话,恐怕前边做的工作就要返工一遍了。所以请教韦老大,对光盘提供的裸机程序,要做哪些修改以使程序的烧写地址与程序执行无关呢?或者能提供一个思路。谢谢!

回帖(9)

周睫蒙

2019-8-2 08:20:24
韦老大在QQ群给了答复:
1.链接地址改为SDRAM的地址
2.重定位的代码去掉
3.不要初始化SDRAM
回去好好学习下!具体每一步怎么做大家讨论下哈。
举报

寇亦青

2019-8-2 08:27:24
韦老大在群里简单说了一下,这是我现在的一点看法,不一定对。
链接地址:应该是修改链接脚本(如果有)中的地址为SDRAM的地址。
重定位代码:应该就是copy_to_sdram这部分代码。
不要初始化SDRAM:在U-Boot中见到过SDRAM的初始化,但是裸机程序里还没太注意到,至少“按键中断点亮LED灯”的裸机程序没有用到初始化SDRAM吧。
对于“按键中断点亮LED灯”这个程序,要想在SDRAM中运行,还要复制中断向量表到SDRAM中,具体怎样做还不是很清楚。发生中断时CPU默认的就是去0地址那一块去查询中断向量表,这一点好像是无法改变的,那只能“改变”这个0地址,那是不是要用到MMU呢?
举报

徐远瑶

2019-8-2 08:37:08
还是拿“按键中断点亮LED灯”举例子,这个程序中,没有用到链接脚本,没有定位SDRAM的代码,也没有初始化,那么用到的就只有中断向量表了。那是不是说,把中断向量表复制进SDRAM,然后利用***为0x0地址,就可以将程序下载到SDRAM的这个位置运行了呢?
举报

陈发赫

2019-8-2 08:42:35
LZ说的是不是DNW?
举报

更多回帖

发帖
×
20
完善资料,
赚取积分