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