初識linux下ARM的裸機開發全過程。現在總結如下:
首先說明為什麼要學習裸機開發,一方面bootloader的編寫要用到裸機開發的知識,另一方面就是驅動的開發。一般情況下我們進行的系統上的開發。
學習要點
1、如何修改默認路徑
用戶 root
#vim /root/.bashrc
添加:export PATH=$PATH:路徑
生效路徑:source /root/.bashrc
2、裸機開發流程:1編寫裸機程序。2調試裸機程序。3生產二進制映像(編譯、鏈接、格式轉換)。4燒寫/運行二進制映像。
led.lds led.SMakefile
編譯:arm-linux-gcc -g -c led.S 生產led.o
鏈接:arm-linux-ld -Tled.lds -o led.elf led.o
格式轉換:arm-linux-objcopy -O binary led.elf led.bin
3、Makefile
all: led.o
arm-linux-ld -Tled.lds -o led.elf led.o
arm-linux-objcopy -O binary led.elf led.bin
led.o : led.S
arm-linux-gcc -g -o led.o -c led.S
.PHONY: clean
clean:
rm *.o led.elf led.bin
4、燒寫與運行
運用superboot與開發板進行通信,用dnw下載映像程序到nandflash。以nandflash重新啟動6410,可以看到led亮起來了。
燒寫的整個過程都是在windowsXP下進行的,如何在linux下運用minicom代替超級終端?並結合linux下的dnw驅動燒寫成功。
再續
有關linux下minicom與開發板通信的問題,本人查找了一個晚上的資料,終於搞定了。
1、首先要設置vmware,vm-setting-hardware-serial port添加串口設備。然後重新啟動linux,這個時候一定要保證超級終端是關閉的,以免串口被除linux以外的軟件占用。這一步也是很多朋友忘記的,至關重要。
2、minicom的設置,這很簡單,root登錄下,輸入minicom -s 就進入了設置界面。保證115200 bps。串口要設置為/dev/ttyUSB0或ttyS0(我使用的是前者,在我的電腦上後者不能用,所以就用了一根usb轉串口線就可以了,也不知道怎麼回事)。退出時一定要保持,選擇save to df1.
3、設置好以後,直接輸入minicom就可以啟動了。sd卡模式下啟動開發板就可以實現開發板與linux系統的通信了。
關於dnw驅動安裝不上的原因,我已經查實。原因是驅動編寫時用的內核版本與我用的linux內核不是一個版本。
輸入命令insmod dnw_usb.ko
然後輸入dmesg可以查看到原因
dnw_usb: version magic '2.6.32-279.el6.i686 SMP mod_unload modversions 686 ' should be
'2.6.18-53.el5xen SMP mod_unload 686 REGPARM 4KSTACKS gcc-4.1'
5、初識交叉工具鏈
1、什麼是交叉工具鏈?
鏈是集合的意思,交叉工具鏈也就是交叉工具集合的意思。之所以稱為交叉工具,是因為嵌入式的開發有宿主機和目標機兩個角色,宿主機主要用來編譯、鏈接嵌入式軟件,而嵌入式軟件要在目標機上運行,也就是目標硬件。
2、常用的交叉工具鏈
交叉編譯器 arm-linux-gcc (gcc編譯器頭文件在/usr/include/,而arm-linux-gcc頭文件用arm-linux-gcc --help中的命令可以查看頭文件地址)
交叉鏈接器 arm-linux-ld
交叉轉換器 arm-linux-objcopy
交叉ELF文件工具 arm-linux-readelf
交叉反匯編器 arm-linux-objdump
3、演示
led.lds led.S
arm-linux-gcc -g -c led.S
led.o led.lds led.S
arm-linux-ld -Tled.lds -o led.elf led.o
led.elf led.o led.lds led.S
查看elf文件
arm-linux-readelf -a led.elf
編譯產生的文件為elf文件,如果生產文件不能運行,一般會有三方面原因:
arm-linux-gcc -static -o hello hello.c
1、file查看運行環境(ARM、X86)
2、readelf查看大小端
3、查看庫arm-linux-readelf -d hello
可以自己用gcc和arm-linux-gcc兩種方式編譯生產elf文件,然後查看他們的運行環境。
反匯編:arm-linux-objdump -O -S hello/led.elf >dump
cat dump
elf格式的文件不能在ARM中運行(帶系統的ARM中如果含有elf解析器除外)。所以要進行格式的轉換,將應用程序轉換為二進制的映像程序。
arm-linux-objcopy -O binary led.elf led.bin
產生的led.bin文件可以在ARM中直接運行。
查看幫助文件方法:arm-linux-gcc --help
6、Makefile工具管理
1、為什麼要用Makefile
主要是為了提高編譯、鏈接的效率。我們可以將多條編譯命令寫在一個Makefile文件中,然後只用一條make命令就可以實現多條命令的功能。
2、Makefile怎麼構成
規則和變量
規則: 目標:依賴
<Tab>命令
變量:自定義obj=func.o func1.o
命令中引用:$(obj)
系統默認:$^:所以依賴文件 $< 第一個依賴文件 $@目標文件
3、Makefile使用技巧
直接輸入make默認執行第一條規則,第一條規則默認為最終目標。
make 目標 選擇性的執行某一個目標
內核還有uboot中經常使用一種通用規則 %.o %.s
1、取消回顯:@命令
2、使用文件名:系統默認make命令作用於makefile或Makefile文件。如果想作用於自己定義的文件則要這樣進行:
make -f file clean