iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
佛心分享-SideProject30

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

Day 6 。初入嵌入式開發- conf 說明

  • 分享至 

  • xImage
  •  

上篇文章說明了 yocto 的基本概念 , 今天會說明 conf 檔案的變數以及它的用途

local.conf

在build/conf 當中有個叫做 local.conf 的檔案,這是 bitbake 編譯時讀取的第一個檔案。會依照裡面所寫的內容來進行後續編譯與連結的過程。以下會紀錄一些常用的指令與寫法,例如當我們要新增一些額外的套件該如何做。

因為我們編譯的是 core-image-minimal , 所以很多套件都沒有安裝

例如假設我們需要做效能測試 , 就會使用到循環測試的指令或是htop,但編譯的 image 當中沒有該如何做呢?

//要做效能測試需要再 conf/local.conf 裡面加上
IMAGE_INSTALL:append = " util-linux"

改過檔案後需要重新編譯。
接著就可以進到開發板去測試看看指令是否安裝

cyclictest --mlockall -t -a --priority=99 --interval=200 --distance=0 -l 1000
taskset -c 1 cyclictest -p 99 -i 1000 -H 200 -D 900

-c 1 : 指定將 cyclictest 進程綁定到 CPU 1(即使用第1個CPU核心)。這意味著 cyclictest 只會在這個指定的核心上運行。

-p : 優先權 0~99 (99最高)

-i : 兩次測試之間的時間間隔,單位是微秒(µs)

-d: 設定多個測試週期之間的最小時間間隔,假如是100

  • 核心0:測試在時間點 0 微秒開始。
  • 核心1:測試在時間點 100 微秒開始。
  • 核心2:測試在時間點 200 微秒開始。
  • 核心3:測試在時間點 300 微秒開始。

-H : 參數設置一個硬延遲閾值(以微秒為單位)。在這裡,200 表示如果測試的延遲超過 200 微秒,則會報告為硬延遲(hard latency)。這個參數可以用來檢測和記錄系統中的高延遲事件。
-D : 測試時間 秒為單位

安裝其餘的相關套件,例如是 package manager

# 安裝相關套件
CORE_IMAGE_EXTRA_INSTALL += " \
    htop \
    util-linux \
    openssh-sftp-server \
    dropbear  \
    iproute2	\
    gptfdisk	\
    mmc-utils	\
    e2fsprogs	\
    coreutils	\
    can-utils	\
    libgpiod	\
    e2fsprogs	\
    e2fsprogs-resize2fs	\
"

# MIB file
CORE_IMAGE_EXTRA_INSTALL += " \
    ieee-8021-bridge-mib \
    ieee-8021-mstp-mib   \
    ieee8021qbridgemib \
"
# tools
CORE_IMAGE_EXTRA_INSTALL += " \
    linuxptp \
    linuxptp-configs \
    iperf3 \
    iproute2-tc \
    iproute2-devlink \
    tcpdump \
    ebtables \
"
# kernel addons
CORE_IMAGE_EXTRA_INSTALL += " \
    kernel-module-edge \
    kernel-module-st-stm32-deip \
    kernel-modules \
"

# 啟用 套件管理包
IMAGE_FEATURES += "package-management"

主要的寫法就是透過 CORE_IMAGE_EXTRA_INSTALL 與 IMAGE_INSTALL,後面如果接上 :append ,代表的是追加功能,不會去覆蓋前面的,並且後續用雙引號框住,每個 tool 之間要使用 \ 來分隔開。這樣才重新編譯一次,就會發現已經安裝上去拉。

bblayers

調用 bitbake 的時候會在我們的 build 目錄中尋找 conf / bblayers.conf 的設定檔案。
當中會放著有關 Layers 的資料 , 像是 BBLAYERS 這個變數會存放我們每一個layers 的路徑
https://ithelp.ithome.com.tw/upload/images/20240803/20146325HLE3xeEByu.png

同時在每一個 layers 當中都可以在 conf / layer.conf 的檔案。
https://ithelp.ithome.com.tw/upload/images/20240803/20146325JOtuVdYzmv.png

每一個 layer 當中的 layer.conf 要設定變數 BBPATH 與 BBFILES 才可以讓 bitbake 在這個layer當中找到對應的 recipe , class , config。

BBPATH

在Bitbake 當中使用這個變數在名為 classes 的子目錄定位類別 (.bbclass) , 與在 conf 的目錄當中定位設定檔案 (.conf) 與子目錄等等。

#Sample1 
# 由冒號 : 分隔路徑
# .= 是一個賦值運算符,表示在現有的 BBPATH 變數值的基礎上,追加新的路徑。 (連接字串)
# 就是將當前層(即 ${LAYERDIR} 變數所指向的路徑)的路徑添加到現有的 BBPATH 變數中。
BBPATH .= ":${LAYERDIR}" 
# 假如當前的 BBPATH = "/path/to/bitbake/classes:/path/to/bitbake/conf"
# 而  ${LAYERDIR} 的值是 /path/to/meta-example
# 上面的做法結果就會是 BBPATH = "/path/to/bitbake/classes:/path/to/bitbake/conf:/path/to/meta-example"


#Sample2
BBPATH = "/path/to/layer1/classes:/path/to/layer1/conf"

#classes : 存放 BitBake 類文件(.bbclass 文件)的路徑
#conf : 存放 BitBake 配置文件(.conf 文件)及其它相關文件的路徑。

layer通常會將本身路徑加入到 BBPATH 的路徑當中 , 並且當 bitbake 在解析某一個layer的時候也會自動的設定 LAYERDIR,這個 LAYERDIR 會是當前的 layer 的路徑。

# meta-example --> layer 底下有個叫做 example.conf 的檔案
/path/to/meta-example -> layer 路徑
/path/to/meta-example/conf/example.conf -> example.conf 路徑
#------------------------------------------------------------------#
# example.conf 當中
VAR s1 = "t1"
VAR s2 = "t2"

# 這個 ${LAYERDIR} 展開會是 /path/to/meta-example
include ${LAYERDIR}/conf/some.inc

BBFILES

這個變數用來定位 recipe 與 通配符的路徑 (e.g, *.txt )

通常 recipe 會有兩層目錄 recipe / pkg1 / 各種檔案

# meta-example layer 底下有個 recipe-test 的目錄
/path/to/meta-example -> layer 路徑
/path/to/meta-example/recipe-test -> recipe 路徑

# 檔案結構
meta-example/
├── recipes-test/
│   ├── package1/
│   │   ├── package1.bb
│   │   └── package1.inc
│   ├── package2/
│   │   ├── package2.bb
│   │   └── package2.inc
│   └── ...

如果我們希望將 meta-example 當中的所有 recipe 放到 BBFILES 的變數中 , 可以像下方這樣做

BBFILES += "/path/to/meta-example/recipes-test/*/*.bb"
// 假如有很多 recipe 的話
BBFILES += "/path/to/meta-example/recipes1/*/*.bb"
BBFILES += "/path/to/meta-example/recipes2/*/*.bb"
// 更懶惰的寫法
BBFILES := $(shell find /path/to/meta-example/recipes1 /path/to/meta-example/recipes2 -type f -name '*.bb')

這樣所有的 recipe-test 目錄下的 .bb 檔案都會被放到BBFILES當中。

BBFILE_COLLECTIONS

這個列表由 BitBake 使用,以在它的數據目錄中找到其他與該層相關BBFILE_* 變量。每個layer會將它自己的名字加到 BBFILE_COLLECTIONS 中。目的是讓 BitBake 知道該層的存在,並能夠正確地解析和使用該層中的recipes與其他元數據。

# 假如有三個 layer : meta-yocto , meta-openembedded , meta-custom
BBFILE_COLLECTIONS += "yocto"
BBFILE_COLLECTIONS += "openembedded"
BBFILE_COLLECTIONS += "custom"

# 在每個 layer 當中的 layer.conf 內
BBFILE_COLLECTIONS += "yocto" 
...... 以此類推

BBFILE_PATTERN

讓 bitbake 知道怎麼從 BBFILE 定位到特定layer中的 recipes , 變數名稱後方需要加上該layer 的名字 。(BBFILE_PATTERN_custom)

# meta-test/conf/layer.conf

BBFILE_PATTERN_test = "^meta-test/"
# ^ 符號 用來確保 bitbake 只在 meta-test/開頭的路徑下查找 recipe

BBFILE_PRIORITY

優先權 (數字越大 優先權越高) , 當多個layer 擁有相同名稱的 recipe 時,根據這個參數來決定使用哪一layer 的配方

# meta-yocto/conf/layer.conf
BBFILE_PRIORITY_yocto = "5"

# meta-openembedded/conf/layer.conf
BBFILE_PRIORITY_openembedded = "6"

# meta-test/conf/layer.conf
BBFILE_PRIORITY_test = "10" <----- 優先選擇

BBLayers 我們比較少會去手動更改她,反而是 local.conf 當我們需要新增自己寫的 recipe 或是安裝額外的套件的時候,會需要手動去修改。在調用 bitbake 時才可以正確的安裝,ˋ這篇文章主要紀錄一些變數與常用的一些指令。


上一篇
Day 5 。初入嵌入式開發-Yocto 基本概念
下一篇
Day 7 。初入嵌入式開發-MetaData
系列文
門外漢的嵌入式地獄18
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言