<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > ARM裸機開發(fā)bootloader交叉工具鏈

          ARM裸機開發(fā)bootloader交叉工具鏈

          作者: 時間:2016-11-19 來源:網(wǎng)絡 收藏
          今天跟隨國嵌,初識linux下ARM裸機開發(fā)全過程?,F(xiàn)在總結如下:

          首先說明為什么要學習裸機開發(fā),一方面bootloader的編寫要用到裸機開發(fā)的知識,另一方面就是驅(qū)動的開發(fā)。一般情況下我們進行系統(tǒng)上的開發(fā),不會用到裸機開發(fā)。

          本文引用地址:http://www.ex-cimer.com/article/201611/318214.htm

          學習要點

          1、如何修改默認路徑

          用戶 root

          #vim /root/.bashrc

          添加:export PATH=$PATH:路徑

          生效路徑:source /root/.bashrc

          2、裸機開發(fā)流程:1編寫裸機程序。2調(diào)試裸機程序。3生產(chǎn)二進制映像(編譯、鏈接、格式轉(zhuǎ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

          格式轉(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、燒寫與運行

          運用超級終端與開發(fā)板進行通信,用dnw下載映像程序到nandflash。以nandflash重新啟動6410,可以看到led亮起來了。

          燒寫的整個過程都是在windowsXP下進行的,如何在linux下運用minicom代替超級終端?并結合linux下的dnw驅(qū)動燒寫成功。

          再續(xù)

          有關linux下minicom與開發(fā)板通信的問題,本人查找了一個晚上的資料,終于搞定了。

          1、首先要設置vmware,vm-setting-hardware-serial port添加串口設備。然后重新啟動linux,這個時候一定要保證超級終端是關閉的,以免串口被除linux以外的軟件占用。這一步也是很多朋友忘記的,至關重要。

          2、minicom的設置,這很簡單,root登錄下,輸入minicom -s 就進入了設置界面。保證115200 bps。串口要設置為/dev/ttyUSB0或ttyS0(我使用的是前者,在我的電腦上后者不能用,所以就用了一根usb轉(zhuǎn)串口線就可以了,也不知道怎么回事)。退出時一定要保持,選擇save to df1.

          3、設置好以后,直接輸入minicom就可以啟動了。sd卡模式下啟動開發(fā)板就可以實現(xiàn)開發(fā)板與linux系統(tǒng)的通信了。

          關于dnw驅(qū)動安裝不上的原因,我已經(jīng)查實。原因是驅(qū)動編寫時用的內(nèi)核版本與我用的linux內(nèi)核不是一個版本。

          輸入命令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

          交叉轉(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)文件不能運行,一般會有三方面原因:

          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解析器除外)。所以要進行格式的轉(zhuǎn)換,將應用程序轉(zhuǎn)換為二進制的映像程序。

          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í)行某一個目標

          內(nèi)核還有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

          目的是集成編譯和在線調(diào)試

          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、調(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:運行geditinit6410進行初始化設置。之后就可以使用eclipse。



          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();