本文主要介紹 openEuler Embedded 軟實時系統(tǒng)的特性說明,構建方式和性能測試。
軟實時特性介紹
「實時性簡介」
實時的訴求通常是事件的響應時間不能超過規(guī)定的期限,一個事件的最大響應時間應該是確定的、可以預測的。
「Preempt_RT 補丁簡介」
Preempt_RT 補丁(以下簡稱 RT 補?。┛芍苯哟蛟趦群嗽创a上,并通過內核配置選項 CONFIG_PREEMPT_RT=y 使能軟實時功能。RT 補丁實現的核心在于最小化內核中不可搶占部分的代碼,從而使高優(yōu)先級任務就緒時能及時搶占低優(yōu)先級任務,減少切換時延。除此之外,補丁通過多種降低時延的措施,對鎖、驅動等模塊也進行了優(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(樹莓派補丁)
- 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
「補丁關鍵功能舉例」
- 增加中斷程序的可搶占性(中斷線程化、軟中斷線程化)
- 增加臨界區(qū)的可搶占性(如自旋鎖)
- 增加關中斷代碼的可搶占性
- 解決優(yōu)先級反轉問題(優(yōu)先級繼承)
軟實時鏡像構建指導
具體下載源碼和編譯流程建議參考容器環(huán)境下的快速構建指導:https://openeuler.gitee.io/yocto-meta-openeuler/yocto/quickbuild/container-build.html
「QEMU RT 鏡像構建方式」
- 步驟:
下載源碼 --> 修改 bb 文件打入 RT 補丁 --> 手動打開 CONFIG_PREEMPT_RT --> 編譯構建
- 更改 aarch64 鏡像內核 bb 文件,使其構建時自動打入 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 架構,示例:
cd /usr1/openeuler/src/yocto-meta-openeuler/scripts
source compile.sh aarch64-std /usr1/build /usr1/openeuler/gcc/openeuler_gcc_arm64le
bitbake openeuler-image
-
構建鏡像生成目錄:
/usr1/build/output/
-
二進制介紹:
-
Image-5.10.0
:QEMU RT 內核鏡像 -
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 內核的壓縮鏡像
「樹莓派 RT 鏡像構建方式」
- 步驟:
下載源碼 --> 修改 bb 文件打入 RT 補?。ㄑa丁已自動打開 CONFIG_PREEMPT_RT) --> 編譯構建
- 更改 raspberrypi 鏡像內核 bb 文件,使其構建時自動打入 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 架構,示例:
cd /usr1/openeuler/src/yocto-meta-openeuler/scripts
source compile.sh raspberrypi4-64 /usr1/build /usr1/openeuler/gcc/openeuler_gcc_arm64le
bitbake openeuler-image
-
構建鏡像生成目錄:
/usr1/build/output/
-
二進制介紹:
-
Image
:樹莓派 RT 內核鏡像 -
openeuler-image-raspberrypi4-64-<時間戳>.rootfs.rpi-sdimg
:樹莓派 RT 支持 SD 卡鏡像 -
openeuler-glibc-x86-64-openeuler-image-cortexa72-raspberrypi4-64-toolchain-22.03.sh
:SDK 工具鏈
樹莓派 4B 的具體使用方法后期會詳細介紹。
?「說明」
?
- 如果開發(fā)人員使用的內核配置不是 RT 補丁中修改的 defconfig(QEMU:
arch/arm64/configs/openeuler\_defconfig
,樹莓派:arch/arm64/configs/bcm2711\_defconfig
),則需要在自己的 defconfig 中開啟內核配置選項CONFIG_PREEMPT_RT,例如上面 QEMU 構建方式中的 yocto-embedded-tools/config/arm64/defconfig-kernel- openEuler Embedded 軟實時特性當前僅支持 arm64 架構
驗證環(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
軟實時性能測試
「軟實時相關測試」
參考 RT-Tests 指導
https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/rt-tests
進行軟實時相關測試,用例包括但不限于:
- cyclictest 時延性能測試
- pi_stress 優(yōu)先級繼承測試
- hackbench 負載構造工具
下面以 cyclictest 時延性能測試為例進行說明。
「cyclictest 時延性能測試」
- 準備開發(fā)環(huán)境
安裝 SDK,準備編譯環(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í)行用例
編譯完成后生成二進制 cyclictest
,傳入單板環(huán)境后可查看執(zhí)行 cyclictest 時可配置的參數:
./cyclictest --help
cyclictest 有多種參數配置方法,用例具體的入參設計可參考 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(該數據僅為示例,具體以環(huán)境實測為準)。
?「說明:」
如果樹莓派 4B 的空載情況下,平均時延較差(如超過 20us),可查看使用的樹莓派固件是否將 CPU 頻率配置為了節(jié)能模式,并根據需要將 CPU 頻率配置為最高運行頻率。如無 cpufreq 相關接口,則不涉及。
?
輸入示例:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
輸出示例:
powersave
如上結果表示 CPU 頻率為節(jié)能模式。
配置 CPU 最高運行頻率,輸入示例:
echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
-
模塊
+關注
關注
7文章
2788瀏覽量
50380 -
源碼
+關注
關注
8文章
671瀏覽量
30330 -
openEuler
+關注
關注
2文章
328瀏覽量
6341
原文標題:openEuler Embedded 軟實時系統(tǒng)介紹
文章出處:【微信號:openEulercommunity,微信公眾號:openEuler】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
CODESYS全平臺適配openEuler 布局工業(yè)4.0前沿
軟通動力亮相openEuler Developer Day 2025
openEuler Developer Day 2025成功舉辦
潤和軟件亮相openEuler Developer Day 2025
回顧2024年度潤和軟件與openEuler的精彩瞬間
軟通動力亮相openEuler Summit 2024
RK3588J成功適配“歐拉”系統(tǒng)!助力能源電力國產OS!
軟通動力榮膺2024年度openEuler社區(qū)突出貢獻單位
華為亮相操作系統(tǒng)大會openEuler Summit 2024
潤和軟件亮相操作系統(tǒng)大會openEuler Summit 2024
潤和軟件參與openEuler社區(qū)操作系統(tǒng)安全主題技術交流
第二屆openEuler生態(tài)大會圓滿結束
中軟國際參加openEuler 24.03 LTS版本發(fā)布會
飛凌嵌入式受邀參加openEuler Embedded Meetup(廣州站)

評論