rk3528_linux/docs/Patches/Real-Time-Performance

[TOC]

Rockchip RealTime Linux 实时性系统环境搭建

产品版本

芯片名称 内核版本
RK3562 kernel-5.10
RK3568 kernel-4.19kernel-5.10
RK3588 kernel-5.10

一、PREEMPT_RT

1目前kernel-5.10分为两个版本一个是5.10.160版本对应补丁位于PREEMPT_RT/kernel-5.10/5.10.160。一个是5.10.198版本对应补丁位于PREEMPT_RT/kernel-5.10/5.10.198。确认内核的方法为查看kernel/Makefile如果sublevel为160则应打上5.10.160的补丁反之应打上5.10.198的补丁。

  # SPDX-License-Identifier: GPL-2.0
  VERSION = 5
  PATCHLEVEL = 10
  SUBLEVEL = 160
  ...

2kernel-4.19 base点

commit a46049b85fd7e5e9f58701fbc387e5b4d3793f98 (rk/develop-4.19, m/master)
Author: Shunhua Lan <lsh@rock-chips.com>
Date:   Mon Feb 6 16:45:53 2023 +0800

media: i2c: lt6911uxc: create hdmirx_class devices

Signed-off-by: Shunhua Lan <lsh@rock-chips.com>
Change-Id: I61c840d812b88554aa154bfc7c1435e1345d287e

a). kernel打上补丁

kernel 5.10:

0001-patch-5.10.180-rt89.patch-on-rockchip-base-cae91899b.patch 0002-patch-5.10.180-rt89.patch-fix-runtime-error-on-rockc.patch 0003-arm64-configs-optimize-latency-for-PREEMPT_RT.patch

kernel 4.19:

0001-patch-4.19.232-rt104.patch-on-rockchip-base-09f54150.patch 0002-patch-4.19.232-rt104.patch-fix-runtime-error-on-rock.patch 0003-arm64-configs-add-rockchip_rt.config-for-PREEMPT_RT_4.19.patch

b). 编译命令以RK3588为例

$ cd $sdk/kernel/
$ export CROSS_COMPILE=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
$ make ARCH=arm64 rockchip_linux_defconfig rockchip_rt.config 
$ make ARCH=arm64 rk3588-evb1-lp4-v10-linux.img -j8

c). 烧录boot.img 并测试实时性性能

使用cyclictest测试

$ cyclictest -m -c 0 -p99 -t -D 12h

二、XENOMAI

1kernel-5.10 base点

commit cae91899b67b031d95f9163fe1fda74fbe0d931a (tag: linux-5.10-stan-rkr1)
Author: Lan Honglin <helin.lan@rock-chips.com>
Date:   Wed Jun 7 15:01:26 2023 +0800  
ARM: configs: rockchip: rv1106 enable sc301iot for battery-ipc

Signed-off-by: Lan Honglin <helin.lan@rock-chips.com>
Change-Id: Ib844385bfd58f73eaa5f4e415d598d1f983fa4cd

2kernel 4.19 base点

commit 09f54150e89f68cece4ba5af11a1fd07dfa35aa3 (rk/develop-4.19)
Author: Zhihuan He <huan.he@rock-chips.com>
Date:   Wed Aug 23 11:37:06 2023 +0800

arm64: configs: rockchip_linux_defconfig: enable rockchip edac

Signed-off-by: Zhihuan He <huan.he@rock-chips.com>
Change-Id: Ie3c9b6150e792cb1bca395f630bf35da82168f2b

(3) buildroot需要更新且包含这个补丁

commit 4bd33add016f393c8ed62fca0ace075755465928
Author: ZhiZhan Chen <zhizhan.chen@rock-chips.com>
Date:   Wed Jul 19 20:03:59 2023 +0800

    xenomai: add rockchip support
    
    Fix compilation errors with clang version 12.0.5
    
    Change-Id: Ib5f7971495f339abce2613a1d6d6d0cbfce35b37
    Signed-off-by: Liang Chen <cl@rock-c 9hips.com>

a).在kernel上打上xenomai补丁

kernel 5.10:

dovetail-core-5.10.161-on-rockchip-base-cae91899b.patch

kernel 4.19:

0001-ipipe-core-4.19.209-on-rockchip-base-09f54150e89f.patch

b).buildroot打开XENOMAI配置并编译rootfs.img

BR2_PACKAGE_XENOMAI=y
BR2_PACKAGE_XENOMAI_3_2=y
BR2_PACKAGE_XENOMAI_VERSION="v3.2.2"
BR2_PACKAGE_XENOMAI_COBALT=y
BR2_PACKAGE_XENOMAI_TESTSUITE=y
BR2_PACKAGE_XENOMAI_ADDITIONAL_CONF_OPTS="--enable-demo"

c).把xenomai系统打到内核上

$ cd $sdk/kernel
$ ../buildroot/output/rockchip_rk3588/build/xenomai-v3.2.2/scripts/prepare-kernel.sh --arch=arm64

d).编译内核并烧录boot.img rootfs.img

编译命令:

kernel 5.10(以RK3588为例)

$ cd $sdk/kernel
$ export CROSS_COMPILE=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
$ make ARCH=arm64 rockchip_linux_defconfig rk3588_linux.config
$ make ARCH=arm64 LT0=none LLVM=1 LLVM_IAS=1 rk3588-evb1-lp4-v10-linux.img -j17

kernel 4.19(以RK3568为例)

$ cd $sdk/kernel
$ export CROSS_COMPILE=../prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-
$ make ARCH=arm64 rockchip_linux_defconfig
$ make ARCH=arm64 rk3568-evb1-ddr4-v10-linux.img -j17

e)测试实时性能

(1).校准latency

 $ echo 0 > /proc/xenomai/latency 

(2) 使用cyclictest测试

 $ ./usr/demo/cyclictest -m -n -c 0 -p99 -t -D 12h

三、注意事项

1RK3568 需要使用RT版本的BL31,实时性能更好

arkbin需要更新到最新且包含这个补丁

commit c2df62ac1758a21cff946ea5d39a77a769b2052e (HEAD -> master, origin/master, origin/HEAD)
Author: Liang Chen <cl@rock-chips.com>
Date:   Thu Nov 2 16:33:14 2023 +0800

    rk3568: bl31 rt: update version to v1.02

    build from:
            30c17915b rk3568: optimize RT latency

    update feature:
            30c17915b rk3568: optimize RT latency
            4a7bee092 plat: rk3588: otp: support to read secure otp
            ...
            e7c694291 plat: rk3568: get l3 partition parameter from tags by default
            ...

            patch on gerrit: I05955dace13ec323d894583e664c128e8b582fe8 (Change-Id)

    Change-Id: I6a74ccc547624837872fbe930fec4c76a9012776
    Signed-off-by: Liang Chen <cl@rock-chips.com>

b) 编译命令:

$ cd $sdk/uboot 
$ ./make.sh rk3568-rt

c) 烧录miniloader.bin 以及uboot.img。

开机过程会有cache_write_streaming_cfg相关打印说明已经使用rt版本的bl31.

INFO:    Preloader serial: 2
NOTICE:  BL31: v2.3():v2.3-662-g30c17915b-dirty:cl, fwver: v1.02
NOTICE:  BL31: Built : 16:39:01, Nov  2 2023
INFO:    GICv3 without legacy support detected.
INFO:    ARM GICv3 driver initialized in EL3
INFO:    pmu v1 is valid 220114
INFO:    cache_write_streaming_cfg:0 2808bc00 PCTL:L3-7 L1-5 WSCTL:L1-0 L3-1
INFO:    cache_write_streaming_cfg:0 2808e400 PCTL:L3-1 L1-7 WSCTL:L1-0 L3-1
INFO:    l3 cache partition cfg-8421
INFO:    dfs DDR fsp_param[0].freq_mhz= 1560MHz
INFO:    dfs DDR fsp_param[1].freq_mhz= 324MHz
INFO:    dfs DDR fsp_param[2].freq_mhz= 528MHz
INFO:    dfs DDR fsp_param[3].freq_mhz= 780MHz
INFO:    Using opteed sec cpu_context!
INFO:    boot cpu mask: 0
INFO:    BL31: Initializing runtime services
INFO:    BL31: Initializing BL32

2RK3568上让实时任务独占实时核心提高实时性的做法

a) cache 分片

ARM Cortex-A55 架构上面支持对L3空间进行划分原理为Cortex-A55 L3 mem空间划分为4块可以配

置每个CPU使用4块L3中的哪几块在rkbin中的RKBOOT/RK3568MINIALL.ini文件进行配置

[BOOT1_PARAM]

WORD_3=0xc333

WORD_3的值0xc333表示以P0、P1、P2、P3表示L3的4块空间

cpu0、cpu1 共享L3的P0、P1。

cpu2、cpu3 共享L3的P2、P3。

WORD_3配置值详细说明如下

bit0~bit3分配给cpu0的4份L3的mask bit bit0为1表示L3的第一份分给cpu0bit1为1表示L3的

第二份分给cpu0以此类推。

bit4~bit7分配给cpu1的4份L3的mask bit。

bit8~bit11分配给cpu2的4份L3的mask bit。

bit12~bit15分配给cpu3的4份L3的mask bit。

配置后可以通过下面开机LOG确认

INFO: L3 cache partition cfg-c333

此为分配cpu3 256k L3。

b隔离核心

bootargs添加 isolcpus=3 nohz_full=3 将核心cpu3隔离出来不参与系统任务调度并作为实时核心。

diff --git a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
index c7e309645099b..28fac4880744d 100644
--- a/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
+++ b/arch/arm64/boot/dts/rockchip/rk3568-linux.dtsi
@@ -13,7 +13,7 @@ aliases {
        };
 
        chosen: chosen {
-               bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";
+               bootargs = "earlycon=uart8250,mmio32,0xfe660000 isolcpus=3 nohz_full=3 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";
        };
 
        fiq-debugger {
c实时任务绑定到实时核上运行

1将cyclitest绑定到cpu3上运行测试实时性能

taskset -c 3 cyclictest -c0 -m -t -p99  -D 12h

注:ps -eo pid,psr,comm | grep cyclictest 可以查看cyclitest是否绑定在cpu3.