Skip to main content

在搭载 JetPack 6.2.1 的 Seeed reComputer Jetson 上烧录 PREEMPT_RT Linux 实时内核

实时内核(也称为 PREEMPT_RT 内核)是一种具有增强实时调度能力的 Linux 内核变体。它的主要目的在于降低调度延迟、提高任务执行的确定性,而不是提升原始计算性能。

与标准 Linux 内核相比,实时内核允许高优先级任务更快地抢占 CPU 资源,并减少由中断和线程调度引起的时间抖动,从而帮助控制任务以固定周期稳定运行。在机器人、工业自动化、运动控制、自动驾驶和边缘计算等场景中,实时内核可以显著提升电机控制、传感器数据采集以及包括 CAN 和 EtherCAT 在内的工业总线通信等实时负载的稳定性和可靠性。

本指南基于官方 NVIDIA Jetson Linux R36.4.4 BSP,合并 Seeed R36.4.4 BSP,交叉编译 PREEMPT_RT 内核,并将系统烧录到 Seeed Jetson 设备的 NVMe SSD 上。

参考资料

硬件需求

  • 一台 x86 Ubuntu 主机电脑
  • 一台待烧录的 Seeed reComputer 或 reServer 设备

创建工作空间并下载系统文件

在主机电脑上创建一个工作空间:

mkdir ~/RT_ws
cd ~/RT_ws

前往 NVIDIA Jetson Linux R36.4.4,下载下图中高亮的四个文件,并将它们放到 ~/RT_ws 工作空间中。

Seeed-Studio/Linux_for_Tegra 下载源码 ZIP 包,或克隆该仓库:

git clone https://github.com/Seeed-Studio/Linux_for_Tegra.git

由于该目录名可能与 NVIDIA 官方目录名冲突,建议按照本指南的步骤下载 ZIP 包并解压。

检查 ~/RT_ws 下是否存在以下文件:

ls -lh \
Jetson_Linux_R36.4.4_aarch64.tbz2 \
Tegra_Linux_Sample-Root-Filesystem_R36.4.4_aarch64.tbz2 \
public_sources.tbz2 \
aarch64--glibc--stable-2022.08-1.tar.bz2 \
Linux_for_Tegra-r36.4.4.zip

安装主机依赖

cd ~/RT_ws

sudo apt-get update

sudo apt-get install -y \
qemu-user-static \
python3-pip \
device-tree-compiler \
flex \
bison \
libncurses-dev \
libssl-dev \
build-essential \
sshpass \
abootimg \
nfs-kernel-server \
libxml2-utils

解压官方 BSP、Rootfs、源码、工具链和 Seeed Overlay

cd ~/RT_ws

mkdir -p l4t-gcc

tar xf aarch64--glibc--stable-2022.08-1.tar.bz2 -C l4t-gcc

tar xf Jetson_Linux_R36.4.4_aarch64.tbz2

tar xf public_sources.tbz2 -C .

unzip -q Linux_for_Tegra-r36.4.4.zip -d seeed_overlay

sudo tar xpf Tegra_Linux_Sample-Root-Filesystem_R36.4.4_aarch64.tbz2 -C Linux_for_Tegra/rootfs/

rootfs 必须使用 sudo tar xpf 解压。不要使用普通的 tar,否则文件的所有者和权限会不正确。如果你已经解压过,可以继续使用现有目录。只有在希望完全重新开始时才清理旧目录。

解压 NVIDIA 源码

cd ~/RT_ws/Linux_for_Tegra/source

tar xf kernel_src.tbz2

tar xf kernel_oot_modules_src.tbz2

tar xf nvidia_kernel_display_driver_source.tbz2

合并 Seeed BSP Overlay

cd ~/RT_ws

cp -a seeed_overlay/Linux_for_Tegra-r36.4.4/. Linux_for_Tegra/

此步骤必须在构建前完成。Seeed overlay 会修改内核、OOT 模块、hardware/nvidia/t23x/nv-public 中的 DTS 和 Makefile 文件,以及 bootloader/generic/BCT。如果跳过此步骤,在烧录时将只能使用 NVIDIA 官方开发套件配置,而不会包含 Seeed 载板信息。

将 NVIDIA 二进制文件应用到 Rootfs 并安装烧录前置条件

cd ~/RT_ws/Linux_for_Tegra

sudo ./apply_binaries.sh

sudo ./tools/l4t_flash_prerequisites.sh

构建 PREEMPT_RT 内核、OOT 模块和 DTB

cd ~/RT_ws/Linux_for_Tegra/source

export ARCH=arm64

export CROSS_COMPILE=~/RT_ws/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-

./nvbuild.sh -r

-r 选项会启用 NVIDIA 官方的 PREEMPT_RT 配置。构建输出目录为 ~/RT_ws/Linux_for_Tegra/source/kernel_out。构建成功后,内核版本后缀中应包含 -rt-tegra

使用 Seeed do_copy.sh 部署 Image、DTB 和 DTBO

cd ~/RT_ws/Linux_for_Tegra/source

./do_copy.sh

# Additional checks:
ls -lh ../kernel/Image

ls ../kernel/dtb/tegra234-j401-p3768-0000+p3767-0000-recomputer.dtb

ls ../kernel/dtb/tegra234-j201-p3768-0000+p3767-0000-recomputer-indu.dtb

do_copy.sh 是 Seeed BSP 中的部署入口脚本。它会复制已构建的 reComputer 和 reServer DTB、相机和 GMSL DTBO,以及新的 kernel/Image

如果 do_copy.sh 报告找不到某个 Seeed DTB,通常意味着 Seeed overlay 没有完全合并,或者构建时没有使用带 Seeed overlay 的 source/Makefile

将内核模块安装到 Rootfs

cd ~/RT_ws/Linux_for_Tegra/source

export ARCH=arm64

export CROSS_COMPILE=~/RT_ws/l4t-gcc/aarch64--glibc--stable-2022.08-1/bin/aarch64-buildroot-linux-gnu-

export INSTALL_MOD_PATH=~/RT_ws/Linux_for_Tegra/rootfs/

sudo -E ./nvbuild.sh -i

将通用 Seeed DTBO 复制到 rootfs/boot 并更新 Initrd

cd ~/RT_ws/Linux_for_Tegra

sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx219-dual-seeed.dtbo rootfs/boot/ 2>/dev/null || true

sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx219-quad-seeed.dtbo rootfs/boot/ 2>/dev/null || true

sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx477-dual-seeed.dtbo rootfs/boot/ 2>/dev/null || true

sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx219-imx477-seeed.dtbo rootfs/boot/ 2>/dev/null || true

sudo cp -a kernel/dtb/tegra234-p3767-camera-p3768-imx477-imx219-seeed.dtbo rootfs/boot/ 2>/dev/null || true

sudo cp -a kernel/dtb/tegra234-seeed-gmsl*.dtbo rootfs/boot/ 2>/dev/null || true

sudo cp -a kernel/dtb/tegra234-seeed-orbbec-335lg-overlay.dtbo rootfs/boot/ 2>/dev/null || true

sudo ./tools/l4t_update_initrd.sh

将 DTBO 文件复制到 rootfs/boot 可以让系统在启动后继续使用 Seeed 相机和 GMSL overlay。l4t_update_initrd.sh 会将新的模块依赖写入 initrd。对于 NVMe 启动,请不要跳过此步骤。

检查构建输出

cd ~/RT_ws/Linux_for_Tegra

ls -lh kernel/Image

ls kernel/dtb/tegra234-j*.dtb

find rootfs/lib/modules -maxdepth 1 -type d -name '*-rt-tegra' -print

如果你要为 reComputer J401 烧录,至少应存在以下文件:

kernel/dtb/tegra234-j401-p3768-0000+p3767-0000-recomputer.dtb
kernel/dtb/tegra234-j401-p3768-0000+p3767-0001-recomputer.dtb
kernel/dtb/tegra234-j401-p3768-0000+p3767-0003-recomputer.dtb
kernel/dtb/tegra234-j401-p3768-0000+p3767-0004-recomputer.dtb

进入强制恢复模式并检查 USB 连接

将设备上的 REC 拨码开关拨到 ON,并使用 USB 线将 x86 主机电脑连接到旁边的 Debug/Device 接口。

在主机电脑上运行:

cd ~/RT_ws/Linux_for_Tegra

lsusb

你应当看到类似如下的输出:

Bus <bbb> Device <ddd>: ID 0955:<nnnn> NVIDIA Corp.

如果没有看到 0955,请检查 REC/GND 跳线或恢复模式按键流程,确认 Type-C 线缆支持数据传输;如果你使用的是虚拟机,请确保已将 NVIDIA USB 设备透传给 Ubuntu。

选择 Seeed 板卡配置名

cd ~/RT_ws/Linux_for_Tegra

export SEEED_BOARD_CONF=recomputer-orin-j401

test -f "${SEEED_BOARD_CONF}.conf"

可用的配置名称:

recomputer-orin-j401
recomputer-industrial-orin-j201
reserver-industrial-orin-j401
recomputer-orin-j40mini
recomputer-orin-super-j401
recomputer-orin-robotics-j401
recomputer-orin-robotics-j401-gmsl
reserver-agx-orin-j501x
reserver-agx-orin-j501x-gmsl

下表给出了产品型号与配置名称的对应关系:

产品型号配置名称
reComputer classic J3010/J3011/J4011/J4012recomputer-orin-j401
reComputer Industrial J3010/J3011/J4011/J4012recomputer-industrial-orin-j201
reServer Industrial J3010/J3011/J4011/J4012reserver-industrial-orin-j401
reComputer Mini J40 系列recomputer-orin-j40mini
reComputer Super J401 系列recomputer-orin-super-j401
reComputer Robotics J401 系列recomputer-orin-robotics-j401recomputer-orin-robotics-j401-gmsl
reServer AGX Orin J501xreserver-agx-orin-j501xreserver-agx-orin-j501x-gmsl

填写模组 EEPROM 和板卡信息变量

当直接在线烧录且 USB EEPROM 读取正常时,NVIDIA 工具通常可以自动读取这些信息。

如果遇到缺少模组或板卡信息的错误,请在烧录前根据实际模组型号填写下面的变量。

Orin NX / Orin Nano 通用数值:

模块BOARDIDBOARDSKUFABBOARDREVCHIP_SKU
Orin Nano 4GB37670004300N.200:00:00:D6
Orin Nano 8GB37670003300N.200:00:00:D6
Orin NX 16GB37670000300G.300:00:00:D3
Orin NX 8GB37670001300M.300:00:00:D4

AGX Orin J501x 通用数值:

模块BOARDIDBOARDSKUFABBOARDREVCHIP_SKU
AGX Orin 32GB37010004500J.000:00:00:D2
AGX Orin 64GB37010005500M.000:00:00:D0

reComputer J4012 / Orin NX 16GB 示例:

export BOARDID=3767
export BOARDSKU=0000
export FAB=300
export BOARDREV=G.3
export CHIP_SKU=00:00:00:D3

reComputer J3011 / Orin Nano 8GB 示例:

export BOARDID=3767
export BOARDSKU=0003
export FAB=300
export BOARDREV=N.2
export CHIP_SKU=00:00:00:D6

检查这些变量:

echo "CONF=${SEEED_BOARD_CONF} BOARDID=${BOARDID} BOARDSKU=${BOARDSKU} FAB=${FAB} BOARDREV=${BOARDREV} CHIP_SKU=${CHIP_SKU}"

Seeed 配置文件会根据映射到 BOARDSKUboard_sku 来选择 DTB_FILE。如果 BOARDSKU 不正确,烧录可能会成功,但设备可能会使用错误的 DTB 启动。在这种情况下,外设、以太网、M.2、摄像头或 GPIO 可能无法正常工作。

烧录到 NVMe

cd ~/RT_ws/Linux_for_Tegra

sudo -E BOARDID="${BOARDID}" BOARDSKU="${BOARDSKU}" FAB="${FAB}" BOARDREV="${BOARDREV}" CHIP_SKU="${CHIP_SKU}" \
./tools/kernel_flash/l4t_initrd_flash.sh \
--external-device nvme0n1p1 \
-c tools/kernel_flash/flash_l4t_t234_nvme.xml \
-p "-c bootloader/generic/cfg/flash_t234_qspi.xml --no-systemimg" \
--showlogs \
--network usb0 \
"${SEEED_BOARD_CONF}" \
external

该命令会为 Orin NX 和 Orin Nano 烧录 NVMe SSD,并处理 QSPI 启动配置。最后的 external 参数表示系统 rootfs 将从外部 NVMe 启动。如果设备有两个 NVMe SSD,仍然建议使用 external,这样 rootfs 会使用 PARTUUID

烧录完成后

烧录成功后,关闭设备电源,移除 REC/GND 跳线或松开恢复模式按钮,然后重新给 Jetson 设备上电。

验证实时内核和 DTB

检查内核版本:

uname -a

输出中应包含 -rt 后缀。

检查内核配置:

zcat /proc/config.gz | grep PREEMPT

输出中应包含:

CONFIG_PREEMPT_RT=y

使用 cyclictest 测试调度抖动:

sudo apt install -y rt-tests
sudo cyclictest -Sp90-i1000-l100000

等待一段时间后,检查 Avg 值是否低于 20 微秒。示例输出:

T: 0 (  1290) P:99 I:1000 C:100000 Min: 5  Act:10 Avg: 7  Max: 18
T: 1 ( 1291) P:99 I:1000 C:100000 Min: 4 Act: 9 Avg: 7 Max: 20

如果上述检查均通过,则说明 PREEMPT_RT 实时内核已成功安装。

技术支持与产品讨论

感谢您选择我们的产品!我们将为您提供多种支持,确保您在使用我们产品的过程中尽可能顺利。我们提供多种沟通渠道,以满足不同的偏好和需求。

Loading Comments...