九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
uboot啟動(dòng)后在內(nèi)存中運(yùn)行裸機(jī)程序hello
如題,實(shí)現(xiàn)過程中發(fā)現(xiàn)3額問題,先寫下來,待解答:

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è)人
的printf函數(shù)地址不一定一樣。查看System.map文件 ,找到printf地址。就行了。
調(diào)用時(shí)我們可以這樣用:
  1. void (*show)(char*,...) = 0xc7e11650;
  2. ........
  3. show("hello world/n");
  4. .......

現(xiàn)在我們來個(gè)hello world 的例子:
貼一下代碼:

  1. void (*show)(char *,...) = 0xc7e11650;

  2. int main(void)
  3. {
  4.     show("hello world./n");
  5.     return 0;
  6. }

(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ì)研究研究。

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
lmosem
【博文連載】cortex-a8 uboot系列: 第一章 uboot引入
為什么要有uboot?
國嵌視頻學(xué)習(xí)第九天——UBOOT基礎(chǔ)
3-OK6410開發(fā)板燒寫WinCE系統(tǒng)(8.17手工燒寫、8.20自動(dòng)燒寫)
5__dnw驅(qū)動(dòng)安裝和燒寫程序步驟
更多類似文章 >>
生活服務(wù)
熱點(diǎn)新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服