RT-Preempt Patch是在Linux社区kernel的基础上,加上相关的补丁,以使得Linux满足硬实时的需求。

DEY官方不对RT进行集成,但客户可以根据项目需要使用相关的补丁. RT补丁下载地址:https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/

注意DEY1.6 ~ 4.0不同的版本对应的内核版本也不尽相同,请根据您的DEY内核版本选用RT补丁。RT补丁用法请参考RT官方文档。(DEY 3.0~3.2已验证过能顺利应用RT-Preempt补丁)

本文以DEY-4.0和ConnectCore MP133为例,来演练为Linux打上RT-Preempt实时补丁的全过程。

从Digi官方https://github.com/digi-embedded/meta-digi/tree/kirkstone/meta-digi-arm/recipes-kernel/linux可以查得对应DEY-4.0 Kirkstone平台Linux内核版本大版本号。但这不足以找到最接近的,所以还需要通过

bitbake -c menuconfig virtual/kernel

可以看到内核信息是v 5.15.118

首先要了解哪些地方是系统内核配置文件

find . -name .config -type f -print
find . -name defconfig -type f -print

可以看到有两个是内核根目录下最有可能的配置文件,查看一下相关的PREEMPT配置

cat ./tmp/work/ccmp13_dvk-dey-linux-gnueabi/linux-dey/5.15-r0/build/.config |grep PREEMPT
# CONFIG_PREEMPT_NONE is not set
# CONFIG_PREEMPT_VOLUNTARY is not set
CONFIG_PREEMPT=y
CONFIG_PREEMPT_COUNT=y
CONFIG_PREEMPTION=y
CONFIG_PREEMPT_RCU=y
CONFIG_DEBUG_PREEMPT=y
和
cat ./tmp/work/ccmp13_dvk-dey-linux-gnueabi/linux-dey/5.15-r0/defconfig |grep PREEMPT
CONFIG_PREEMPT=y

如果要用bitbake,就要改这defconfig,如果是在devshell内编译,则只需要改动.config

如果我们改动了内核配置,担心改得不对,恢复的方法是:

bitbake -c cleanall virtual/kernel
这样会清除内核目录:./tmp/work/ccmp13_dvk-dey-linux-gnueabi/linux-dey/5.15-r0/
用bitbake -c compile virtual/kernel重新生成一套默认的内核文件源码

真正的内核源码在 ./tmp/work/ccmp13_dvk-dey-linux-gnueabi/linux-dey/5.15-r0/git下,这链接文件git指向tmp/work-shared/ccmp13-dvk/kernel-source

保存原始的源码树

为了保存开发过程中的一些变动,采用git的方式对变更进行版本管理: 1. 建立linux源码库和变更的版本控制和管理 首先,初始化一个tmp下的版本库,把默认的内核文件源码 作为git 初始提交文件,然后新建一个RT分支,以便后续开始更改。整个过程如下:

. . . . .
.

—-以下内容已过时—-新内容见上

下面以ccim6sbc为例,用不同的方法具体演练几个版本的实时补丁应用方法:

从Digi官方https://github.com/digi-embedded/meta-digi/tree/jethro/meta-digi-arm/recipes-kernel/linux可以查得对应的平台Linux内核版本。在DEY 2.0下,ConnectCore 6 SBC使用3.14的内核。我们以这个平台为例实际操作一下。

首先,在本地先编译一个Linux的镜像,首次编译费时较长,请参考系统开发章节。

bitbake core-image-base

成功编译后,我们需调用开发者shell,进入虚拟机内核的源码树目录:

bitbake -c devshell virtual/kernel

在出来的shell中,就是一个git的linux内核源码树,可以查看一下

git status
会打印出来git信息
HEAD detached at 281cebe
nothing to commit, working directory clean

我们可以直接下载并应用RT补丁:

wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/3.14/patch-3.14.79-rt85.patch.xz
xzcat ./patch-3.14.79-rt85.patch.xz | patch -p1

补丁如果成功应用,出来的“patching file …“没有错误提示。

配置内核选项

我们还需要在内核配置选项中启用Fully Preemptible Kernel(CONFIG_PREEMPT_RT_FULL)来支持实时系统。一般要改这两个配置:

选中这两项
Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT)
Kernel Features -> Timer frequency -> 1000Hz
禁用这一项
Kernel hacking -> Debug preemptible kernel

另外,当测量系统延迟时,所有的Debug选项也需要关掉,一些调试选项会产生几毫秒的随机延时,不过首次启动时,也许你需要保持这些debug选项以防止一些传统的问题解决需要用到调试选项。

DEBUG_PREEMPT
Lock Debugging (spinlocks, mutexes, etc. . . )
DEBUG_OBJECTS

要配置内核选项

bitbake -c menuconfig virtual/kernel
然后改变内核选项并保存
退出后,可以用
bitbake -C compile virtual/kernel
来编译内核,注意这里用-C是大写的,它可以利用刚刚打补丁的本地源码

编译排错

编译过程会出错,可以从log中找到哪些文件需要额外排错,注意用”grep error”并不一定能查看到错误位置,有时相关错误信息要结合前后两行来研读,不过这里是需要修改的文件:

arch/arm/mach-imx/下面这三个文件
clk-pllv3.c
clk-gate2.c
clk-pfd.c

解决错误的方法可以google一下,这里直接给出,也就是需添加一个头文件,把下在的+号位置的头文件添加到上面出错的代码文件中。

+#include <linux/wait.h>
#include <linux/imx_sema4.h>

注意,您可以在devshell内改,也可以直接在work或是work-shared下面改,效果是一样的,路径最短的是根据log在owrk-shared下的源码树内更改并添加对应的头文件,然后bitbake -C compile virtual/kernel 这样,在tmp/deploy/image/ccimx6sbc下会编译出内核的uImage或zImage文件

我们可以在uboot中查看cc6sbc的fat内核分区文件: fatls mmc 0 然后用updatefile命令单独升级内核或设备树文件

一、在github上,fork引用原Digi的Linux源码 二、在本地拉下对应版本的源码
sudo install -o robin -g robin -d /usr/local/linux-dey
cd /usr/local/linux
git clone -b v3.14/dey2.0/maint https://github.com/peyoot/linux.git 
打上RT补丁
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/3.14/patch-3.14.79-rt85.patch.xz
xzcat ./patch-3.14.79-rt85.patch.xz | patch -p1

三、安装DEY 2.0 SDK

cd ~/Downloads
wget ftp://ftp1.digi.com/support/digiembeddedyocto/2.0/r5/sdk/40002891_E/ccimx6sbc/fb/dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-vfp-neon-toolchain-2.0-r5.sh
chmod +x dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-vfp-neon-toolchain-2.0-r5.sh
./dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-vfp-neon-toolchain-2.0-r5.sh
安装过程需要十几分钟或几十分钟,请耐心等待sdk安装完成,然后
cd /usr/local/linux-dey/linux
source /opt/dey/2.0-r5/environment-setup-cortexa7hf-vfp-neon-dey-linux-gnueabi
unset LDFLAGS
下面我们生成平台的内核配置文件并配置它
make ccimx6sbc_defconfig  (这里的平台名称是ccimx6sbc,事实上这个预定义配置文件在arch/arm/configs/下,其它平台类似), 这样就生成了.config文件,下面就可以配置内核了
make menuconfig
只需改动:
选中这两项
Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT)
Kernel Features -> Timer frequency -> 1000Hz
禁用这一项
Kernel hacking -> Debug preemptible kernel
然后保存成ccimx6sbc_rt_defconfig,并移动到对应的平台配置目录中
mv ccimx6sbc_rt_defconfig arch/arm/configs/
这样,只需make ccimx6sbc_rt_defconfig就能生成刚才配置好的两个rt内核选项的.config文件
因为我们刚才是另存为defconfig,所以我们就这样做一次
make ccimx6sbc_rt_defconfig

接下来就可以直接编译内核了 make -j4 编译出来的zImage文件在arch/arm/boot下,而dtb设备树文件在rch/arm/boot/dts下 但在DEY 2.0,我们用的是uImage,所以最好编译一下uImage
make LOADADDR=0x10800000 uImage

我们也可以将dey的linux git指向我们这个rt版本,以直接编译出固件。 测试没问题后,提交更改的文件,还应加上ccimx6sbc_rt_defconfig

git checkout -b v3.14/dey-2.0/rtpreempt
git add -A .
git commit -a
git push origin v3.14/dey-2.0/rtpreempt

我们修改DEY 2.0的linux源码git路径,以便用yocto的方式来编译镜像

cd /usr/local/dey-2.0/sources/meta-digi/meta-digi-arm/recipes-kernel/linux
nano linux-dey_3.14.bb
添加
<del>SRC_URI = "git://github.com/peyoot/linux.git"</del>
SRC_URI = "git://github.com/peyoot/linux.git;branch=v3.14/dey-2.0/rtpreempt file://defconfig"
修改:
SRCBRANCH = "v3.14/dey-2.0/rtpreempt"
SRCREV = "${AUTOREV}"

注意,我们用了打了rt_preempt实时补丁的内核,这个自定义的内核选项也需拷贝到dey2.0的源码下,才能编译出该内核特性,原始的meta-digi-arm/recipes-kernel/linux/linux-dey-3.14/ccimx6sbc/defconfig文件很小,但我们生成的是完整的内核选项,里面有许多不用的平台的配置,虽然大很多,但没关系。您可以直接从https://github.com/peyoot/linux/blob/v4.9/dey-2.4/maint/arch/arm/configs/ccimx6sbc_defconfig下载,并重命名为defconfig去覆盖原来在dey源码目录内的同名文件。

为了使上ssh的方式访问git,您还需要生成ssh密钥并添加到git帐户中,

ssh-keygen -t rsa -b 4096 -C "您的email"
ssh-add ~/.ssh/id_rsa

注意添加到github上的key是id_rsa.pub

git push origin v3.14/dey-2.0/rtpreempt

从Digi官方https://github.com/digi-embedded/meta-digi/tree/morty/meta-digi-arm/recipes-kernel/linux可以查得对应的平台Linux内核版本。在DEY 2.2下,ConnectCore 6 SBC使用4.1的内核。我们以这个平台为例实际操作一下。

首先,在本地先编译一个Linux的镜像,首次编译费时较长,请参考系统开发章节。

bitbake core-image-base

成功编译后,我们需调用开发者shell,进入虚拟机内核的源码树目录:

bitbake -c devshell virtual/kernel

在出来的shell中,就是一个git的linux内核源码树,可以查看一下

git status
会打印出来git信息
HEAD detached at 281cebe
nothing to commit, working directory clean

我们可以直接下载并应用RT补丁:

wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.1/patch-4.1.46-rt52.patch.xz
./patch-4.1.46-rt52.patch.xz | patch -p1

补丁如果成功应用,出来的“patching file …“没有错误提示。

配置内核选项

我们还需要在内核配置选项中启用Fully Preemptible Kernel(CONFIG_PREEMPT_RT_FULL)来支持实时系统。一般要改这两个配置:

Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT)
Kernel Features -> Timer frequency -> 1000Hz

另外,当测量系统延迟时,所有的Debug选项也需要关掉,一些调试选项会产生几毫秒的随机延时,不过首次启动时,也许你需要保持这些debug选项以防止一些传统的问题解决需要用到调试选项。

DEBUG_PREEMPT
Lock Debugging (spinlocks, mutexes, etc. . . )
DEBUG_OBJECTS

要配置内核选项

bitbake -c menuconfig virtual/kernel
然后改变内核选项并保存
退出后,可以用
bitbake -C compile virtual/kernel
来编译内核,注意这里用-C是大写的,它可以利用刚刚打补丁的本地源码

编译排错

编译过程会出错,可以从log中找到哪些文件需要额外排错,注意用”grep error”并不一定能查看到错误位置,有时相关错误信息要结合前后两行来研读,不过这里是需要修改的文件:

arch/arm/mach-imx/下面这三个文件
clk-pllv3.c
clk-gate2.c
clk-pfd.c

解决错误的方法可以google一下,这里直接给出,也就是需添加一个头文件,把下在的+号位置的头文件添加到上面出错的代码文件中。

+#include <linux/wait.h>
#include <linux/imx_sema4.h>

注意,您可以在devshell内改,也可以直接在work或是work-shared下面改,效果是一样的,路径最短的是根据log在owrk-shared下的源码树内更改并添加对应的头文件,然后bitbake -C compile virtual/kernel 这样,在tmp/deploy/image/ccimx6sbc下会编译出内核的uImage或zImage文件

我们可以在uboot中查看cc6sbc的fat内核分区文件: fatls mmc 0 然后用updatefile命令单独升级内核或设备树文件

一、在github上,fork引用原Digi的Linux源码 二、在本地拉下对应版本的源码
sudo install -o robin -g robin -d /usr/local/linux-dey
cd /usr/local/linux
git clone -b  v4.1/dey-2.2/maint https://github.com/peyoot/linux.git 
打上RT补丁
https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.1/patch-4.1.46-rt52.patch.xz
./patch-4.1.46-rt52.patch.xz | patch -p1

三、安装DEY 2.2 SDK

cd ~/Downloads
wget ftp://ftp1.digi.com/support/digiembeddedyocto/2.2/r3/sdk/ccimx6sbc/fb/dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.2-r3.sh
chmod +x dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.2-r3.sh
./dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.2-r3.sh
安装过程需要十几分钟或几十分钟,请耐心等待sdk安装完成,然后
cd /usr/local/linux-dey/linux
source /opt/dey/2.2-r3/environment-setup-cortexa7hf-vfp-neon-dey-linux-gnueabi
unset LDFLAGS
下面我们生成平台的内核配置文件并配置它
make ccimx6sbc_defconfig  (这里的平台名称是ccimx6sbc,事实上这个预定义配置文件在arch/arm/configs/下,其它平台类似), 这样就生成了.config文件,下面就可以配置内核了
make menuconfig
只需改动:
Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT)
Kernel Features -> Timer frequency -> 1000Hz  (注意,根据你平台的处理器主频来设置)
然后保存成ccimx6sbc_rt_defconfig,并移动到对应的平台配置目录中
mv ccimx6sbc_rt_defconfig arch/arm/configs/
这样,只需make ccimx6sbc_rt_defconfig就能生成刚才配置好的两个rt内核选项的.config文件
因为我们刚才是另存为defconfig,所以我们就这样做一次
make ccimx6sbc_rt_defconfig

接下来就可以直接编译内核了 make -j4

我们也可以将dey的linux git指向我们这个rt版本,以直接编译出固件。 测试没问题后,提交更改的文件,还应加上ccimx6sbc_rt_defconfig

从Digi官方https://github.com/digi-embedded/meta-digi/tree/jethro/meta-digi-arm/recipes-kernel/linux可以查得对应的平台Linux内核版本。在DEY 2.4下,ConnectCore 6 SBC使用4.9的内核。我们以这个平台为例实际操作一下。

首先,在本地先编译一个Linux的镜像,首次编译费时较长,请参考系统开发章节。

bitbake core-image-base

成功编译后,我们需调用开发者shell,进入虚拟机内核的源码树目录:

bitbake -c devshell virtual/kernel

在出来的shell中,就是一个git的linux内核源码树,可以查看一下

git status
会打印出来git信息
HEAD detached at 281cebe
nothing to commit, working directory clean

我们可以直接下载并应用RT补丁:

wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.9/patch-4.9.98-rt76.patch.xz
 ./patch-4.9.98-rt76.patch.xz | patch -p1

补丁如果成功应用,出来的“patching file …“没有错误提示。

配置内核选项

我们还需要在内核配置选项中启用Fully Preemptible Kernel(CONFIG_PREEMPT_RT_FULL)来支持实时系统。一般要改这两个配置:

Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT)
Kernel Features -> Timer frequency -> 1000Hz

另外,当测量系统延迟时,所有的Debug选项也需要关掉,一些调试选项会产生几毫秒的随机延时,不过首次启动时,也许你需要保持这些debug选项以防止一些传统的问题解决需要用到调试选项。

DEBUG_PREEMPT
Lock Debugging (spinlocks, mutexes, etc. . . )
DEBUG_OBJECTS

要配置内核选项

bitbake -c menuconfig virtual/kernel
然后改变内核选项并保存
退出后,可以用
bitbake -C compile virtual/kernel
来编译内核,注意这里用-C是大写的,它可以利用刚刚打补丁的本地源码

编译排错

编译过程会出错,可以从log中找到哪些文件需要额外排错,注意用”grep error”并不一定能查看到错误位置,有时相关错误信息要结合前后两行来研读,不过这里是需要修改的文件:

arch/arm/mach-imx/下面这三个文件
clk-pllv3.c
clk-gate2.c
clk-pfd.c

解决错误的方法可以google一下,这里直接给出,也就是需添加一个头文件,把下在的+号位置的头文件添加到上面出错的代码文件中。

+#include <linux/wait.h>
#include <linux/imx_sema4.h>

注意,您可以在devshell内改,也可以直接在work或是work-shared下面改,效果是一样的,路径最短的是根据log在owrk-shared下的源码树内更改并添加对应的头文件,然后bitbake -C compile virtual/kernel 这样,在tmp/deploy/image/ccimx6sbc下会编译出内核的uImage或zImage文件

我们可以在uboot中查看cc6sbc的fat内核分区文件: fatls mmc 0 然后用updatefile命令单独升级内核或设备树文件

一、在github上,fork引用原Digi的Linux源码 二、在本地拉下对应版本的源码
sudo install -o robin -g robin -d /usr/local/linux-dey
cd /usr/local/linux
git clone -b v4.9/dey-2.4/maint https://github.com/peyoot/linux.git 
打上RT补丁
wget https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/4.9/patch-4.9.98-rt76.patch.xz
 ./patch-4.9.98-rt76.patch.xz | patch -p1

三、安装DEY 2.4 SDK

cd ~/Downloads
wget ftp://ftp1.digi.com/support/digiembeddedyocto/2.4/r1/sdk/ccimx6sbc/fb/dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.4-r1.sh
chmod +x dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.4-r1.sh
./dey-glibc-x86_64-dey-image-qt-fb-cortexa9hf-neon-toolchain-2.4-r1.sh
安装过程需要十几分钟或几十分钟,请耐心等待sdk安装完成,然后
cd /usr/local/linux-dey/linux
source /opt/dey/2.4-r1/environment-setup-cortexa7hf-vfp-neon-dey-linux-gnueabi
unset LDFLAGS
下面我们生成平台的内核配置文件并配置它
make ccimx6sbc_defconfig  (这里的平台名称是ccimx6sbc,事实上这个预定义配置文件在arch/arm/configs/下,其它平台类似), 这样就生成了.config文件,下面就可以配置内核了
make menuconfig
只需改动:
Kernel Features -> Preemption Model -> Fully Preemptible kernel (RT)
Kernel Features -> Timer frequency -> 1000Hz  (注意,根据你平台的处理器主频来设置)
然后保存成ccimx6sbc_rt_defconfig,并移动到对应的平台配置目录中
mv ccimx6sbc_rt_defconfig arch/arm/configs/
这样,只需make ccimx6sbc_rt_defconfig就能生成刚才配置好的两个rt内核选项的.config文件
因为我们刚才是另存为defconfig,所以我们就这样做一次
make ccimx6sbc_rt_defconfig

接下来就可以直接编译内核了 make -j4 编译出来的zImage文件在arch/arm/boot下,而dtb设备树文件在rch/arm/boot/dts下

我们也可以将dey的linux git指向我们这个rt版本,以直接编译出固件。 测试没问题后,提交更改的文件,还应加上ccimx6sbc_rt_defconfig