擊上方“一口Linux”,選擇“星標公眾號”

前言
文章基于HD-IMX6ULL-MB 系列開發板測試驗證,該開發板由武漢芯路遙科技有限公司與武漢萬象奧科電子有限公司合作推出。此開發板基于 NXP iMX6ULL 系列 Cortex-A7 高性能處理器設計,適用于快速開發一系列具有創新性的產品如人機界面工業 4.0 掃描儀、車載終端以及便攜式醫療設備。

在前面我們提到,如果想要自己制作交叉編譯器的話,通常會用到兩個工具,分別是?crosstool-NG?和Buildroot?。但需要了解的是制作交叉編譯器只是嵌入式開發的第一步,后面我們還需要使用交叉編譯器來移植 bootloader、linux kernel 以及制作根文件系統 rootfs,之后還會用它來交叉編譯各種所需要的應用程序。其中?crosstool-NG?只是制作了一個交叉編譯器,而如果你希望一鍵完成這所有的事情, 則可以使用?Buildroot?。
如果你是一個嵌入式軟件工程師,那你有必要要知道buildroot是什么。buildroot這個工具除了可以制 作交叉編譯器以外,還提供了一種更加高效的管理方法,它把bootloader,linux,應用程序和rootfs集 成在一起,可以非常方便的去定制,管理,編譯和組裝一個自己需要的,針對自己的設備的一個完整的 軟件系統,這樣我們可以利用buildroot針對自己的嵌入式設備開發完整的BSP和SDK。
接下來我們將介紹如何使用 buildroot 來制作交叉編譯器,同時生成一個開發板可以使用的根文件系統。需要注意的是,因為 Linux 內核 和 u-boot 今后需要自己針對開發板做移植修改,所以這里將不編譯 Linux內核 和 u-boot 程序。
Buildroot 官網首頁對buildroot的定義,和特點有非常明確的介紹:h ttps://buildroot.org/ 。
buildroot的宗旨為了讓嵌入式linux開發更容易;
管理一切!為嵌入式設備生成交叉編譯工具鏈,文件系統,交叉編譯bootloader和kernel image;
易用!所有配置通過像linux一樣的menuconfig,gconfig和xconfig;
支持豐富的package資源,構建你需要的rootfs;

這里,我們從Buildroot的官方下載地址下載當前的最新長期支持版本?buildroot-2021.02.7?并解壓縮。

整個Buildroot是由Makefile(*.mk)腳本和Kconfig(Config.in)配置文件構成的,因此可以像配置Linux內 核一樣執行make menuconfig進行配置,編譯出一個完整的、可以直接燒寫到機器上運行的Linux系統文件(包含bootloader、kernel、rootfs以及rootfs中的各種庫和應用程序)。而構建開源軟件包的流程, 工作流大致如下:
獲取:獲取源代碼解壓:解壓源代碼
補丁:針對缺陷修復和增加的功能應用補丁配置:根據環境準備構建過程
安裝:復制二進制和輔助文件到它們的目標目錄
打包:為在其它系統上安裝而打包二進制和輔助文件
構建每個軟件包的工作流幾乎是相同的,Buildroot主要就是把這些重復操作自動化,用戶只需勾選上所 需軟件包,便自動完成以上所有操作。其次,U-boot、Linux Kernel的編譯工作流的差不多,只是配置的自定義參數更多,在Buildroot設置好了,也就一并生成。
在 buildroot 源碼路徑下,有很多參考的示例配置,其中就包含有?imx6ullevk?的參考配置。我們沒有必要所有的選項都自己從0開始配置,接下來我們將在它的基礎上來修改。

如果是使用?SecureCRT?遠程登錄到Linux服務器上操作的話,需要?export TERM=vt100?命令配置TERM 環境變量,否則接下來的配置可能不能輸入。接下來再執行?make menuconfig?對交叉編譯器制作進行配置。

下面是 Buildroot 的配置界面,接下來我們將對齊進行配置。在配置的過程中:
使用?上、下鍵?選擇菜單;
使用?Tab鍵?選擇底行的?或?< Exit>?;
在某個選項上按?h?可以參考該選項的配置幫助信息;
使用?空格?選擇或使能某個選項, 也可以使用?y?或?n?使能或取消該選項;如果是需要輸入配置的選項,按?回車?進入輸入;

在?Target options?選項中 ,這里配置了交叉編譯器的體系架構信息。因為我們的開發板所有的處理器
i.MX6ULL?是采樣 Cortex-A7架構,帶有 NEON 浮點運算,所以這里做如下的默認配置。

在?Build options?選項中 ,這里主要修改一下:
($(TOPDIR)/tarballs) Download dir?修改指定源碼包的下載路徑;
(/opt/buildroot/cortexA7) Host dir?修改指定交叉編譯器的安裝路徑;
libraries (both static and shared)?這里修改選擇使能靜態庫,今后編譯程序或學習過程中可能需要。

在?Toolchain?選項中,這里做如下修改:
C library?選擇使用?(glibc);
Kernel Headers?選擇?(Linux 5.10.x kernel headers);
[*] Enable C++ support?該選項選擇支持 C++編譯器,如果想支持其它的語言(Fortran、Dlanguage)也可以選擇;
這里的gcc、binutils的版本使用默認的版本

System configuration?選項中配置了根文件系統的相關信息,我們做如下修改:
(imx6ull) System hostname?設置開發板的主機名,保存在根文件系統樹?/etc/hostname?文件中;
(Welcome to LingYun iMX6ULL Board, default password '12345'.) System banner?設置開機提示信息,保存到根文件系統樹?/etc/issue?文件中;
/dev management (Dynamic using devtmpfs + mdev)?這里設置設備管理的默認程序,這里使用的是?busybox?里提供的mdev,也可以選擇?udev;
(12345) Root password?設置開發板登錄時的?root?賬號默認密碼為?12345;
移除?Custom scripts to run after creating filesystem images?里設置的腳本,我們不需要;

Kernel?選項主要是Linux內核的編譯配置,今后我們將會自己移植并編譯Linux內核,所以這里不要選擇。

Target packages?選項這里有大量的應用程序或開源庫編譯選項,如果想制作到根文件系統樹中的話, 這里可以做相應的選擇。

下面是一些建議可以選擇的軟件包:





Filesystem images?選項指定生成根文件系統鏡像的類型,因為我們將來將會自己制作系統鏡像,所以這里不需要生成。只需要將根文件系統樹打包并使用?bzip2?壓縮即可。

Bootloaders?選項主要是u-boot的編譯配置,今后我們將會自己移植并編譯U-boot,所以這里不要選擇。

Host utilities?是在編譯 Buildroot 過程中,X86主機上所依賴的一些工具。可以進去把一些能取消的都取消,從而節省編譯時間;
Legacy config options?是一些過期作廢的軟件包,一般都不需要;

配置完成之后,選擇?< Exit >?退出并保存該配置,這些配置將會保存在當前路徑下的 .config 隱藏文件里。之后的編譯過程將根據這里面的配置,選擇下載、編譯相關程序或代碼。
首先創建交叉編譯器的安裝路徑,注意制作交叉編譯器別用?root?賬號來完成,否則小心破壞自己的
Linux系統。

接下來我們就開始交叉編譯的編譯制作過程,這個過程的時間依賴PC的性能和所選擇的選項多少。我的
Linux服務器處理器是Intel(R) Xeon(R) CPU E31235 @ 3.20GHz,4核8線程,所以我這里使用?make -j8
命令用8個進程同時編譯。

編譯成功完成之后,輸出如下:

編譯過程中?下載的源碼包?將會放到?tarballs?文件夾下:


編譯生成的?根文件系統樹?將會放到?output/images/?文件夾下:

編譯生成的?交叉編譯器?將會放到?/opt/buildroot/cortexA7?路徑下:

我們可以使用下面命令查看制作好的交叉編譯器相關版本信息:

接下來我們使用制作好的交叉編譯器,交叉編譯之前寫好的?hello.c?測試程序,并放到 ARM 開發板上運行測試。需要注意的是因為新制作的交叉編譯器跟開發板上運行的C運行庫版本不一致,這里必須加上 -static 進行靜態鏈接,這樣編譯生成的程序才能在開發板上運行。

ARM 開發板上下載運行測試:

版權聲明
本文檔所有內容文字資料由凌云實驗室郭工編著,主要用于凌云嵌入式Linux教學內部使用,版權歸屬作 者個人所有。任何媒體、網站、或個人未經本人協議授權不得轉載、鏈接、轉帖或以其他方式復制發布/ 發表。已經授權的媒體、網站,在下載使用時必須注明來源,違者本人將依法追究責任。
Copyright (C) 2021 凌云物網智科實驗室·郭工
end
一口Linux?
關注,回復【1024】海量Linux資料贈送
精彩文章合集
文章推薦
點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看