本次测试基于NanoPC-T4开发板(国产化处理器RK3399),4.19.111内核+Xenomai实时性改造测试。
-
Xenomai下载网站:https://xenomai.org/downloads/
-
NanoPC-T4网站:https://wiki.friendlyarm.com/wiki/index.php/NanoPC-T4/zh
1、RK3399移植Xenomai实时框架
按照NanoPC-T4网站中的12节,搭建环境,安装交叉编译器,下载源码,编译系统。
建议使用64位的国产Linux系统,需要安装如下软件包:
sudo apt-get -y install bison g++-multilib git gperf libxml2-utils make
python-networkx zip
sudo apt-get -y install flex curl libncurses5-dev libssl-dev zlib1g-dev gawk minicom
sudo apt-get -y install openjdk-8-jdk
sudo apt-get -y install exfat-fuse exfat-utils device-tree-compiler liblz4-tool
sudo apt-get -y install android-tools-fsutils
sudo apt-get -y install swig
sudo apt-get -y install python-dev python3-dev
- 安装交叉编译器
该编译器可用来编译Linux系统的内核和u-boot,用以下命令下载并安装:
git clone https://github.com/friendlyarm/prebuilts.git -b master
--depth 1
cd prebuilts/gcc-x64
cat toolchain-6.4-aarch64.tar.gz* | sudo tar xz -C /
然后将编译器的路径加入到PATH中,用vi编辑vi ~/.bashrc,在末尾加入以下内容:
export PATH=/opt/FriendlyARM/toolchain/6.4-aarch64/bin:$PATH
export GCC_COLORS=auto
执行一下~/.bashrc脚本让设置立即在当前shell窗口中生效,注意"."后面有个空格:
. ~/.bashrc
这个编译器是64位的,不能在32位的PC Linux系统上运行,安装完成后,用以下命令可以验证是否安装成功:
aarch64-linux-gcc -v
Using built-in specs.
COLLECT_GCC=aarch64-linux-gcc
COL-LECT_LTO_WRAPPER=/opt/FriendlyARM/toolchain/6.4-aarch64/libexec/gcc/aarch64-cortexa53-linux-gnu/6.4.0/lto-wrapper
Target: aarch64-cortexa53-linux-gnu
Configured with: /work/toolchain/build/aarch64-cortexa53-linux-gnu/build/src/gcc/configure --build=x86_64-build_pc-linux-gnu
--host=x86_64-build_pc-linux-gnu --target=aarch64-cortexa53-linux-gnu --prefix=/opt/FriendlyARM/toolchain/6.4-aarch64
--with-sysroot=/opt/FriendlyARM/toolchain/6.4-aarch64/aarch64-cortexa53-linux-gnu/sysroot --enable-languages=c,c++
--enable-fix-cortex-a53-835769 --enable-fix-cortex-a53-843419 --with-cpu=cortex-a53
...
Thread model: posix
gcc version 6.4.0 (ctng-1.23.0-150g-FA)
- ipipe补丁
从Xenomai下载网站上下载xenomai-3.1.tar.bz2压缩包以及ipipe-core-4.19.115-arm64-6.patch,与4.19.111内核源码放在同一目录下。
进入内核源码目录,打ipipe补丁。
cd linux-kernel-rk3399-4.19.111-2c71631-20210307
patch -p1 < ../ipipe-core-4.19.115-arm64-6.patch
因为小版本号有不同,所以会有部分地方的补丁打不上,需要根据.rej文件手动去打补丁。
- xenomai补丁
解压xenomai源码目录,进入xenomai源码目录xenomai-3.1/scripts,使用脚本prepare-kernel.sh对linux内核源码打cobalt内核补丁
tar -xvf xenomai-3.1.tar.bz2
cd xenomai-3.1/scripts
./prepare-kernel.sh --linux=~
/Desktop/rk3399/linux-kernel-rk3399-4.19.111-2c71631-20210307 --arch=arm64 --outpatch=../../xenomai-4.19.111.patch
其中主要参数为:
--linux=指定linux源码的绝对路径;
--ipipe=指定ipipe补丁。如果已经手动对linux源码打ipipe补丁,则不需要指定该参数。
--arch=指定硬件架构,x86_64、arm、arm64
outpatch=指定输出xenomai patch(绝对路径)。默认情况下如果不使用该参数,prepare-kernel.sh打cobalt内核补丁时,只会在linux源码目录建立与cobalt源码的软连接文件,这样的话,如果xenomai源码移动了就会有很多问题,所以推荐使用该参数生成xenomai内核的补丁,再去对linux使用该补丁。这样linux源码内的cobalt内核相关源码文件就不是链接文件了,今后再次构建时也直接使用该补丁。
回到linux源码目录使用补丁:
cd linux-kernel-rk3399-4.19.111-2c71631-20210307
patch -p1 < ../xenomai-4.19.111.patch
-
xenomai内核配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nano-pi4_linux_defconfig
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- menuconfig
进行如下配置:
CPU Frequency scaling --->
[ ] CPU Frequency scaling
CPU Idle --->
[ ] CPU idle PM support
- 编译源码
使用准备的源码,进行编译:
cd linux-kernel-rk3399-4.19.111-2c71631-20210307
make ARCH=arm64 CROSS_COMPILE=aarch64-linux- nanopi4-images
编译完成后会生成 kernel.img resource.img 这两个文件,将其拷贝到eflasher系统的TF卡覆盖旧文件即可, 假设TF卡的FRIENDLYARM分区挂载到FRIENDLYARM目录,更新命令如下:
注:tf卡需要先刷写rk3399-eflasher-friendlycore-focal-4.19-arm64-20210319.img镜像文件。
# for Lubuntu
cp kernel.img resource.img /media/FRIENDLYARM/lubuntu/
# for FriendlyCore
cp kernel.img resource.img /media/FRIENDLYARM/friendlycore-arm64/
# for FriendlyDesktop
cp kernel.img resource.img /media/FRIENDLYARM/friendlydesktop-arm64/
2、实时性能测试
Cyclictest 是 rt-tests 下的一个测试工具,也是rt-tests 下使用最广泛的测试工具,它是一个高精度的测试程序,一般主要用来测试使用内核的延迟,从而判断内核的实时性。介绍几个常用参数:
-p PRIO --prio=PRIO 最高优先级线程的优先级 使用时方法为: -p 90 / --prio=90
-m --mlockall 锁定当前和将来的内存分配
-c CLOCK --clock=CLOCK 选择时钟 cyclictest -c 1
0 = CLOCK_MONOTONIC (默认)
1 = CLOCK_REALTIME
-i INTV --interval=INTV 基本线程间隔,默认为1000(单位为us),
-l LOOPS --loops=LOOPS 循环的个数,默认为0(无穷个),与 -i 间隔数结合可大致算出整个测试的时间,比如 -i 1000 -l 1000000 ,总的循环时间为1000*1000000=1000000000 us =1000s ,所以大致为16分钟多。
-n --nanosleep 使用 clock_nanosleep
-h HISTNUM --histogram=US 在执行完后在标准输出设备上画出延迟的直方图(很多线程有相同的权限)US为最大的跟踪时间限制,结合gnuplot 可以画出我们测试的结果图。
-q --quiet 使用-q 参数运行时不打印信息,只在退出时打印概要内容,结合-h HISTNUM参数会在退出时打印HISTNUM 行统计信息以及一个总的概要信息。
-f --ftrace ftrace函数跟踪(通常与-b 配套使用,其实通常使用 -b 即可,不使用 -f)
-b USEC --breaktrace=USEC 当延时大于USEC指定的值时,发送停止跟踪。USEC,单位为谬秒(us)。
输出结果含义:
T: 0 序号为0的线程
P: 0 线程优先级为0
C: 计数器。线程的时间间隔每达到一次,计数器加1
I: 时间间隔(us)
Min: 最小延时(us)
Act: 最近一次的延时(us)
Avg:平均延时(us)
Max:最大延时(us)
使用下述命令安装rt-tests测试工具。
#sudo apt install rt-tests
使用NanoPC-T4开发板以及两个个不同版本的内核进行测试。目的是评测实时化改造后系统实时性差异。分别使用4.19.111,4.19.111 + xenomai 3.1两个版本的内核,使用rt-tests工具在有/无压测的测试场景中进行全线程、不计次数、使用clock_nanosleep高分辨率睡眠时钟、优先级为99的cyclictest测试。
本次实时内核测试使用以下命令:
sudo cyclictest -a -t -p99
-a:全线程(根据CPU核数自动创建,RK3399为6核,会启动6线程)
-t:不限次数循环测试
-p:设置优先级(设置线程最大级别99)
- 4.19.111内核测试
- 4.19.111+Xenomai3.1内核测试
从统计结果可以看出,可以看出Xenomai3.1的实时补丁,在实时调度中表现的效果有比较明显的提升。