告别虚拟机,在树莓派4B上本地编译64位实时内核(Preempt RT)实战指南

张开发
2026/5/5 12:08:39 15 分钟阅读
告别虚拟机,在树莓派4B上本地编译64位实时内核(Preempt RT)实战指南
1. 为什么要在树莓派4B上本地编译实时内核很多做机器人控制或工业自动化的小伙伴都遇到过这样的问题用普通Linux系统控制电机时定时器总是不准时偶尔还会出现指令延迟。这其实就是因为标准Linux内核的调度策略不够实时。我去年做一个机械臂项目时就踩过这个坑——当时用1ms定时器测试结果发现每秒开头100ms定时器直接罢工后来换成Preempt RT实时内核才彻底解决。传统做法是在PC上用虚拟机交叉编译内核但这种方式有两个痛点一是虚拟机环境配置复杂动不动就报错二是编译出来的内核还要折腾传输和验证。其实树莓派4B的性能已经足够强大完全可以在板子上直接完成从源码到镜像的全流程编译。实测下来这种方法虽然编译时间稍长约3-5小时但避开了交叉编译的环境依赖问题特别适合手头只有树莓派的开发者。2. 准备工作系统与工具链配置2.1 基础系统安装首先需要一张至少32GB的TF卡内核编译会占用大量临时空间推荐使用**Raspberry Pi OS Lite (64-bit)**作为基础系统。用官方Imager工具烧录时记得开启SSH和WiFi方便后续远程操作。这里有个小技巧在Imager的齿轮设置里提前配置好WiFi和国家代码CN这样开机就能自动联网。烧录完成后通过SSH登录我习惯用MobaXterm先确认内核版本uname -a如果显示PREEMPT而不是PREEMPT_RT说明当前是普通内核。以我的环境为例原始系统版本是Linux 6.1.21。2.2 开发环境搭建切换到root账户操作会更方便注意生产环境不建议长期使用rootsudo passwd root sudo passwd --unlock root su root安装编译必备工具链apt-get update apt-get install -y bc git bison flex libssl-dev make vim libncurses5-dev libncursesw5-dev这些包的作用分别是bc数学计算工具git/bison/flex源码管理与解析libssl-dev加密模块支持make编译构建ncurses-dev菜单配置界面依赖3. 获取与打补丁双版本号匹配的玄机3.1 下载内核源码在/root目录下拉取树莓派官方内核源码版本号必须与当前系统内核前两位一致git clone --depth1 https://github.com/raspberrypi/linux --branch rpi-6.1.y--depth1参数可以大幅减少下载量约600MB vs 完整仓库的2GB。进入linux目录查看Makefile确认版本head -n 10 Makefile我测试时最新是6.1.43这意味着要找6.1.x系列的RT补丁。3.2 下载RT补丁关键来了RT补丁的第三个版本号必须≤内核版本。比如内核是6.1.43就只能用6.1.38或更低版本的RT补丁。到kernel.org的RT项目页面找到对应版本wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/6.1/older/patch-6.1.38-rt12.patch.gz注意避免下载带rc的测试版如6.1-rc3这类版本通常无法通过编译。4. 编译配置三个关键开关4.1 应用补丁在linux目录下执行gzip -cd ../patch-6.1.38-rt12.patch.gz | patch -p1 --verbose看到大量patching file...输出且没有FAILED提示就成功了。然后生成默认配置make bcm2711_defconfig4.2 菜单配置执行make menuconfig会进入经典配置界面。这里必须调整三个地方Preemption ModelGeneral setup - Preemption Model - Fully Preemptible Kernel(Real-Time)Timer frequencyKernel Features - Timer frequency - 1000HZ工业控制推荐1000Hz音视频应用可选100HzHigh Resolution TimersGeneral setup - Timers subsystem - [*] High Resolution Timer Support配置完成后保存退出建议先make savedefconfig备份配置。5. 编译与安装耐心等待的艺术5.1 启动编译树莓派4B有4个CPU核心建议用-j4参数并行编译make -j4这个过程大概需要3-5小时期间可以SSH保持连接建议用tmux防断连。我实测数据无并行编译6小时12分-j4编译3小时41分超频到2.0GHz2小时55分5.2 安装内核编译成功后依次执行make modules_install cp arch/arm64/boot/Image /boot/kernel8.img注意2023年10月后的系统镜像需要特殊处理cp arch/arm64/boot/dts/broadcom/*.dtb /boot/firmware/ cp arch/arm64/boot/dts/overlays/* /boot/firmware/overlays/ cp arch/arm64/boot/Image /boot/firmware/kernel8.img最后编辑启动配置echo kernelkernel8.img /boot/config.txt reboot6. 验证与调优重启后执行uname -a应该看到PREEMPT_RT标识。可以用cyclictest测试实时性apt-get install rt-tests cyclictest -t -p 80 -n -l 10000正常结果的平均延迟应该50μs。如果数值偏高可以尝试关闭图形界面systemctl set-default multi-user.target禁用看门狗echo 0 /proc/sys/kernel/watchdogCPU隔离isolcpus3启动参数将核心3专用于实时任务我在机械臂控制项目中实测打补丁后1ms定时器的抖动从原来的±1.2ms降到了±15μs效果非常明显。虽然本地编译耗时较长但比起折腾交叉编译环境的各种玄学问题这种笨办法反而更可靠。

更多文章