1、uboot啟動(dòng)后再dnw上打印許多信息,我想改變其中的打印信息或加上自己的打印信息以證明程序運(yùn)行到何處。修改完后重新編譯uboot.bin。
在DNW下執(zhí)行dnw 50008000 USB下載uboot.bin到內(nèi)存50008000處, go 50008000,從內(nèi)存50008000處運(yùn)行我剛下載的程序,發(fā)現(xiàn)我修改的內(nèi)容并未顯示。
重新執(zhí)行dnw 50008000,nand erase 0 100000,nand write.uboot 50008000 0 100000,后從nand直接啟動(dòng),發(fā)現(xiàn)我修改的內(nèi)容被打印出來了。
總結(jié):可能的原因:1、程序下載到50008000,但50008000處并非有執(zhí)行命令。2、確實(shí)從50008000處執(zhí)行了,但uboot.bin里的start.s會調(diào)用原來nand里的uboot.bin執(zhí)行
2、uboot里有個(gè)examples文件夾里有hello_world應(yīng)用程序(姑且這么說吧):
我dnw 50008000 hello_world.bin,go 50008000,執(zhí)行后重啟了。
看了makefile里L(fēng)OAD_ADDR = 0xc100000,dnw c10000 hello_world.bin,go c1008000,執(zhí)行后停住了
然后又看了半天makefile,太繁瑣,無果,沒解決掉。
3、自己寫了個(gè)hello.c
dnw 50008000 ,go 50008000,運(yùn)行ok,打印出hello world.
參考并引用:http://blog.csdn.net/liushaowei2008/article/details/7739046
printf函數(shù)是uboot 實(shí)現(xiàn)的,我們只需要調(diào)用就行了。當(dāng)然了,這個(gè)首先得到你uboot 的printf函數(shù)地址。這需要你自己編譯 uboot,因?yàn)槊總€(gè)人現(xiàn)在我們來個(gè)hello world 的例子:
貼一下代碼:
(hello.c)
就這么簡單。(一個(gè)hello world 能多復(fù)雜???嘎嘎~)
下面我們來說一下編譯和連接:
你也會用:arm-linux-gcc hello.c
但是這是不對的,為什么呢? 我們來仔細(xì)想一個(gè)問題,我們是裸機(jī)(好吧,我承認(rèn)稍微穿了一點(diǎn)),沒有操作系統(tǒng) 。想想arm 執(zhí)行時(shí),它希望
執(zhí)行的第一條指令是什么?肯定是一條有效的指令了。但是我們生成的這個(gè)a.out的前面是有效的可執(zhí)行的語句么?也許你已經(jīng)想到了,它的頭不是什么
有效指令,是ELF頭信息,還有你的用戶 名呢,用戶名不能執(zhí)行吧?呵呵,開玩笑。
還有一個(gè)問題。
gcc默認(rèn)的連接地址是你想要的么?八成不是吧。
鑒于以上原因我們要分步進(jìn)行:
1:編譯
arm-linux-gcc -c hello.c -o hello.o
生成hello.o文件。
2:鏈接 指定我們要的鏈接地址0x50000000
arm-linux-ld -Ttext=0x50000000 hello.o -o hello
這時(shí)你用arm-linux-objdump -d hello 反匯編一下,看看指令的起始地址是50000000吧?
3:去除頭ELF頭信息
arm-linux-objcopy -L elf32-littlearm -O binary hello hello.bin
這里elf32-littlearm 是指定大小端,咱小端的。
就這樣,我們可以在裸板上運(yùn)行 的二進(jìn)制程序 就這樣成了。為了以后方便可以把上面的指令寫在Makefile里,一個(gè)make就all了。
總結(jié):就是函數(shù)的入口地址搞不清楚,不是在50008000,故失敗,先放這里,這個(gè)不著急,等有時(shí)間再來仔細(xì)研究研究。
聯(lián)系客服