1.需求与目的
- 测试验证linux实时补丁PREEMPT_RT Real-Time的效果
- 对外设传感器数据延迟, 系统调度延迟是否有提升
开发板: 英伟达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

解压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字段
如图

3.性能测试
1.实时性测试
安装实时性测试工具, rt-tests
sudo apt install rt-tests
| 低负载 | 高负载 | |
|---|---|---|
| sudo cyclictest -m -S -p 80 -i 1000 -d 0 | sudo 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数据帧延迟/丢帧, 导致定位漂移, 从而导致导航不准;
而问题的根源, 就是某一时刻系统负载高, 外设数据延迟/丢帧, 系统调用延迟
- 从普通内核数据分析: 系统负载升高时, 延迟增加
- 实时内核 在高负载场景下, 进程调度延迟依旧在40ns(即0.04ms)延迟
- cpu0延迟最高原因, 没有做中断cpu亲和性优化分配, 默认在cpu0调度
- 实时内核 默认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.总结
- nvidia Jetson 最新的固件支持Real-Time 内核实时补丁
- 实时内核 – 提升
- 周期性任务进程
- 事件驱动的实时任务进程
- 对时间精度要求高的多媒体处理进程
- 实时内核 – 降低
- 大量占用 CPU 资源的计算密集型进程
- 长时间占用内核资源的进程
- 实时内核中cpu计算密集优化方法
- 设置CPU 亲和性
- 调整调度策略和优先级
有需要的小伙伴, 给linux合入实时补丁, 和进行系统优化
可以加我微信, 提供有偿协助


3287

被折叠的 条评论
为什么被折叠?



