用UBOOT自带loadb命令加载应用程序到SDRAM中运行的方法
2024-11-18 来源:cnblogs
S3C44B0开发板中,用UBOOT自带loadb命令加载应用程序到SDRAM中运行的方法
1.开发板说明:
开发板上已有移植好的UBOOT运行。
2.交叉编译工具链为arm-linu-gcc-4.0.4
3.原理:
采用UBOOT自带的命令loadb,加应用程序(.bin)加载至SDRAM中某一地址中,然后用go 命令从某地址处开始执行程序。
操作方法说明:
1.编写一个测试程序,见附上的例程hello.c。
hello.c主要包含以下几个功能,在串口终端打印输出字符串,控制开发板上的LED灯,同时采用等待延时的方法循环执行。
2.编写Makefile文件,方便调试,省得每次都要敲命令行。
3.将得到的hello.bin文件用loadb命令加载至相应的地址(addr),该地址应与Makefile文件中-Ttext指定的地址相同。
4.用go addr命令运行程序。
需要注意的问题:
1.在SDRAM中运行的地址选取问题:
由于UBOOT也是在SDRAM中运行的,因此,要考虑应用程序的大小,加载到某地址后,不要破坏了UBOOT的正常运行。
如果影响到了UBOOT的运行,那结果是不可预知的。因此,要避免此种情况的发生。
2.在地址链接时,需要指定程序入口地址,即arm-linux-ld -Ttext 0x0c400000 -e main hello.o -o hello.elf中-e main这项。
-e指定的是入口点,即名称,应该与应用程序中的主程序名(main)相同。
这里的主程序指应用程序的主运行程序,并不一定是main,可任意指定,比如entry等,但-e指定的名称必须与之相同。
3.如果在应用程序中,有多个函数时,默认情况下,是依据函数的实现顺序分配地址值的。
如此例中,delay函数在main函数之前的话,那delay的分配地址,应该会是0x0c400000,而main的是0x0c400030,要比delay的靠后。
若main在delay前面,则main为0x0c400000,delay为0x0c40006c。
同时,文件中的函数地址值可以通过hello.map文件得知。
4.如果违反了3所述的情况,可通过查看hello.map文件中主程序的地址(main),然后在用go 命令时所接的地址改为主程序的起始地址的话,也是可以正确运行程序的。
上一篇:6410裸机程序卡死