Raspberry Pi 树莓派硬实时补丁PREEMPT_RT配置与内核编译
标准的Linux内核的实时特性只能满足软实时应用的要求,为用户空间提供简基本的POSIX操作,但是无法保证严格的程序运行时间期限。而实时抢占补丁PREEMPT_RT和具有高分辨率的通用时钟事件层则可以为Linux内核增添硬实时的能力,PREEMPT_RT补丁也因此引起了工业界的关注。由于其简洁的设计和与内核主线的一致性,PREEMPT_RT在专业的音频、工业控制等硬实时应用中得到了广泛的关注。
最近正在进行信息物理系统(Cyber Physical System,CPS)相关的平台开发。CPS的控制对时间非常敏感,因此需要平台底层提供硬实时的支持。目前的测试平台是在树莓派上,因此需要为树莓派的Linux内核源码打上PREEMPT_RT补丁并重新编译。这个过程用了不少时间,也走了一些弯路,在完成之余也把自己的经验留给有需要的人。
编译树莓派内核所需的工具大部分已经集成在Raspbian发行版,唯一需要安装的是浮点运算工具bc
$ sudo apt-get install bc
获取树莓派Linux内核源码
$ git clone --depth=1 https://github.com/raspberrypi/linux
$ cd linux
获取树莓派内核编译配置文件.config,该文件可从/proc/config.gz中获取,或者通过make生成
方法1:
$ sudo modprobe configs
$ zcat /proc/config.gz > .config
方法2:对于树莓派1代
$ KERNEL=kernel
$ make bcmrpi_defconfig
对于树莓派2代
$ KERNEL=kernel7
$ make bcm2709_defconfig
获取并部署PREEMPT_RT补丁
$ wget https://www.kernel.org/pub/linux/kernel/projects/rt/4.1/patch-4.1.12-rt13.patch.xz
$ xzcat patch-4.1.12-rt13.patch.xz | patch -p1
通过make menuconfig配置PREEMPT_RT编译开关
$ make menuconfig
进入Kernel Features -> Preemption Model中,选择Fully Preemptible Kernel (RT)
开始编译,并将编译好的内核安装到/boot分区中
$ make -j4 zImage modules dtbs
$ sudo make modules_install
$ sudo cp arch/arm/boot/dts/*.dtb /boot/
$ sudo cp arch/arm/boot/dts/overlays/*.dtb* /boot/overlays/
$ sudo cp arch/arm/boot/dts/overlays/README /boot/overlays/
$ sudo chmod a+x scripts/mkknlimg
$ sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img
其中'make -j4'是指采用四条线程同时进行编译,充分利用树莓派CPU中的四个核心,可以大大提高编译速度。
编译并安装完成后重启,如果在 uname -a 中可以看到PREEMPT RT,则说明内核编译并安装成功。
参考文档
[1] https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO
[2] https://www.raspberrypi.org/documentation/linux/kernel/building.md
[3] https://www.raspberrypi.org/forums/viewtopic.php?f=29&t=39951
This is a unique website which will require a more modern browser to work!
Please upgrade today!
Comments (6)
前辈您好,想请问您一个问题,我也是正在做这个树莓派的实时补丁,可是按着您的步骤一步步的做下来,发现输入make menuconfig 这个指令就报错误,您知道是怎么回事吗?很恳切想得到你的回复。
具体的错误信息是什么呢
make menuconfig时候,终端需要在在/usr/src/linux
您好!按照你的文档,我成功打上了rt补丁, 但发现打上补丁后, 系统占用率一直在60%以上,请问这个问题您遇到过吗? 万分感谢!
学习了,谢谢博主
还缺少libncurses5-dev
目前树莓派内核版本4.14.98, 没有对应的RT版本,下载了patch-4.14.115-rt59.patch,应用不上暂时忽略了