RK3399开发板Linux实时性改造

本次测试基于NanoPC-T4开发板(国产化处理器RK3399),4.19.111内核+Xenomai实时性改造测试。

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的实时补丁,在实时调度中表现的效果有比较明显的提升。

相关推荐
神一样的老师8 分钟前
【行空板K10】上传温湿度信息到EasyIoT平台
网络·嵌入式硬件·物联网·青少年编程
迃幵chen21 分钟前
高可用虚拟IP-keepalived
linux·服务器·tcp/ip
猫猫的小茶馆1 小时前
【IO编程】标准IO和文件IO的对比
linux·c语言·嵌入式硬件·microsoft·嵌入式实时数据库
学Linux的语莫1 小时前
k8s之pod生命周期
linux·运维·docker·容器·kubernetes
启明真纳2 小时前
k8s物料清单工具——KubeClarity
linux·运维·云原生·容器·kubernetes·云计算
誓约酱3 小时前
Linux下文件操作相关接口
linux·运维·服务器·c语言·c++·后端
孙尚香蕉3 小时前
Hadoop高可用集群搭建
java·linux·hadoop
关关钧4 小时前
【Linux】sed编辑器二
linux·运维·编辑器
中科岩创4 小时前
某地武警海警总队建筑物自动化监测
大数据·物联网