iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
佛心分享-SideProject30

門外漢的嵌入式地獄系列 第 5

Day 5 。初入嵌入式開發-Yocto 基本概念

  • 分享至 

  • xImage
  •  

上一篇介紹了 Yocto 的環境與安裝方式,最後提到了 local.conf 與 bblayer.conf,今天會從這裡開始說明

local.conf

https://ithelp.ithome.com.tw/upload/images/20240803/20146325ZGBf8exnR2.png
在這個 build 目錄當中 最重要的就是 bblayers.conflocal.conf 。先說明 local.conf 的用途,他是最主要的設定文件。

在 local.conf 當中 開頭為 # 是註解

變數名稱 Default 值 說明
BB_NUMBER_THREADS ${@bb.utils.cpu_count()} 可以同時執行的 BitBake 任務數量
PARALLEL_MAKE -j ${@bb.utils.cpu_count() } 可以同時進行的Make Process 數量
MACHINE qemux86 目標機器
DL_DIR ${TOPDIR}/downloads source code下載的存放目錄
SSTATE_DIR ${TOPDIR}/sstate_cache 共享狀態的暫存檔案目錄
TMP_DIR ${TOPDIR}/tmp 編譯輸出的目錄
  • BB_NUMBER_THREADS & PARALLEL_MAKE

    這兩個選項是用目前所有的可用核心的數量自動計算的,可以設定的比較少來限制電腦的loading , 設定的超過電腦的核心數量不會比較快。

  • MACHINE

    這是用於選擇我們要構建的目標系統,可以透過額外的BSP包來新增機器

  • DL_DIR 告訴 BitBake 把下載Sorce放在哪個地方

  • SSTATE_DIR : 共享狀態緩存的路徑

  • TMP_DIR : 這裡會存放非常多跟建構時有關的檔案,當編譯完後其實會佔很大的容量。

bblayer.conf

這個設定檔我們不會去手動修改他,但他最主要的目的是將我們的 layer 給加入到其中,yocto 當中的 bitbake 就可以透過這個 conf 來得知這一次我們要編譯哪些layer。後續說明指令時會介紹到這部分。

當中會放著有關 Layers 的資料 , 像是 BBLAYERS 這個變數會存放我們每一個layers 的路徑
https://ithelp.ithome.com.tw/upload/images/20240803/20146325pAXnGt5GVg.png
同時在每一個 layers 當中都可以在 conf / layer.conf 的檔案。
https://ithelp.ithome.com.tw/upload/images/20240803/20146325fW5v656lJ7.png
這個layer 的名字就叫做 layer1,優先等級 6 (數字越大優先程度越高,最大99)
https://ithelp.ithome.com.tw/upload/images/20240803/20146325yZlo1fdHLN.png
https://ithelp.ithome.com.tw/upload/images/20240803/20146325HloQEhe13W.png


概念&術語說明

  • config : 全域變數 , 使用者可以自訂變數與硬體設定資訊 ,告訴系統要建置什麼需要啥鏡像。
  • Layer (層) : 最基本的layer , 每個元層包含了 設定文件 (configs) 、 配方 (recipes) 與其他的資源,常見的有meta (元層) , meta-openembeded , meta-yocto-bsp,recipe的集合且開頭會是meta-xxx
  • recipe (配方) : 可以包含一系列用來建構二進位image的設定和任務,放在layer當中
  • metadata (元資料) : 建構系統會解析的檔案(資料),Metadata是Yocto Project中很關鍵的一個元素。元資料包含recipe,設定文件,其他參考建構指令的信息,以及控制建構什麼/如何建構(what and how)的資料。元資料也包括命令(command),軟體版本訊息,從何處獲取,其他用來做補丁的檔案或是特定場景下需要自訂軟體的資訊。
  • openEmbeded Core : OE-Core是最基礎的recipe 類別文件,和相關文件的元資料組合。
  • Poky : 參考嵌入式發行版本,同樣也用來作為提供基本功能的發行。 Poky是在OE-Core上層的一個Layer整合。
  • Packages : 建置系統的輸出,用來創立最後我們所需要的Image。
  • image : 載入到裝置上的Linux發行版本(作業系統)的二進位形式

https://ithelp.ithome.com.tw/upload/images/20240803/201463253pDKk8Z5LQ.png

。 開頭是 meta-xxx 的都是 layer
。 開頭是 recipe-xxx 的都是 recipe

目錄結構說明

├── bitbake--主要包含bitbake腳本,作為Metadata解析器,讀取Yocto Metadata並執行其定義的task。 
├── build--主要包含使用者設定文件,並將編譯輸出到此目錄。
├── contrib--
├── documentation--幫助文檔,可以產生pdf或html版本使用者手冊。 
├── LICENSE-- License聲明。 
├── LICENSE.GPL - 2.0 - only
├── LICENSE.MIT
├── MEMORIAM
├- meta--對應OpenEmbedded-Core的Metadata,包含Recipes、Classes,以及qemux86/qemuarm的機器配置。 
├── meta - poky--在meta目錄基礎上,增加Poky參考發布版本的必須Metadata。 
├── meta - selftest-- OpenEmbedded驗證編譯系統的selftest的Recipes和Append檔。 
├── meta - skeleton-- BSP和Kernel開發的Recipes模板。 
├── meta -yocto- bsp-- Yocto計畫的參考BSP Metadata。 
├── oe -init-build- env--設定OpenEmbedded編譯環境的腳本。 
├── README.hardware -> meta-yocto-bsp/ README.hardware
├── README.OE - Core
├── README.poky -> meta-poky/ README.poky
├── README.qemu
└── scripts-- Yocto專案附加功能所需的腳本。

編譯的方式

編譯流程說明

前面的文章有說明過這張圖,但在這我還是說明一下~
https://ithelp.ithome.com.tw/upload/images/20240803/201463257LoXqRE3en.png

  1. 確定架構、patch以及BSP/Policy配置等。
  2. 編譯系統從本機、SCM、外部倉庫抓取原始碼。
  3. 下載後,進行解壓縮、打補丁、設定、編譯等工作。
  4. 然後根據二進位套件格式將編譯結果安裝到臨時目錄。
  5. 在整個編譯過程中進行QA和sanity check等。
  6. 對本機編譯結果,以及外部預編譯檔案產生最終root鏡像。
  7. 輸出root鏡像以及SDK等

編譯指令

在整個build目錄的最上層資料夾輸入下方指令

bitbake <build-target>

#####範例
bitbake core-image-minimal 

這個 bitbake 就是我們所說的任務引擎,用於替我們編譯檔案。 core-image-minimal 則是最基本的image,還有預設一些其他的,可以根據需求來改變。這個 image 就跟名字一樣,他是最小化的 image,容量是最小的蛋缺點就是有非常多東西是沒有的,我們需要自己安裝。(EX: htop , stress 等等常見的工具)。

上方的指令很吃網路速度跟電腦規格,通常第一次編譯會非常的久 5~8 小時以上!

所以我們也可以透過下方這個指令,先將我們所需的檔案給下載下來,但是不編譯。

bitbake -c fetchall core-image-minimal 

等待下載完成後,有時間在進行編譯。

bitbake core-image-minimal 

當編譯到一半遇到錯誤的時候,通常會直接停止,但我們可以透過下方的命令,先讓剩餘的任務繼續編譯。避免花太多時間在修復跟編譯上面。

bitbake -k core-image-minimal 

上一篇
Day 4 。初入嵌入式開發-Yocto 環境架設
下一篇
Day 6 。初入嵌入式開發- conf 說明
系列文
門外漢的嵌入式地獄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言