鉴于网上研究树莓派实时系统的文章很少,在此记录一篇关于树莓派实时内核编译的过程。
树莓派内核的编译主要分为两种:本地编译和交叉编译。本地编译速度较慢,但是方便;交叉编译速度快,但是操作麻烦。本篇介绍本地编译的过程。
一、编译环境
(1)树莓派3B
(2)操作系统:https://www.raspberrypi.org/downloads/raspbian/ (2019-07-10-raspbian-buster)
二、安装编译工具
sudo apt-get install bc
sudo apt-get install libncurses-dev libssl-dev
sudo apt-get install build-essential kmod cpio flex cpio bison
这里把可能需要安装的工具都列出来,具体的操作要根据你的实际情况而定,缺啥补啥。
三、搭建工作环境
(1)创建kernel工作目录
mkdir ~/kernel && cd ~/kernel
(2)下载源码
下载地址:https://github.com/raspberrypi/linux 此处注意下载的版本,目前github上关于rt-kernel的源码有两个版本rpi-4.14.y-rt和rpi-4.19.y-rt。这里我们选择rpi-4.14.y-rt,能够很好的兼容树莓派3B的硬件。尝试了rpi-4.19.y-rt,导致树莓派开不了机。可能这个版本是在新出的树莓派4上使用的,这里有待验证。
(3)将压缩包移动到kernel目录下并解压
unzip linux-rpi-4.14.y-rt
cd linux-rpi-4.14.y-rt
(4)编译前配置内核文件
KERNEL=kernel7
make bcm2709_defconfig
make menuconfig
选择Kernel Features
找到Preemption Model(Fully Preemptible Kernel (RT))
选择Fully Preemptible Kernel (RT)
最后保存修改并退出
四、开始编译
(1)编译,需要花两三个小时的时间
make -j4 zImage modules dtbs
(2)编译完成后,安装模块
sudo make modules_install
(3)将编译好的文件复制到/boot文件夹中
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/
(4)替换内核
sudo chmod a+x scripts/mkknlimg
sudo scripts/mkknlimg arch/arm/boot/zImage /boot/$KERNEL.img
或者将$KERNEL.img修改成自己定义的.img文件,例:kernel-my.img
然后在/boot/config.txt的最后一行添加kernel=kernel-my.img,可以通过这个方法切换内核。
(5)重启
sudo reboot
五、检验和测试
(1)重启后查看内核是否替换成功
uname -a
sudo apt-get install rt-tests
sudo cyclictest -t 5 -p 80 -n
注释: 运行五个线程,线程优先级为80,无限循环
cyclictest运行结果详解
T: 0 序号为0的线程
P: 0 线程优先级为0
C: 9397 计数器。线程的时间间隔每达到一次,计数器加1
I: 1000 时间间隔为1000微秒(us)
Min: 最小延时(us)
Act: 最近一次的延时(us)
Avg:平均延时(us)
Max: 最大延时(us)