嵌入式Linux學習筆記(二) 交叉編譯環境和Linux系統編譯、下載


目錄

(1).參考資料

(2).交叉編譯環境構建

(3).uboot編譯和驗證

(4).Linux的編譯

(5).文件系統的編譯

 
    在上一章我們已經根據項目需求確定了后續的實現目標:首先就要熟悉自己的平台,完成交叉環境編譯環境的構建,並進行嵌入式Linux系統編譯,下載和執行,理論上來說,這部分的內容其實是相當復雜的,如何選擇指定的編譯器,uboot的執行和裁剪,配置內核滿足應用需求,設備樹的構建,文件系統的加載流程,這些都是需要去掌握的重要知識。但是在本項目的實現流程我們不能夠在這部分花太多時間,並不是他們不重要,而是對於產品來說,這部分是成體系的東西,不應該在最初的時候 花費太大的精力去理解細節,某些時候使用官方或者開發板廠商提供的資源包,以方便快速開發作為基礎是比較合理的方法。當應用開發一段時間,在各方面有着基礎之后,遇到問題在反過來去理解和掌握,化整為零,即可以增強收獲感,也可以,學與用結合,事半功倍。本次編譯都會使用正點原子提供的修改后的內核和系統文件,另外參考原子文檔內的章節會講解的更詳細(具體細節按照原章節掌握更合理),這里因為篇幅原因只講解流程中用到的知識,如果后續設計需要,則會根據應用需求來裁剪。
 

參考資料

  1.正點原子《Linux驅動開發指南說明V1.0》 第四章 開發環境搭建

  2.正點原子《Linux驅動開發指南說明V1.0》 第三十章 U-Boot使用實驗

  3.正點原子《Linux驅動開發指南說明V1.0》 第三十七章 Linux內核移植

  4.正點原子《Linux驅動開發指南說明V1.0》 第三十八章 根文件系統移植

 

交叉編譯環境構建

  選擇正點原子A盤>5、開發工具>1、交叉編譯器中已經下載好的編譯工具,並根據Ubuntu系統位數的不同選擇指定的編譯器,如我安裝的系統是64位,選擇gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz文件

  1)在linux下使用指令sudo su,輸入密碼后進入root模式

  2) 使用指令創建文件夾

mkdir -p /usr/local/arm

  3)將gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.通過SSH Secure Shell Client上傳到創建的/usr/local/arm文件夾下,如果上傳失敗,要用

chmod 777 /usr/local/arm

  修改路徑的權限, 上傳之后如圖所示

  

 

  4)使用指令

tar -xvf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz

  解壓到當前路徑,如下:

  5)將路徑添加到全局變量上,使用vim /etc/profile指令,在末尾添加

export PATH="$PATH:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin"

  同時使用vim /etc/environment,路徑如下:

PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin"

  開啟新的窗口,此時通過

echo $PATH

  即可查看全局路徑下gcc的路徑是否成功添加。

  注意:修改上述路徑需要注意不要有語法錯誤,否則可能導致全局路徑丟失,導致系統問題

  6)最后通過指令,即可查看是否安裝成功

arm-linux-gnueabihf-gcc -v

 

  至此,交叉環境的編譯即搭建完成,因為以應用為目的,所以后續都以開發板提供的工具為准,如果想了解編譯器和下面的安裝包,建議詳細去看《Linux驅動開發指南說明V1.0》的指定章節。

 

uboot編譯和驗證

  從學習的角度來說,這三部分在整個嵌入式Linux的要占很大的比重,這部分很重要,而且也必須要掌握去了解,但是從應用的角度,首先最重要的是去實現需求,所以最初這部分不要去深究,因為偏離去學的話,一方面會占用大量的時間,另一方面這部分資料學起來分散,容易因為沒有目標而不知道深入的重點,因此先以熟練使用為目標,后面在工程開發中穿插實現。因此這里就以正點原子提供的uboot和linux系統為准,在掌握這部分知識之前,需要確定Linux的啟動方式,這部分會經常用到。

  

  1).使用光盤資料A盤>1、例程源碼>3、正點原子修改后的Uboot和Linux,將解壓后的文件上傳到Ubuntu到的路徑下。

  2).在/usr/code/uboot下使用

tar -xvf uboot-imx-2016.03-2.1.0-g9bd38ef-v1.0.tar.bz2

  指令解壓,解決后結果如下:

   3).以我的硬件平台(ddr256M, nand512M為例), 使用默認配置文件為mx6ull_14x14_ddr256_nand_defconfig, 使用如下指令進行編譯

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_ddr256_nand_defconfig

  執行結果如下,即用於編譯的.config的文件,最后執行編譯指令:

make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j12

   如此就完成了編譯,然后參考《Linux驅動開發指南說明V1.0》中8.4.3章節,使用imxdownload即可完成下載(具體如何下載參考。使用指令

./imxdownload u-boot.bin /dev/sdb

  即可實現下載,結果如下:

  至於sdb就是我的SD卡掛載的地址,可通過ls /dev/sd*查看,此外這個下載會格式化指定的路徑,需要格外注意,不要出錯。

  將SD卡插在嵌入式Linux平台上,修改Boot為Pin1,Pin7高,復位芯片,打印如下:

 

  到這一步初步完成了uboot的體驗,此外uboot也支持很多指令,這些后面會了解到,按照進度會掌握。

 

Linux的編譯

  1).使用光盤資料A盤>1、例程源碼>3、正點原子修改后的Uboot和Linux,將解壓后的文件上傳到Ubuntu到的路徑下,解壓即可。

  2).在/usr/code/uboot下使用

tar -xvf linux-imx-4.1.15-2.1.0-g49efdaa-v1.0.tar.bz2

  指令解壓,解決后結果如下:

  3).使用如下指令

cd arch/arm/boot/dts
vim Makefile
在400多行添加對應的設備樹,如我的開發板對應:

使用:wq保存文件即可。

  4).使用如下指令進行編譯

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

  執行結果如,即用於編譯的.config的文件,最后執行編譯指令:

make V=1 ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j16

  如此即完成了編譯,編譯結果如下:

  

  編譯之后文件路徑在

arch/arm/boot/zImage
arch/arm/boot/dst/imx6ull-14x14-emmc-4.3-800x480-c.dts

  將上述文件和uboot文件通過SSH傳輸到Windows系統,為后面使用MfgTool工具下載做准備。

 

 文件系統的編譯

  1).使用光盤資料A盤>1、例程源碼>6、BusyBox源碼,將解壓后的文件上傳到Ubuntu到的路徑下,解壓即可。

  2).在/usr/code/uboot下使用

tar -xvf busybox-1.29.0.tar.bz2

  指令解壓,解壓后結果如下:

   3). 修改Makefile文件,最好使用絕對路徑,如果找不編譯器,可通過指令echo $PATH查看當前路徑是否添加,支持中文字符詳細參考文檔38.2.2說明。

164 CROSS_COMPILE ?= /usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
190 ARCH ?= arm

  4). 使用指令進行將鏈接編譯到指定的路徑

make install CONFIG_PREFIX=/usr/code/rootfs/nfs/

  5). 在編譯后的路徑添加文件夾,並將支持動態庫添加到路徑下,參考文檔38.2.3說明。

  6). 參考38.2.4章節,創建/etc/init.d/rcS,內容

#!/bin/sh
 
PATH=/sbin:/bin:/usr/sbin:/usr/bin
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib
export PATH LD_LIBRARY_PATH runlevel
 
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

  創建文件etc/fstab,內容

#<system> <mount point> <type> <options> <dump> <pass>
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0

  創建etc/inittab文件,內容

#etc/inittab
::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh 
::restart:/sbin/init 
::ctrlaltdel:/sbin/reboot 
::shutdown:/bin/umount -a -r 
::shutdown:/sbin/swapoff -a

  然后使用打包指令

tar -vcjf rootfs.tar.bz2 *

  獲取打包文件: rootfs.tar.bz2

MgTool工具下載更新

  完成上述所有流程,我們就獲得了最基礎的底層應用結構,包含:

  Uboot   -- uboot.bin(重命名為imx6ull-14x14-nand-4.3-800x480-c.bin)

  Kernel  -- zImage, imx6ull-14x14-emmc-4.3-800x480-c.dts

  文件系統 -- rootfs.tar.bz2

   有了上述軟件,就可以進行后續的代碼下載,參考39.5章節說明:
  1. MgTool的工具使用原子提供,路徑為A盤>5.開發工具>4.正點原子修改過的MFG_TOOL燒寫工具>mfgTool,通關將撥碼開關置到僅2為高,然后復位,使用Mfgtool2-NAND-ddr256-NAND.vbs指令先下載測試。
  2. MgTool的下載分為兩部分,
    第一步為將Profiles/Linux/OS Firmware/firmware下的文件下載到DRAM中,在跳轉執行系統
    第二步則與DRAM中運行的系統交互,將Profiles/Linux/OS Firmware/files內的文件通過UTP通訊使用指令將數據更新到NandFlash中
     這里就有個注意點:files路徑下的文件才是要更新的固件,如果替換了firmware,而編譯的內核不支持UTP通訊的話,后續就會停在Unconnected位置
  3. 替換firmware下的uboot,filesystem中的文件,名稱要一致,內容如下
  uboot路徑下替換
  
  filesystem下直接用rootfs替換,
  4. 替換后使用Mfgtool2-NAND-ddr256-NAND.vbs燒錄即可, 另外如果出現tar error,可以直接刪除Profiles/Linux/OS Firmware/ucl2.xml, 刪除關於tar的指令
  
   燒錄完成后結果如下(通過串口連接電腦,就是打印系統啟動信息的串口,波特率115200):
  

   5.將boot置為Pin1, Pin5, Pin8為高,復位即可發現系統已經替換成我們編譯的最小文件系統。

  

總結

  至此,關於項目方案實現的第一步就已經完成,在本節中,體驗了編譯uboot,內核和文件系統,並進行了燒錄,但如果對比本節的內容和參考文檔的相關說明,就會發現我省略了很多內容,舉幾個例子,官方的Uboot是如何變成原子的修改后的Uboot,如何通過make menuconfig配置符合需求應用,這部分重要嗎,事實上很重要,未來的很多時候都要和這些知識打交道,但當你當剛踏入嵌入式學習的時候,去深入鑽研,一方面沒有概念,難以建立清晰的脈絡認知,另一方面這部分是基石,知識繁雜且耗時,學習就很難快速給予反饋,這是最大的障礙,所以初步以運用為主,體驗下流程即可,重心還是快速進入應用和驅動開發,等真正需要時(如將模塊編入內核),就需要去深入掌握,但那時肯定有了足夠的嵌入式Linux開發經驗,也更容易去理解,事倍功半。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM