我們在Ubuntu下通過vim編輯好LED的匯編程式(6.6章節),然后保存并退出,然后我們使用arm交叉編譯器來編譯該程式,我們在終端輸入“arm-linux-gnueabihf-gcc -g -c led.s -o led.o”命令,把led.s編譯成led.o,其中的“-g”引數是產生除錯資訊,可以使用GDB來除錯代碼,“-c”引數是編譯源檔案,不鏈接,“-o”引數是指定產生的檔案名稱,我們指定生成led.o,運行效果如圖 1所示:

我們可以看到通過arm交叉編譯生成了led.o檔案,這個檔案相當于中間檔案,我們還需要把編譯生成的.o檔案鏈接起來生成可執行檔案(我們這里只有一個led.o,對于有的工程可能會生成多個.o檔案),
接下來我們使用交叉編譯器的“arm-linux-gnueabihf-ld”命令來把“.o”檔案鏈接起來,鏈接的目的就是把我們的程式固定到某個地址,這樣cpu在運行的時候就可以通過鏈接地址找到我們的程式,并運行它,在鏈接之前我們需要先了解下i.MX6ULL的啟動,i.MX6ULL支持SD卡,EMMC,NAND等方式啟動,i.MX6ULL啟動的時候首先將代碼從SD卡,EMMC,NAND中拷貝到運行地址,然后開始從運行地址處開始運行, i.MX6ULL芯片內部有128K的RAM(0X900000~0X91FFFF),另外外部擴展了DDR,所以i.MX6ULL的鏈接地址可以是內部的RAM,也可以是外部的DDR,我們所有的例程都是鏈接到DDR中,其地址為0X87800000,i.MX6ULL終結者開發板的DDR有兩種:256MB和512MB,起始地址都是0X80000000,256MB的終止地址是0X8FFFFFFF,512M的終止地址是0X9FFFFFFF,之所以選擇地址0X87800000,是因為后面我們要學的Uboot鏈接地址也是0X87800000,所以為了學習方便,我們統一使用0X87800000地址,
下面我們開始使用arm-linux-gnueabihf_ld命令將前面我們生成的“led.o”檔案鏈接到0X87800000地址處,我們在終端輸入“arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf”,其中的“-Ttext”指定鏈接地址(0X87800000),“-o”生成鏈接檔案名,運行效果如圖 2所示:

我們需要把鏈接檔案轉換成“.bin”檔案,然后燒寫到EMMC,才能運行,
接下來我們使用“arm-linux-gnueabihf-objcopy”命令將鏈接檔案led.elf轉換成“led.bin”檔案,我們在終端輸入“arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin”命令,其中“-O”指定以什么格式輸出(binary表示二進制輸出),“-S”表示不要復制源檔案中的重定位資訊和符號資訊,“-g”表示不復制源檔案中的除錯資訊,運行效果如圖 3所示:

至此我們生成了最終的可執行程式“led.bin”檔案,
我們可以總結下,為了生成led.bin檔案,我們分別使用了命令:
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
為了編譯方便,我們可以使用Makefile來編譯我們的led匯編程式,首先我們在led工程目錄下使用“touch Makefile”命令創建Makefile檔案,如圖 4所示:

然后使用vim編輯器打開Makefile檔案,輸入下面的命令:
led.bin:led.s
arm-linux-gnueabihf-gcc -g -c led.s -o led.o
arm-linux-gnueabihf-ld -Ttext 0X87800000 led.o -o led.elf
arm-linux-gnueabihf-objcopy -O binary -S -g led.elf led.bin
clean:
rm -rf *.o led.bin led.elf
添加完上面的命令,保存并退出,然后在led工程目錄下執行“make”命令編譯led.S,程序如圖 5所示:

如果要清除工程,我們在終端執行“make clean”即可,
至此關于arm交叉編譯器的使用,我們就先介紹到這里,編譯生成了led.bin執行檔案,下一步我們還需要給led.bin檔案添加一些資料頭才能執行,我們為用戶提供了添加資料頭的工具“create_imx”(光碟資料的“i.MX6UL終結者光碟資料\01_開發及燒寫工具\2.裸機鏡像制作工具”目錄下),我們通過ssh工具拷貝該檔案到led工程目錄下,然后在終端輸入命令“./create_imx led.bin”,生成bare.imx檔案,如圖 6所示:

現在我們開始使用MFG燒寫工具來燒寫(光碟資料的“i.MX6UL終結者光碟資料\01_開發及燒寫工具\ 3.mfgtools_for_6ULL”檔案夾),首先我們進到該檔案夾,我們修改“cfg.ini”檔案,如果您的板子是EMMC版本(8G flash容量),按照圖 7的方式修改:

如果您的板子是NAND版本(512MB flash容量)(NAND版本的裸機驗證我們需要使用一張TF卡),按照圖 8所示修改:

修改完“cfg.ini”組態檔,然后我們在Ubuntu系統生成的“bare.imx”檔案通過ssh工具拷貝到MFG燒寫工具的“Profiles\Linux\OS Firmware\files\linux\”目錄下,如圖 9所示:

然后我們滑鼠雙擊打開MFG燒寫工具,如圖10所示:

MFG燒寫工具打開以后,我們使用開發板配帶的USB資料線,連接開發板的OTG介面和PC的USB介面,使用開發板配帶的電源連接到開發板的電源介面,然后開發板的撥碼開關設定成USB啟動,如圖 11所示:

(如果我們使用的是NAND版本的開發板,我們需要先拔掉TF卡)然后按下開發板的電源開關,使開發板上電,此時我們會看到MFG燒寫工具識別到開發板,如圖 12所示:

(如果我們使用的是NAND版本的開發板,我們需要插入TF卡),然后我們點擊MFG燒寫工具的“Start”按鈕,開始燒寫鏡像,如圖 13所示:

等到進度條顯示綠色,燒寫完成,如圖 14所示:

然后我們在按下開發板的電源按鍵給開發板斷電,然后修改撥碼開關設定正常啟動,
如果您的板子是EMMC版本(8GB Flash存盤),撥碼開關如圖 15所示:

如果您的開發板是NAND版本(512M Flash存盤),撥碼開關如圖 16所示(設定成TF卡啟動模式):

最后我們在按下開發板的電源開關,給開發板上電,此時我們會看到開發板的LED2被點亮了,如圖 17所示:

本節我們詳細的介紹了如何編譯代碼,并且如何使用MFG燒寫生成的鏡像到開發板的Flash里面,并最終運行測驗,后面我們的程式都是用MFG工具進行代碼的燒寫,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/25240.html
標籤:AI
