RK3562 单板机 Linux-RT 系统开发指南:内核配置、实时性优化与案例详解

天资达人 人工智能 2026-02-11 4137 0

前 言

本文档详细介绍了Linux-RT实时内核的性能测试方法,以及使用Linux-RT内核进行系统开发和应用开发的使用说明。

开发环境

Windows开发环境:Windows1064bit、Windows764bit

Linux开发环境:VMware16.2.5、Ubuntu20.04.6 64bit

LinuxSDK:LinuxSDK-[版本号](基于rk3562_linux_sdk_release_v1.2.0)

系统版本:Tronlong-Desktop 20.04、Linux-5.10.209、Linux-RT-5.10.209、U-Boot-2017.09

交叉编译工具链:

应用开发交叉编译工具链:aarch64-linux-gnu-gcc(版本为9.4.0)

U-Boot开发、内核开发:gcc-arm-10.3-2021.07-x86_64-arm-none-linux-gnueabihf

备注:本文基于2GByte LPDDR4X、16GByte eMMC配置单板机进行演示。

术语表

为便于阅读,下表对文档出现的关键术语进行解释;对于广泛认同释义的术语,在此不做注释。

wKgZO2mKzYaAVj-sAAAbHEW1VFQ201.png

注意事项

我司默认使用的是Linux内核,同时提供了Linux-RT内核位于产品资料“4-软件资料LinuxKernelimagelinux-5.10-[版本号]-[Git系列号]”目录下。请按照如下方法替换为Linux-RT内核。

将Linux-RT内核镜像boot-rt.img拷贝至单板机系统任意目录下。执行如下命令,替换内核镜像至eMMC,单板机重启生效。

备注:如需固化至系统系统启动卡,请将命令中的"mmcblk0p3"替换为"mmcblk1p3"。

Target# dd if=boot-rt.img of=/dev/mmcblk0p3conv=fsync

Target# sync

Target# reboot

图 1

wKgZPGmKzY-AI6q6AAApiDe4WD0842.png图 2 Linux-RT内核

1Linux-RT介绍

我司提供的Linux-RT内核应用了开源的RT PREEMPT机制进行补丁。PREEMPT_RT补丁的关键是最小化不可抢占的内核代码量,同时最小化必须更改的代码量,以便提供这种附加的可抢占性。Linux-RT内核增加PREEMPT_RT补丁后,增加了系统响应的确定性和实时性,但是代价是CPU性能降低。

Linux-RT内核与普通Linux内核相比,几个主要的相同之处是:

(1)具有相同的开发生态系统,包括相同工具链、文件系统和安装方法,以及相同的POSIX API等。

(2)仍然存在内核空间和用户空间的划分。

(3)Linux应用程序在用户空间中运行。

Linux-RT内核与普通Linux内核在常规编程方式上的几个主要不同之处是:

(1)调度策略。

(2)优先级和内存控制。

(3)基于Linux-RT内核的应用程序使用了调度策略后,系统将根据调度策略对其进行调优。

2Linux系统实时性测试

本章节主要介绍使用Cyclictest延迟检测工具测试Linux系统实时性的方法。Cyclictest是rt-tests测试套件下的一个测试工具,也是rt-tests下使用最广泛的测试工具,一般主要用来测试内核的延迟,从而判断内核的实时性。

Cyclictest常用于实时系统的基准测试,是评估实时系统相对性能的最常用工具之一。Cyclictest反复测量并精确统计线程的实际唤醒时间,以提供有关系统的延迟信息。它可测量由硬件、固件和操作系统引起的实时系统的延迟。

为了测量延迟,Cyclictest运行一个非实时主线程(调度类SCHED_OTHER),该线程以定义的实时优先级(调度类SCHED_FIFO)启动定义数量的测量线程。测量线程周期性地被一个到期的计时器(循环报警)所定义的间隔唤醒,随后计算有效唤醒时间,并通过共享内存将其传递给主线程。主线程统计延迟值并打印最小、最大和平均延迟时间。

参考链接:https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start?s=cyclictest。

2.1Linux、Linux-RT实时性对比

本次测试结合Iperf和Cyclictest工具,对比测试基于Linux-RT-5.10.209内核和Linux-5.10.209内核的系统实时性能。此处使用Iperf工具不断触发系统中断,提高中断处理负载,以便更好测试系统实时特性。

在Ubuntu执行如下命令查看IP地址,并以服务器模式启动Iperf测试。

Host# ifconfig

Host# iperf3 -s

图 3

分别使用Linux-RT-5.10.209内核和Linux-5.10.209内核启动单板机,执行如下命令以客户端模式启动Iperf,并连接至服务器端(Ubuntu系统)。"192.168.13.61"为Ubuntu的IP地址,"-t3600"设置测试时间为3600秒,"&"表示让程序在后台运行。

Target# iperf3 -c 192.168.13.61 -d -t3600 > /dev/null 2>&1 &

wKgZPGmKzciANg9eAAANaiGZ9jQ945.png图 4

单板机系统默认已提供Cyclictest工具,进入单板机系统,执行如下命令使用Cyclictest工具测试系统实时性。

Target# cyclictest -t5 -p98 -m -D10m

wKgZO2mKzdKANVNqAABPyeguwlI132.png图 5 Linux-RT-5.10.209内核测试结果

wKgZO2mKzdKANVNqAABPyeguwlI132.png图 6 Linux-5.10.209内核测试结果

wKgZO2mKzd-ANiWdAAAqTewfUIw292.png

对比测试数据,可看到基于Linux-RT-5.10.209内核的系统的延迟更加稳定,平均延迟、最大延迟更低,系统实时性更佳。

Cyclictest命令参数解析可执行"cyclictest --help"查看,如下图所示。

wKgZPGmKzeaAbQn0AAEIFCb8VZU444.png图 7

2.2Linux-RT性能测试

本次测试分别在CPU空载、满负荷(运行stress压力测试工具)、隔离CPU核心的情况下,对比评估Linux-RT内核的系统实时性。

2.2.1CPU空载状态

单板机上电启动,进入单板机系统,执行如下命令修改内核printk日志等级,避免内核打印信息影响实时测试。

Target# echo 1 > /proc/sys/kernel/printk

wKgZPGmKze-AYRpnAAAH6yqwGfY214.png图 8

调整内存分配策略为"1",禁用内存过度使用。避免出现OOM(Out-of-Memory) Killer攻击某些进程而产生延迟,影响测试结果。

Target# echo 1 > /proc/sys/vm/overcommit_memory

wKgZPGmKzfeAMJG4AAAInBla2gk328.png图 9

执行如下命令,基于CPU空载状况下测试系统的实时性。测试指令需运行12小时,请保持单板机长时间稳定工作,测试完成后将生成统计结果no_load_output文件。

Target# cyclictest -m -Sp99 -i1000 -h800 -D12h -q > no_load_output

wKgZPGmKzf-AU2OxAAAMB2iRA-w557.png图 10

参数解析:

-m:锁定当前和将来的内存分配;

-n:使用clock_nanosleep;

-S:采用标准SMP测试;

-p:设置线程优先级;

-i:设置线程的基本间隔;

-h:运行后将延迟直方图转储至标准输出,亦可指定要跟踪的最大延时时间(以微秒为单位);

-D:指定测试运行时长,附加m(分钟)、h(小时)、d(天)指定;

-q:运行时不打印相关信息;

2.2.2CPU满负荷状态

单板机上电启动,进入单板机系统执行如下命令,修改内核printk日志等级,避免内核打印信息影响实时测试。

Target# echo 1 > /proc/sys/kernel/printk

wKgZPGmKze-AYRpnAAAH6yqwGfY214.png图 11

调整内存分配策略为"1",禁用内存过度使用。避免出现OOM(Out-of-Memory) Killer攻击某些进程而产生延迟,影响测试结果。

Target# echo 1 > /proc/sys/vm/overcommit_memory

wKgZPGmKzfeAMJG4AAAInBla2gk328.png图 12

执行如下命令,运行stress压力测试工具,使得CPU处于满负荷状态。

Target# stress-ng --cpu 4 --cpu-method=all --io 4 --vm 4 --vm-bytes 64M --timeout 43200s &

wKgZO2mKzj-AVwowAAAZjId2pDA445.png图 13

参数解析:

--cpu:指定压力测试的进程个数;

--cpu-method:指定CPU压力测试的方式;

--io:指定I/O测试的进程个数;

--vm:指定内存测试的进程个数;

--vm-bytes:指定每个内存测试进程中分配内存的大小;

--timeout:指定测试时长;

使用cyclictest工具测试CPU满负荷状态下的系统实时性能。测试指令需运行12小时,请保持单板机长时间稳定工作,测试完成后将生成统计结果overload_output文件。

Target# cyclictest -m -Sp99 -i1000 -h800 -D12h -q > overload_output

wKgZO2mKzsKABFrvAAAmrhTjfV8973.png图 14

2.2.3隔离CPU核心状态

本次测试以隔离CPU3核心为例,通过降低系统上所运行的其他进程对隔离CPU3产生的延迟影响,确保CPU3进程的正常运行,进而评估Linux-RT内核的系统实时性。

单板机上电启动后,在U-Boot倒计时结束之前长按"Ctrl + C"进入U-Boot命令行模式,执行如下命令,修改环境变量,隔离CPU3核心。

备注:若从板载eMMC启动系统,请将命令中"sd"修改为"emmc"。

U-Boot# setenv bootargs "storagemedia=sd androidboot.storagemedia=sd androidboot.mode=normal isolcpus=3"

U-Boot# saveenv

U-Boot# reset

wKgZPGmKzuKAfCjbAAAStRaUXGw273.png图 15

如需恢复U-Boot环境变量,在U-Boot命令行模式执行以下命令。

U-Boot# env default -f -a

U-Boot# saveenv

U-Boot# reset

wKgZO2mKzuqAS8i8AAAU27ODN7I743.png图 16

进入单板机系统,执行如下命令,查看环境变量是否设置成功。

Target# cat /proc/cmdline

wKgZO2mKzvGAfzfjAAAiux-VB_g098.png图 17

执行如下命令,修改内核printk日志等级,避免内核打印信息影响实时测试。

Target# echo 1 > /proc/sys/kernel/printk

wKgZPGmKze-AYRpnAAAH6yqwGfY214.png图 18

调整内存分配策略为"1",禁用内存过度使用。避免出现OOM(Out-of-Memory) Killer攻击某些进程而产生延迟,影响测试结果。

Target# echo 1 > /proc/sys/vm/overcommit_memory

wKgZPGmKzfeAMJG4AAAInBla2gk328.png图 19

执行如下命令,运行stress压力测试工具,使得CPU处于满负荷状态。

Target# stress-ng --cpu 4 --cpu-method=all --io 4 --vm 4 --vm-bytes 64M --timeout 43200s &

wKgZO2mKzj-AVwowAAAZjId2pDA445.png图 20

因CPU3核心被隔离,程序默认不会运行在CPU3上,需使用taskset工具将cyclictest测试程序运行在所有核心上,测试cyclictest在满负荷状态的CPU3的实时性能。测试指令需运行12小时,请保持单板机长时间稳定工作,测试完成后将生成统计结果iso_overload_output文件。

Target# taskset -c 0-3 cyclictest -m -Sp99 -i1000 -h800 -D12h -q > iso_overload_output

wKgZO2mKzxCAZ5feAAAosMQdjnE058.png图 21

2.2.4统计结果分析

我司已提供脚本文件get_histogram.sh用于绘制统计结果直方图,位于产品资料“4-软件资料Demolinux-rt-demoscyclictest”目录下,请将该脚本文件拷贝至Ubuntu工作目录下。

wKgZPGmKzxeAVuKRAAA_3MzYr-Q091.png图 22

在Ubuntu系统执行如下命令,安装gnuplot工具。

Host# sudo apt-get install gnuplot

wKgZPGmKzyCAJ5giAAGZxKRPa1Y143.png图 23

(1)CPU空载状态

请将CPU空载状态下的统计结果no_load_output文件拷贝至Windows工作目录,使用Windows文本工具打开该文件并拖动至文件末尾,可查看Linux系统每个核心CPU0~CPU3的最小延迟(Min Latencies)、平均延迟(Avg Latencies)、最大延迟(Max Latencies)统计结果。

wKgZPGmKzyiANKcUAACDlEeying985.png图 24

请将CPU空载状态下的统计结果no_load_output文件拷贝至Ubuntu,存放在get_histogram.sh同一目录下。拷贝no_load_output文件为output文件。执行如下命令生成直方图文件plot.png,请将其拷贝至Windows下并打开。

Host# cp no_load_outputoutput

Host# ./get_histogram.sh

wKgZPGmKzzCALDqTAADD_AJJSDE238.png图 25

wKgZO2mKzzGAavfZABKQbEYugts738.png图 26

根据测试结果output文件数据以及结合直方图,可得主要数据如下表。本次测试中,CPU1核心Max Latencies值最大,为74us,CPU2核心的Max Latencies值最小,为49us。

备注:测试数据与实际测试环境有关,仅供参考。

wKgZPGmK0ByARQU6AAAWYjcQYZg229.png

(2)CPU满负荷状态

参考如上方法,分析CPU满负荷状态下的统计结果如下所示。本次测试中,CPU2核心Max Latencies值最大,为195us,CPU1核心的Max Latencies值最小,为135us。

wKgZO2mK0CSAG3NIAABQ74eEwZ4344.png图 27

wKgZO2mK0CqAJ96LAAAW8-e8vls046.png

(3)隔离CPU核心状态

参考如上方法,分析隔离CPU核心状态下的统计结果如下所示。本次测试中,CPU0核心Max Latencies值最大,为284us,隔离CPU3核心的Max Latencies值最小,为76us。

wKgZPGmK0DCAJFh0AABRnG91UD8480.png图 28

wKgZPGmK0DiALSk4AAAXY0-GzNU178.png

根据CPU空载、CPU满负荷、隔离CPU核心三种状态的测试结果可知:当程序指定至隔离的CPU3核心上运行时,Linux系统延迟最低,可有效提高系统实时性。故推荐对实时性要求较高的程序(功能)指定至隔离的CPU核心运行。

由于篇幅过长等原因,部分内容均不逐一展示,如需获取完整版详细资料,请关注Tronlong创龙科技微信公众号或官网,或者评论区留言,感谢您的支持!

审核编辑 黄宇