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

Tagged with: , , , , , , ,
Comments (6)

Add Your Comment

* required

This is a unique website which will require a more modern browser to work!

Please upgrade today!