本文主要介绍 openeuler embedded 软实时系统的特性说明,构建方式和性能测试。
软实时特性介绍 「实时性简介」
实时的诉求通常是事件的响应时间不能超过规定的期限,一个事件的最大响应时间应该是确定的、可以预测的。
「preempt_rt 补丁简介」
preempt_rt 补丁(以下简称 rt 补丁)可直接打在内核源码上,并通过内核配置选项 config_preempt_rt=y 使能软实时功能。rt 补丁实现的核心在于最小化内核中不可抢占部分的代码,从而使高优先级任务就绪时能及时抢占低优先级任务,减少切换时延。除此之外,补丁通过多种降低时延的措施,对锁、驱动等模块也进行了优化。
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
「补丁关键功能举例」
增加中断程序的可抢占性(中断线程化、软中断线程化) 增加临界区的可抢占性(如自旋锁) 增加关中断代码的可抢占性 解决优先级反转问题(优先级继承) 软实时镜像构建指导 具体下载源码和编译流程建议参考容器环境下的快速构建指导: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.bbsed -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.bbindex 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-kernelindex 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/scriptssource compile.sh aarch64-std /usr1/build /usr1/openeuler/gcc/openeuler_gcc_arm64lebitbake openeuler-image 构建镜像生成目录:
/usr1/build/output/
二进制介绍:
image-5.10.0:qemu rt 内核镜像 openeuler-image-qemu-aarch64-.rootfs.cpio.gz:qemu 文件系统 openeuler-glibc-x86-64-openeuler-image-aarch64-qemu-aarch64-toolchain-22.03.sh:sdk 工具链 zimage:qemu rt 内核的压缩镜像 「树莓派 rt 镜像构建方式」
步骤: 下载源码 --> 修改 bb 文件打入 rt 补丁(补丁已自动打开 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.bbappendsed -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.bbappendindex 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/scriptssource compile.sh raspberrypi4-64 /usr1/build /usr1/openeuler/gcc/openeuler_gcc_arm64lebitbake 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 的具体使用方法后期会详细介绍。
❝ 「说明」
如果开发人员使用的内核配置不是 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 架构 ❞ 验证环境的软实时是否使能 查看系统是否有 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 优先级继承测试 hackbench 负载构造工具 下面以 cyclictest 时延性能测试为例进行说明。
「cyclictest 时延性能测试」
准备开发环境 安装 sdk,准备编译环境,示例:
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.gitcd rt-testsgit checkout stable/v1.0make all 执行用例 编译完成后生成二进制 cyclictest,传入单板环境后可查看执行 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 0uspolicy: fifo: loadavg: 2.32 1.99 1.58 1/95 311t: 0 ( 311) p:90 i:100 c:10000000 min: 7 act: 9 avg: 8 max: 16 即用例循环 1000 万次后,平均时延为 8us,最坏时延为 16us(该数据仅为示例,具体以环境实测为准)。
❝ 「说明:」
如果树莓派 4b 的空载情况下,平均时延较差(如超过 20us),可查看使用的树莓派固件是否将 cpu 频率配置为了节能模式,并根据需要将 cpu 频率配置为最高运行频率。如无 cpufreq 相关接口,则不涉及。
❞ 输入示例:
cat /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor 输出示例:
powersave 如上结果表示 cpu 频率为节能模式。
配置 cpu 最高运行频率,输入示例:
导电胶点胶加工时点胶机编程的几种方式介绍
CanSM模块如何处理Busoff等问题呢
小米5G新机已获得无线电发射型号核准
华为智能手表专利曝光:支持边框触控技术
5G到底该不该成为购机新指标?
openEuler Embedded软实时系统的特性说明
高压开关柜的使用和故障检测
高阶产品大盘点:新唐Arm9微处理器系列
16款产品索赔8000万!华为诉讼三星案件最新进展
LED处于寒冬期,专家建议开拓新市场
运放的简单应用-电压比较
门岗机器人,解决传统物业访客管理问题
智芯传感ZXP6系列压力传感器 在呼吸机应用中实现国产替代
石墨烯产业链分析市场格局的特点
关于五个基本的RC振荡电路的分析介绍
持续追踪三星Note7,竟然还有30万粉真爱粉在使用
制作大屏可视化报表时需要注意什么
关于碳化硅你了解多少
中兴高管嘲讽小米“回光返照”,要靠这款新机打脸小米?
探讨电容充放电时间的计算方法