本文主要介紹 openEuler Embedded 軟實時系統(tǒng)的特性說明,構(gòu)建方式和性能測試。
軟實時特性介紹
「實時性簡介」
實時的訴求通常是事件的響應(yīng)時間不能超過規(guī)定的期限,一個事件的最大響應(yīng)時間應(yīng)該是確定的、可以預(yù)測的。
「Preempt_RT 補丁簡介」
Preempt_RT 補丁(以下簡稱 RT 補?。┛芍苯哟蛟趦?nèi)核源碼上,并通過內(nèi)核配置選項 CONFIG_PREEMPT_RT=y 使能軟實時功能。RT 補丁實現(xiàn)的核心在于最小化內(nèi)核中不可搶占部分的代碼,從而使高優(yōu)先級任務(wù)就緒時能及時搶占低優(yōu)先級任務(wù),減少切換時延。除此之外,補丁通過多種降低時延的措施,對鎖、驅(qū)動等模塊也進(jìn)行了優(yōu)化。
openEuler Embedded 版本中可使用的 RT 補丁請參考:
- QEMU:
??
- patch-5.10.0-60.10.0-rt62.patch
- patch-5.10.0-60.10.0-rt62_openeuler_defconfig.patch
- raspberrypi:
??
- 0000-raspberrypi-kernel.patch(樹莓派補?。?/li>
- 0001-add-preemptRT-patch.patch
- 0002-modifty-bcm2711_defconfig-for-rt-rpi-kernel.patch
「補丁獲取地址」
https://gitee.com/src-openeuler/kernel/blob/openEuler-22.03-LTS
「補丁關(guān)鍵功能舉例」
- 增加中斷程序的可搶占性(中斷線程化、軟中斷線程化)
- 增加臨界區(qū)的可搶占性(如自旋鎖)
- 增加關(guān)中斷代碼的可搶占性
- 解決優(yōu)先級反轉(zhuǎn)問題(優(yōu)先級繼承)
軟實時鏡像構(gòu)建指導(dǎo)
具體下載源碼和編譯流程建議參考容器環(huán)境下的快速構(gòu)建指導(dǎo):https://openeuler.gitee.io/yocto-meta-openeuler/yocto/quickbuild/container-build.html
「QEMU RT 鏡像構(gòu)建方式」
- 步驟:
下載源碼 --> 修改 bb 文件打入 RT 補丁 --> 手動打開 CONFIG_PREEMPT_RT --> 編譯構(gòu)建
- 更改 aarch64 鏡像內(nèi)核 bb 文件,使其構(gòu)建時自動打入 RT 補丁,示例:
cd /usr1/openeuler/src/yocto-meta-openeuler/meta-openeuler/recipes-kernel/linux/
sed -i '/0001-arm64-add-zImage/a file://src-kernel-5.10/patch-5.10.0-60.10.0-rt62.patch \' linux-openeuler.bb
sed -i '/patch-5.10.0-60.10.0-rt62.patch/a file://src-kernel-5.10/patch-5.10.0-60.10.0-rt62_openeuler_defconfig.patch \' linux-openeuler.bb
git diff 輸出示例:
diff --git a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb
index 77d8717..5a4b2b8 100644
--- a/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb
+++ b/meta-openeuler/recipes-kernel/linux/linux-openeuler.bb
@@ -11,6 +11,8 @@ SRC_URI = "file://kernel-5.10
# add patches only for aarch64
SRC_URI_append_aarch64 += "
file://yocto-embedded-tools/patches/${ARCH}/0001-arm64-add-zImage-support-for-arm64.patch
+ file://src-kernel-5.10/patch-5.10.0-60.10.0-rt62.patch
+ file://src-kernel-5.10/patch-5.10.0-60.10.0-rt62_openeuler_defconfig.patch
"
# add patches for OPENEULER_PLATFROM such as aarch64-pro
- 打開 aarch64 鏡像 defconfig 中的 CONFIG_PREEMPT_RT,示例:
cd /usr1/openeuler/src/yocto-embedded-tools/config/arm64/
sed -i 's/CONFIG_PREEMPT=y/CONFIG_PREEMPT_RT=y/g' defconfig-kernel
git diff 輸出示例:
diff --git a/config/arm64/defconfig-kernel b/config/arm64/defconfig-kernel
index dece4f7..c4ef7ab 100644
--- a/config/arm64/defconfig-kernel
+++ b/config/arm64/defconfig-kernel
@@ -80,7 +80,7 @@ CONFIG_HIGH_RES_TIMERS=y
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
-CONFIG_PREEMPT=y
+CONFIG_PREEMPT_RT=y
CONFIG_PREEMPT_COUNT=y
CONFIG_PREEMPTION=y
- 編譯時選擇 aarch64-std 架構(gòu),示例:
cd /usr1/openeuler/src/yocto-meta-openeuler/scripts
source compile.sh aarch64-std /usr1/build /usr1/openeuler/gcc/openeuler_gcc_arm64le
bitbake openeuler-image
-
構(gòu)建鏡像生成目錄:
/usr1/build/output/
-
二進(jìn)制介紹:
-
Image-5.10.0
:QEMU RT 內(nèi)核鏡像 -
openeuler-image-qemu-aarch64-<時間戳>.rootfs.cpio.gz
:QEMU 文件系統(tǒng) -
openeuler-glibc-x86-64-openeuler-image-aarch64-qemu-aarch64-toolchain-22.03.sh
:SDK 工具鏈 -
zImage
:QEMU RT 內(nèi)核的壓縮鏡像
「樹莓派 RT 鏡像構(gòu)建方式」
- 步驟:
下載源碼 --> 修改 bb 文件打入 RT 補?。ㄑa丁已自動打開 CONFIG_PREEMPT_RT) --> 編譯構(gòu)建
- 更改 raspberrypi 鏡像內(nèi)核 bb 文件,使其構(gòu)建時自動打入 RT 補丁并打開 CONFIG_PREEMPT_RT,示例:
cd /usr1/openeuler/src/yocto-meta-openeuler/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/
sed -i '/0000-raspberrypi-kernel.patch/a file://src-kernel-5.10/0001-add-preemptRT-patch.patch \' linux-openeuler.bbappend
sed -i '/0001-add-preemptRT-patch.patch/a file://src-kernel-5.10/0002-modifty-bcm2711_defconfig-for-rt-rpi-kernel.patch \' linux-openeuler.bbappend
git diff 輸出示例:
diff --git a/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend b/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend
index ad6ebab..cf52b3d 100644
--- a/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend
+++ b/bsp/meta-openeuler-bsp/raspberrypi/recipes-kernel/linux/linux-openeuler.bbappend
@@ -1,5 +1,7 @@
SRC_URI += "
file://src-kernel-5.10/0000-raspberrypi-kernel.patch
+ file://src-kernel-5.10/0001-add-preemptRT-patch.patch
+ file://src-kernel-5.10/0002-modifty-bcm2711_defconfig-for-rt-rpi-kernel.patch
"
OPENEULER_KERNEL_CONFIG = "${S}/arch/${ARCH}/configs/bcm2711_defconfig"
do_configure_prepend() {
- 編譯時選擇 raspberrypi4-64 架構(gòu),示例:
cd /usr1/openeuler/src/yocto-meta-openeuler/scripts
source compile.sh raspberrypi4-64 /usr1/build /usr1/openeuler/gcc/openeuler_gcc_arm64le
bitbake openeuler-image
-
構(gòu)建鏡像生成目錄:
/usr1/build/output/
-
二進(jìn)制介紹:
-
Image
:樹莓派 RT 內(nèi)核鏡像 -
openeuler-image-raspberrypi4-64-<時間戳>.rootfs.rpi-sdimg
:樹莓派 RT 支持 SD 卡鏡像 -
openeuler-glibc-x86-64-openeuler-image-cortexa72-raspberrypi4-64-toolchain-22.03.sh
:SDK 工具鏈
樹莓派 4B 的具體使用方法后期會詳細(xì)介紹。
?「說明」
?
- 如果開發(fā)人員使用的內(nèi)核配置不是 RT 補丁中修改的 defconfig(QEMU:
arch/arm64/configs/openeuler\_defconfig
,樹莓派:arch/arm64/configs/bcm2711\_defconfig
),則需要在自己的 defconfig 中開啟內(nèi)核配置選項CONFIG_PREEMPT_RT,例如上面 QEMU 構(gòu)建方式中的 yocto-embedded-tools/config/arm64/defconfig-kernel- openEuler Embedded 軟實時特性當(dāng)前僅支持 arm64 架構(gòu)
驗證環(huán)境的軟實時是否使能
- 查看系統(tǒng)是否有 PREEMPT_RT 字樣:
輸入示例:
uname -a
輸出示例:
Linux openeuler 5.10.0-rt62-v8 #1 SMP PREEMPT_RT Fri Mar 25 0322 UTC 2022 aarch64 GNU/Linux
軟實時性能測試
「軟實時相關(guān)測試」
參考 RT-Tests 指導(dǎo)
https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/rt-tests
進(jìn)行軟實時相關(guān)測試,用例包括但不限于:
- cyclictest 時延性能測試
- pi_stress 優(yōu)先級繼承測試
- hackbench 負(fù)載構(gòu)造工具
下面以 cyclictest 時延性能測試為例進(jìn)行說明。
「cyclictest 時延性能測試」
- 準(zhǔn)備開發(fā)環(huán)境
安裝 SDK,準(zhǔn)備編譯環(huán)境,示例:
sh openeuler-glibc-x86_64-openeuler-image-aarch64-qemu-aarch64-toolchain-22.03.sh
. /path/to/sdk/environment-setup-aarch64-openeuler-linux
- 編譯用例
git clone https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git
cd rt-tests
git checkout stable/v1.0
make all
- 執(zhí)行用例
編譯完成后生成二進(jìn)制 cyclictest
,傳入單板環(huán)境后可查看執(zhí)行 cyclictest 時可配置的參數(shù):
./cyclictest --help
cyclictest 有多種參數(shù)配置方法,用例具體的入?yún)⒃O(shè)計可參考 test-design
https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/test-design
輸入示例:
./cyclictest -p 90 -m -i 100 -n -h 100 -l 10000000
輸出示例:
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 2.32 1.99 1.58 1/95 311
T: 0 ( 311) P:90 I:100 C:10000000 Min: 7 Act: 9 Avg: 8 Max: 16
即用例循環(huán) 1000 萬次后,平均時延為 8us,最壞時延為 16us(該數(shù)據(jù)僅為示例,具體以環(huán)境實測為準(zhǔn))。
?「說明:」
如果樹莓派 4B 的空載情況下,平均時延較差(如超過 20us),可查看使用的樹莓派固件是否將 CPU 頻率配置為了節(jié)能模式,并根據(jù)需要將 CPU 頻率配置為最高運行頻率。如無 cpufreq 相關(guān)接口,則不涉及。
?
輸入示例:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
輸出示例:
powersave
如上結(jié)果表示 CPU 頻率為節(jié)能模式。
配置 CPU 最高運行頻率,輸入示例:
echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
-
模塊
+關(guān)注
關(guān)注
7文章
2725瀏覽量
47610 -
源碼
+關(guān)注
關(guān)注
8文章
649瀏覽量
29310 -
openEuler
+關(guān)注
關(guān)注
2文章
319瀏覽量
5922
原文標(biāo)題:openEuler Embedded 軟實時系統(tǒng)介紹
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論