Not long ago, a project that involved a low latency app running on a Beaglebone Black (BBB)1 came up at work. The minimal latency requirement drove the decision to run the BBB with a PREEMPT_RT2 patched kernel. Luckily, Robert C. Nelson, one of the Beaglebone Black maintainers, maintains a set of scripts for building a kernel specifically for the BBB3. Among the many kernel versions offered are variants that have had the PREEMPT_RT patches already applied! The goal is simple: flash the BBB with the latest console image rootfs and Linux kernel (RT patches included).

Prepping the SD Card

First things first, flash the latest BBB Debian image4 onto an SD card. The latest Debian Console Image is the best choice unless there is a solid reason to use the much larger IoT image:

wget https://debian.beagleboard.org/images/bone-debian-10.3-console-armhf-2020-04-06-1gb.img.xz

Unarchive the *.img file:

xz -d *.xz

Finally, write the *.img to the SD card. Before running the command below, triple check that you have the right device name for the SD card! Run lsblk to discover the SD card devname or check the dmesg logs.

sudo dd if=*.img of=/dev/sdb

Building the Kernel Installer Files

As mentioned previously, Robert’s ti-linux-kernel-dev project lets one build a kernel with the RT patches applied. The output of a build is a collection of *.deb files that you transfer to the BBB. You install the packages on the BBB using dpkg.

Robert’s scripts require that the host system have a number of libraries and utilities installed in order for the kernel build to succeed. To ease the process, I created the bbb_kernel_builder5 project that launches a docker container which runs the build scripts on your behalf. The docker container will prompt you to configure the kernel, but, beyond that, the process is hands off. A successful container run copies *.deb kernel packages to the host PC (see the README for details).

A future post will discuss the details of configuring a kernel for real-time. For now, watch John Ogness’s “A Checklist for Writing Real-Time Linux Applications” and skip to the section on kernel configuration:

Installing the Kernel On the BBB

Now, all that remains is installing the kernel on the BBB.

First, mount the rootfs previously created onto the host filesystem. Following the previous example, the rootfs on the SD card has the label /dev/sdb1. Your SD card may have a different name, use lsblk to find the right device.

sudo mount /dev/sdb1 /mnt/sd

Copy the *.deb files to some known location on the rootfs. For example, the root user’s home directory: /root. If you used the bbb_kernel_builder project to build your kernel, the debs will be under bbb_kernel_builder/bin.

sudo cp bbb_kernel_builder/bin/*.deb /mnt/sd/root

Unmount the SD card.

sudo umount /mnt/sd

Boot the BBB off the SD card and login as root. Install the kernel.

dpkg -i /root/*.deb

Reboot the BBB off the SD card. Verify your kernel is live by running uname -a. You should see output similar to that shown below. Note the PREEMPT_RT bit indicates that you have a fully preemptible kernel!

Linux beaglebone 5.10.162-ti-rt-r59 #1xross SMP PREEMPT_RT ...

Conclusion

Depending on the requirements of the application you are developing, you may find a real-time kernel is necessary. Linux provides soft real-time capabilities in the form of the PREEMPT_RT kernel patches. Building and deploying a kernel for the BBB from scratch is a nontrivial task. Luckily, BBB maintainers have made it easier by providing PREEMPT_RT patched kernel sources and scripts for building custom kernel install files. Do keep in mind that there’s more to setting up an RT Linux application than just installing a patched kernel. A follow-on article will dive into the details of how to configure the system and application for ideal RT performance.


  1. The Beaglebone Black is a low-cost, community-supported development platform for developers and hobbyists. ↩︎

  2. “Intro to Real-Time Linux for Embedded Developers” gives a nice overview of what the PREEMPT_RT patches bring to the table. ↩︎

  3. Checkout Robert Nelson’s ti-linux-kernel-dev project on GitHub. ↩︎

  4. Go to the BeagleBoard site to download the latest Debian image. ↩︎

  5. Checkout the bbb_kernel_builder project on GitHub. This project may save you time when using the ti-linux-kernel-dev projects’ scripts since you won’t have to hunt for missing build dependencies. ↩︎