新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > OK6410裸機(jī)程序---hello world

        OK6410裸機(jī)程序---hello world

        作者: 時(shí)間:2016-11-09 來(lái)源:網(wǎng)絡(luò) 收藏
        上面已經(jīng)解決了幾個(gè)問(wèn)題。

        現(xiàn)在我們的狀態(tài):可以在PC -OK6410之間進(jìn)行tftp傳輸,確定了一下可用的地址空間,下面我們來(lái)說(shuō)一下printf調(diào)試、
        因?yàn)闆](méi)有jlink,只能用printf調(diào)試,你也許會(huì)問(wèn),我們自己實(shí)現(xiàn)printf么?答曰:不是,我們只是弄個(gè)hello world,何必那么認(rèn)真呢?
        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í)我們可以這樣用:

        本文引用地址:http://www.104case.com/article/201611/317816.htm
        1. void (*show)(char*,...) = 0xc7e11650;
        2. ........
        3. show("hello world/n");
        4. .......

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

        1. void (*show)(char *,...) = 0xc7e11650;
        2. int main(void)
        3. {
        4. show("hello world./n");
        5. return 0;
        6. }

        (hello.c)
        就這么簡(jiǎn)單。(一個(gè)hello world 能多復(fù)雜?。扛赂聗)
        下面我們來(lái)說(shuō)一下編譯和連接:
        你也會(huì)用:arm-linux-gcc hello.c
        但是這是不對(duì)的,為什么呢? 我們來(lái)仔細(xì)想一個(gè)問(wèn)題,我們是裸機(jī)(好吧,我承認(rèn)稍微穿了一點(diǎn)),沒(méi)有操作系統(tǒng)。想想arm 執(zhí)行時(shí),它希望
        執(zhí)行的第一條指令是什么?肯定是一條有效的指令了。但是我們生成的這個(gè)a.out的前面是有效的可執(zhí)行的語(yǔ)句么?也許你已經(jīng)想到了,它的頭不是什么
        有效指令,是ELF頭信息,還有你的用戶名呢,用戶名不能執(zhí)行吧?呵呵,開(kāi)玩笑。

        還有一個(gè)問(wèn)題。
        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了。

        下面就可以下到板子上運(yùn)行了,把hello.bin放在你PC上的tftp目錄下面。板子上電,停留在uboot界面上。
        tftp 50000000 hello.bin
        go 50000000 (跳到這個(gè)地址執(zhí)行,uboot的命令)
        hello world 出來(lái)沒(méi)?
        沒(méi)出來(lái)就找找哪里錯(cuò)了,找不出來(lái)的往后面跟啊童鞋們??!



        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 佛学| 白沙| 灵石县| 乐陵市| 三门县| 温泉县| 兴和县| 遂川县| 增城市| 桂平市| 清水县| 玉田县| 罗源县| 河东区| 本溪市| 石嘴山市| 安新县| 阿克苏市| 星座| 沙洋县| 铜陵市| 读书| 水富县| 永定县| 双辽市| 临沧市| 辉南县| 麻城市| 南木林县| 樟树市| 海口市| 满洲里市| 沙洋县| 岐山县| 合水县| 乌兰察布市| 钦州市| 普宁市| 喜德县| 张掖市| 墨玉县|