ARM裸機開發(fā)bootloader交叉工具鏈
首先說明為什么要學習裸機開發(fā),一方面bootloader的編寫要用到裸機開發(fā)的知識,另一方面就是驅動的開發(fā)。一般情況下我們進行系統(tǒng)上的開發(fā),不會用到裸機開發(fā)。
本文引用地址:http://m.butianyuan.cn/article/201611/318214.htm學習要點
1、如何修改默認路徑
用戶 root
#vim /root/.bashrc
添加:export PATH=$PATH:路徑
生效路徑:source /root/.bashrc
2、裸機開發(fā)流程:1編寫裸機程序。2調試裸機程序。3生產(chǎn)二進制映像(編譯、鏈接、格式轉換)。4燒寫/運行二進制映像。
led.ldsled.SMakefile
編譯:arm-linux-gcc -g -c led.S 生產(chǎn)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、燒寫與運行
運用超級終端與開發(fā)板進行通信,用dnw下載映像程序到nandflash。以nandflash重新啟動6410,可以看到led亮起來了。
燒寫的整個過程都是在windowsXP下進行的,如何在linux下運用minicom代替超級終端?并結合linux下的dnw驅動燒寫成功。
再續(xù)
有關linux下minicom與開發(fā)板通信的問題,本人查找了一個晚上的資料,終于搞定了。
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卡模式下啟動開發(fā)板就可以實現(xiàn)開發(fā)板與linux系統(tǒng)的通信了。
關于dnw驅動安裝不上的原因,我已經(jīng)查實。原因是驅動編寫時用的內核版本與我用的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、什么是交叉工具鏈?
鏈是集合的意思,交叉工具鏈也就是交叉工具集合的意思。之所以稱為交叉工具,是因為嵌入式的開發(fā)有宿主機和目標機兩個角色,宿主機主要用來編譯、鏈接嵌入式軟件,而嵌入式軟件要在目標機上運行,也就是目標硬件。
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
編譯產(chǎn)生的文件為elf文件,如果生產(chǎn)文件不能運行,一般會有三方面原因:
arm-linux-gcc -static -o hello hello.c
1、file查看運行環(huán)境(ARM、X86)
2、readelf查看大小端
3、查看庫arm-linux-readelf -d hello
可以自己用gcc和arm-linux-gcc兩種方式編譯生產(chǎn)elf文件,然后查看他們的運行環(huán)境。
反匯編:arm-linux-objdump -D -S hello/led.elf >dump
cat dump
elf格式的文件不能在ARM中運行(帶系統(tǒng)的ARM中如果含有elf解析器除外)。所以要進行格式的轉換,將應用程序轉換為二進制的映像程序。
arm-linux-objcopy -O binary led.elf led.bin
產(chǎn)生的led.bin文件可以在ARM中直接運行。
查看幫助文件方法:arm-linux-gcc --help
6、Makefile工具管理
1、為什么要用Makefile
主要是為了提高編譯、鏈接的效率。我們可以將多條編譯命令寫在一個Makefile文件中,然后只用一條make命令就可以實現(xiàn)多條命令的功能。
2、Makefile怎么構成
規(guī)則和變量
規(guī)則: 目標:依賴
變量:自定義obj=func.o func1.o
命令中引用:$(obj)
系統(tǒng)默認:$^:所以依賴文件 $< 第一個依賴文件$@目標文件
3、Makefile使用技巧
直接輸入make默認執(zhí)行第一條規(guī)則,第一條規(guī)則默認為最終目標。
make 目標 選擇性的執(zhí)行某一個目標
內核還有uboot中經(jīng)常使用一種通用規(guī)則 %.o %.s
1、取消回顯:@命令
2、使用文件名:系統(tǒng)默認make命令作用于makefile或Makefile文件。如果想作用于自己定義的文件則要這樣進行:
make -f file clean
7、鏈接器腳本
1、鏈接器腳本有什么作用?
在源程序不變的情況下,不同的鏈接器腳本對程序會產(chǎn)生不同的效果。特別在設置代碼段首文件的時候,這會對程序的后期運行產(chǎn)生很大的作用。
2、鏈接器腳本的構成
主要分為:段
起始鏈接地址
對齊設置
使用變量
設置代碼段首文件
下面是一個例子,可以參考:
ENTRY(_start)SECTIONS{. = 0x50008000; //起始地址,.代表當前地址. = ALIGN(4); //對齊方式為4字節(jié)對齊,就是說存取地址要為4的倍數(shù).text : //代碼段{led.o (.text) //代碼段首文件設置*(.text)}. = ALIGN(4);.rodata :{*(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*)))}. = ALIGN(4);.data : //數(shù)據(jù)段{*(.data)}. = ALIGN(4);bss_start = .; //使用變量,此變量可以在源程序中應用.bss //未初始化全局變量{*(.bss). = ALIGN(4);}bss_end = .;}
下面有幾個問題說明一下:對齊設置是為了提高數(shù)據(jù)的存取效率。代碼段首文件是cpu上電時開始運行的文件。
7、eclipse的集成開發(fā)
1、為什么要使用eclipse
目的是集成編譯和在線調試
2、整個的集成開發(fā)環(huán)境構成
eclipse arm-linux-gdb jlinkgdbserver
1、eclipse的安裝十分簡單,解壓縮后,直接運行就可以了。
2、arm-linux-gdb解壓縮后還要設置默認路徑,因為之前已經(jīng)安裝了arm-tools里面含有arm-linux-gdb。設置默認路徑時要將剛安裝的gdb路徑放在前面,因為這里的默認路徑執(zhí)行靠前優(yōu)先的原則。
3、jlinkgdbserver的安裝要相對復雜一點,解壓縮后還要三個文件到新的文件夾下:1、cp -d libjlinkarm.so.* /usr/lib -f2、cp 45-jlink.rules /etc/udev/rules.d/。完成之后,運行jlinkgdbserver就可以了。
3、eclipse使用之前的配置
1、首先安裝jlink插件,這要在網(wǎng)上下載然后安裝。方法:選擇help-installnewsofteware然后填入網(wǎng)址http://opensource.zylin.com/zylincdt直接點擊ok,等待找到zylin embedded cdt 選中后點擊next 再next 選accept 后點擊finish。最后restart。
2、配置eclipse
1、file-new-makefile project with existing code
2、去掉自動組件:project-bulid automatical
3、如何編譯
選中工程led后,點project中的build all在console中可以查看make。
4、調試,Debug-debug configurations然后雙擊zylin embedded debug
5、main:選中c/c++ application的browse選擇led.elf。Debugger:arm-linux-gdb,去掉stop on startup at maincommands:運行geditinit6410進行初始化設置。之后就可以使用eclipse。
評論