久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

EEPW首頁 > 嵌入式系統 > 設計應用 > OK6410裸機程序---hello world

OK6410裸機程序---hello world

作者: 時間:2016-11-09 來源:網絡 收藏
上面已經解決了幾個問題。

現在我們的狀態:可以在PC -OK6410之間進行tftp傳輸,確定了一下可用的地址空間,下面我們來說一下printf調試、
因為沒有jlink,只能用printf調試,你也許會問,我們自己實現printf么?答曰:不是,我們只是弄個hello world,何必那么認真呢?
printf函數是uboot實現的,我們只需要調用就行了。當然了,這個首先得到你uboot的printf函數地址。這需要你自己編譯uboot,因為每個人
的printf函數地址不一定一樣。查看System.map文件,找到printf地址。就行了。
調用時我們可以這樣用:

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

現在我們來個hello world 的例子:
貼一下代碼:

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

(hello.c)
就這么簡單。(一個hello world 能多復雜啊?嘎嘎~)
下面我們來說一下編譯和連接:
你也會用:arm-linux-gcc hello.c
但是這是不對的,為什么呢? 我們來仔細想一個問題,我們是裸機(好吧,我承認稍微穿了一點),沒有操作系統。想想arm 執行時,它希望
執行的第一條指令是什么?肯定是一條有效的指令了。但是我們生成的這個a.out的前面是有效的可執行的語句么?也許你已經想到了,它的頭不是什么
有效指令,是ELF頭信息,還有你的用戶名呢,用戶名不能執行吧?呵呵,開玩笑。

還有一個問題。
gcc默認的連接地址是你想要的么?八成不是吧。
鑒于以上原因我們要分步進行:
1:編譯
arm-linux-gcc -c hello.c -o hello.o
生成hello.o文件。
2:鏈接 指定我們要的鏈接地址0x50000000
arm-linux-ld -Ttext=0x50000000 hello.o -o hello
這時你用arm-linux-objdump -d hello 反匯編一下,看看指令的起始地址是50000000吧?
3:去除頭ELF頭信息
arm-linux-objcopy -L elf32-littlearm -O binary hello hello.bin
這里elf32-littlearm 是指定大小端,咱小端的。
就這樣,我們可以在裸板上運行的二進制程序就這樣成了。為了以后方便可以把上面的指令寫在Makefile里,一個make就all了。

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



評論


技術專區

關閉