nvidia_Jetson_Orin_NX内核实时补丁PREEMPT_RT测试验证

1.需求与目的

  1. 测试验证linux实时补丁PREEMPT_RT Real-Time的效果
  2. 对外设传感器数据延迟, 系统调度延迟是否有提升

开发板: 英伟达Jetson Orin NX
外设: 底盘CAN总线, 雷达-定位-IMU 网卡, 摄像头 GMSL ->MAX9295 -->MAX9296 --> CSI

2.合入PREEMPT_RT实时补丁

Nvidia Jetson 官网合入实时补丁教程:
https://docs.nvidia.com/jetson/archives/r36.4.3/DeveloperGuide/SD/Kernel/KernelCustomization.html

编译准备

1.ubuntu系统安装依赖工具

 sudo apt install git-core build-essential bc

2.下载安装交叉编译工具

打开网页: https://developer.nvidia.com/embedded/jetson-linux
选择下载: Bootlin Toolchain gcc 11.3

安装交叉编译工具:
https://docs.nvidia.com/jetson/archives/r36.4.3/DeveloperGuide/AT/JetsonLinuxToolchain.html#at-jetsonlinuxtoolchain

mkdir $HOME/l4t-gcc
cd $HOME/l4t-gcc
tar -xf aarch64--glibc--stable-2022.08-1.tar.bz2 -C $HOME/l4t-gcc

导入环境变量

echo "export CROSS_COMPILE=$HOME/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-" >> ~/.bashrc

3.下载kernel源码

打开网页: https://developer.nvidia.com/embedded/jetson-linux
下载:

  • Driver Package (BSP) Sources --> 下载为 public_sources.tbz2

解压:

tar xf public_sources.tbz2 -C <install-path>/Linux_for_Tegra/..

Note:
这里<install-path> 目录是 nvidia sdkmanager 烧录镜像的目录,
如我测试时工作目录是: ~/nvidia/nvidia_sdk/JetPack_6.2_Linux_JETSON_ORIN_NX_TARGETS/Linux_for_Tegra
nv_jetson_sdkmanager

解压kernel代码

cd <install-path>/Linux_for_Tegra/source
tar xf kernel_src.tbz2
tar xf kernel_oot_modules_src.tbz2
tar xf nvidia_kernel_display_driver_source.tbz2

4.编译jetson kernel

编译普通内核

export NVIDIA_JETSON_DIR=/home/liuj/nvidia/nvidia_sdk/JetPack_6.2_Linux_JETSON_ORIN_NX_TARGETS/Linux_for_Tegra
export INSTALL_MOD_PATH=${NVIDIA_JETSON_DIR}/rootfs
make -C kernel
sudo -E make install -C kernel
cp kernel/kernel-jammy-src/arch/arm64/boot/Image ${NVIDIA_JETSON_DIR}/kernel/Image

编译实时内核

export NVIDIA_JETSON_DIR=/home/liuj/nvidia/nvidia_sdk/JetPack_6.2_Linux_JETSON_ORIN_NX_TARGETS/Linux_for_Tegra
export INSTALL_MOD_PATH=${NVIDIA_JETSON_DIR}/rootfs
# 合入实时补丁
./generic_rt_build.sh "enable"
# uefi 使能RT实时性
vim kernel/kernel-jammy-src/drivers/firmware/efi/efi.c

make -C kernel
sudo -E make install -C kernel
cp kernel/kernel-jammy-src/arch/arm64/boot/Image ${NVIDIA_JETSON_DIR}/kernel/Image

Note: uefi使能RT实时性
efi: Disable runtime services on RT
https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-rt-devel.git/commit/?h=linux-5.4.y-rt-rebase&id=ba7585a4a5580b4cba26ebe76050bd2ef1148948
Linux_for_Tegra/source/kernel/kernel-jammy-src/drivers/firmware/efi/efi.c

--- a/drivers/firmware/efi/efi.c
+++ b/drivers/firmware/efi/efi.c
@@ -68,7 +68,7 @@ struct mm_struct efi_mm = {
 
 struct workqueue_struct *efi_rts_wq;
 
-static bool disable_runtime;
+static bool disable_runtime = IS_ENABLED(CONFIG_PREEMPT_RT);
 static int __init setup_noefi(char *arg)
 {
 	disable_runtime = true;

5.编译modules, DTBS

由于kenrel 源码变更, Jetson依赖的第3方内核模块, 也要重新编译

构建modules

cd <install-path>/Linux_for_Tegra/source
export IGNORE_PREEMPT_RT_PRESENCE=1
export CROSS_COMPILE=<toolchain-path>/bin/aarch64-buildroot-linux-gnu-
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src

# 编译kernel模块
make modules

# 打包到rootfs
export INSTALL_MOD_PATH=<install-path>/Linux_for_Tegra/rootfs/
sudo -E make modules_install

# 更新根文件镜像
cd Linux_for_Tegra/
sudo rm -rf rootfs/dev/*  # 解决第二次编译报错
sudo ./tools/l4t_flash_prerequisites.sh # 主机依赖
sudo ./apply_binaries.sh  # rootfs工具初始化
sudo ./tools/l4t_update_initrd.sh

构建DTBS

cd <install-path>/Linux_for_Tegra/source
export CROSS_COMPILE=<toolchain-path>/bin/aarch64-buildroot-linux-gnu-
export KERNEL_HEADERS=$PWD/kernel/kernel-jammy-src
make dtbs
cp kernel-devicetree/generic-dts/dtbs/* <install-path>/Linux_for_Tegra/kernel/dtb/

6.烧录

1.使用nvidia jetson烧录软件

注意会提示kernel 版本不一致, 点击继续, 不重新构建

2.命令行烧录

比较复杂, 需要下载kernel, system rootfs,
有需要可以自己看官网教程

7.确认Real-Time PREEMPT_RT实时补丁合入

烧录成功, 启动之后, 运行下面命令
zcat /proc/config.gz |grep PREEMPT_RT

uname -r 提示rt字段
如图
nvidia_jetson_PREEMPT_RT_confirm

3.性能测试

1.实时性测试

安装实时性测试工具, rt-tests

sudo apt install rt-tests
低负载高负载
sudo cyclictest -m -S -p 80 -i 1000 -d 0sudo stress-ng --cpu 8 --io 4 --vm 2 --vm-bytes 128M --fork 4
sudo timeout 120s cyclictest -m -S -p 80 -i 1000 -d 0
实时内核policy: fifo: loadavg: 1.61 1.28 0.76 1/794 13912
T: 0 (13830) P:80 I:1000 C: 39324 Min: 2 Act: 3 Avg: 6 Max: 56
T: 1 (13831) P:80 I:1000 C: 39319 Min: 2 Act: 3 Avg: 5 Max: 31
T: 2 (13832) P:80 I:1000 C: 39314 Min: 2 Act: 3 Avg: 5 Max: 33
T: 3 (13833) P:80 I:1000 C: 39310 Min: 2 Act: 2 Avg: 5 Max: 275
T: 4 (13834) P:80 I:1000 C: 39305 Min: 2 Act: 3 Avg: 5 Max: 48
T: 5 (13835) P:80 I:1000 C: 39300 Min: 2 Act: 4 Avg: 6 Max: 40
T: 6 (13836) P:80 I:1000 C: 39296 Min: 2 Act: 3 Avg: 6 Max: 56
T: 7 (13837) P:80 I:1000 C: 39291 Min: 2 Act: 3 Avg: 14 Max: 258
policy: fifo: loadavg: 22.86 10.29 3.96 20/677 66329
T: 0 (17279) P:80 I:1000 C: 119938 Min: 2 Act: 12 Avg: 15 Max: 172
T: 1 (17284) P:80 I:1000 C: 119924 Min: 2 Act: 8 Avg: 7 Max: 27
T: 2 (17288) P:80 I:1000 C: 119910 Min: 2 Act: 6 Avg: 8 Max: 30
T: 3 (17290) P:80 I:1000 C: 119910 Min: 2 Act: 3 Avg: 8 Max: 30
T: 4 (17293) P:80 I:1000 C: 119897 Min: 3 Act: 7 Avg: 8 Max: 30
T: 5 (17297) P:80 I:1000 C: 119883 Min: 2 Act: 8 Avg: 8 Max: 28
T: 6 (17300) P:80 I:1000 C: 119875 Min: 2 Act: 10 Avg: 8 Max: 29
T: 7 (17303) P:80 I:1000 C: 119873 Min: 3 Act: 6 Avg: 9 Max: 40
普通内核policy: fifo: loadavg: 0.85 0.47 0.19 1/637 3767
T: 0 ( 2907) P:80 I:1000 C: 159991 Min: 1 Act: 3 Avg: 6 Max: 521
T: 1 ( 2908) P:80 I:1000 C: 160001 Min: 2 Act: 2 Avg: 7 Max: 383
T: 2 ( 2909) P:80 I:1000 C: 159999 Min: 2 Act: 3 Avg: 11 Max: 235
T: 3 ( 2910) P:80 I:1000 C: 159998 Min: 2 Act: 3 Avg: 6 Max: 369
T: 4 ( 2911) P:80 I:1000 C: 159996 Min: 2 Act: 4 Avg: 12 Max: 306
T: 5 ( 2912) P:80 I:1000 C: 159995 Min: 2 Act: 3 Avg: 7 Max: 85
T: 6 ( 2913) P:80 I:1000 C: 159993 Min: 2 Act: 4 Avg: 7 Max: 230
T: 7 ( 2914) P:80 I:1000 C: 159991 Min: 1 Act: 2 Avg: 6 Max: 207
policy: fifo: loadavg: 17.14 7.81 3.09 19/628 151361
T: 0 (23745) P:80 I:1000 C: 119927 Min: 3 Act: 15 Avg: 53 Max: 2056
T: 1 (23746) P:80 I:1000 C: 119954 Min: 2 Act: 8 Avg: 8 Max: 359
T: 2 (23747) P:80 I:1000 C: 119955 Min: 2 Act: 8 Avg: 8 Max: 510
T: 3 (23751) P:80 I:1000 C: 119935 Min: 2 Act: 10 Avg: 8 Max: 301
T: 4 (23752) P:80 I:1000 C: 119900 Min: 2 Act: 7 Avg: 9 Max: 1480
T: 5 (23754) P:80 I:1000 C: 119892 Min: 2 Act: 4 Avg: 9 Max: 1218
T: 6 (23756) P:80 I:1000 C: 119916 Min: 2 Act: 5 Avg: 9 Max: 1338
T: 7 (23757) P:80 I:1000 C: 119893 Min: 2 Act: 13 Avg: 8 Max: 1293

cyclictest 原理描述, 主要测试系统调度的实时性
Min 最小延迟, 时间ns
Act 当前延迟
Avg 平均延迟
Max 最大延迟

ROS机器人做数据融合时, 最大的问题就是IMU/RTK/odom/lidar数据帧延迟/丢帧, 导致定位漂移, 从而导致导航不准;
而问题的根源, 就是某一时刻系统负载高, 外设数据延迟/丢帧, 系统调用延迟

  1. 普通内核数据分析: 系统负载升高时, 延迟增加
  2. 实时内核 在高负载场景下, 进程调度延迟依旧在40ns(即0.04ms)延迟
  3. cpu0延迟最高原因, 没有做中断cpu亲和性优化分配, 默认在cpu0调度
  4. 实时内核 默认loadavg更高, 即系统负载更高

2.cpu/系统计算能力测试

使用unixbench 测试cpu性能, 并得出分数

git clone https://github.com/kdlucas/byte-unixbench
byte-unixbench-master/UnixBench
make

多核跑分
./Run -c $( cat /proc/cpuinfo| grep "processor"| wc -l )

实验数据 --> 无
依据实时补丁原理, 提升系统周期调度, cpu密集的计算型程序, 计算能力是降低的


4.总结

  1. nvidia Jetson 最新的固件支持Real-Time 内核实时补丁
  2. 实时内核 – 提升
    1. 周期性任务进程
    2. 事件驱动的实时任务进程
    3. 对时间精度要求高的多媒体处理进程
  3. 实时内核 – 降低
    1. 大量占用 CPU 资源的计算密集型进程
    2. 长时间占用内核资源的进程
  4. 实时内核中cpu计算密集优化方法
    1. 设置CPU 亲和性
    2. 调整调度策略和优先级

有需要的小伙伴, 给linux合入实时补丁, 和进行系统优化
可以加我微信, 提供有偿协助

微信名片

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值