OK6410裸機程式 hello world

2021-05-25 06:23:19 字數 1564 閱讀 6405

上面已經解決 了幾個問題。

現在我們的狀態:可以在pc - ok6410 之間進行tftp傳輸,確定了一下可用的位址 空間,下面我們來說一下printf除錯 、

因為沒有jlink,只能用printf除錯,你也許會問,我們自己實現printf麼?答曰:不是,我們只是弄個hello world,何必那麼認真呢?

printf函式是uboot 實現的,我們只需要呼叫就行了。當然了,這個首先得到你uboot 的printf函式位址。這需要你自己編譯 uboot,因為每個人

的printf函式位址不一定一樣。檢視system.map檔案 ,找到printf位址。就行了。

呼叫時我們可以這樣用:

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

........

show("hello world/n");

.......

現在我們來個hello world 的例子:

貼一下**:

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

int main(void)

(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 出來沒?

沒出來就找找**錯了,找不出來的往後面跟啊童鞋們!!

OK6410裸機程式 點亮LED

globl start start 硬體相關的設定 peri port setup ldr r0,0x70000000 orr r0,r0,0x13 mcr p15,0,r0,c15,c2,4 256m 0x70000000 0x7fffffff 關看門狗 往wtcon 0x7e004000 寫0 ...

OK6410 裸機開發平台搭建

廢話就不說了,直入主題。之前研究arm11開發,使用了ok6410,網上買了飛凌的,說實話,飛凌配套的軟體真的不好,初學者真的會被搞死。搭個裸機開發環境,搞半天,好在弄好了。1.材料 一張sd卡,大的那種,金士頓或者閃迪的都可以。2.步驟 關鍵的地方來了。那些驅動,在win7 64位下,真的是折騰死...

ok6410 主機tftp 傳輸

1 開發環境 pc archlinux,minicom 或者 kermit.工具不會用的google啊,呵呵 開發板 ok6410b 256 sdram,2g nand flash 兩者之間 通訊用tftp傳輸。有人用windows下的 dnw進行傳輸,由於我沒windows,另外dnw貌似有時候有...