RT-Preempt Patch是在Linux社区kernel的基础上,加上相关的补丁,以使得Linux满足硬实时的需求。
一、向内核打RT-Linux补丁
1、下载内核补丁包
下载与自己内核相应的补丁包,以下是下载网址:
https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/
这里有各种内核版本的补丁包。
我用的内核版本是4.6.0的,因此找到4.6的目录下找对应的版本
哎?这里还没有,older里面看看,果然这才是4.6最全的。选择一个下载。
2、打补丁
将补丁包解压到源码目录下
打开终端,输入以下命令打入补丁:
xzcat ../patch-4.6-rt19.patch.xz | patch -p1
或者
patch -p(n) < [补丁包路径]patch_name
n=0时,从当前目录查找文件(夹)(直接使用补丁文件里指定的路径)
n=1时,忽略掉第一层目录,从当前目录查找(去掉补丁文件指定路径最左的第一个斜杠及前面的所有内容)
校验
编译内核后,上电启动系统,uname -a命令查看 有 RT 字样内核替换成功
打出补丁
patch -p1 -R < ../patch_name
二、编译RT-test进行Linux实时性测试(cortex9,arm7)
1、下载
git clone git:// git.kernel.org / pub / scm / utils / rt-tests / rt-tests.git
cd rt-tests
git checkout stable / v1.0
2、安装库
直接make会报错
报错: src/cyclictest/rt_numa.h:29:18: fatal error: numa.h: 没有那个文件或目录
解决:
1)安装apt-file 来找到依赖库
apt-get install apt-file
apt-file update #更新源
2)寻找 numa.h
apt-file install numa.h
3) 安装相应的库
apt-get install libnuma-dev
3、编译arm平台的cyclictest
直接make的话编译出的二进制文件是x86_64的,在zynq7平台将无法执行。在网上也看别人博客说修改makefile文件中的编译器选项,我修改之后编译的仍然是x86_64的。无奈之下,只得将cyclictest源文件拿出来单独编译。
4、在yocto下用poky_sdk,autotool编译
4.1 新建文件夹cyclictest
4.2 在上面下载的rt-tests中找到以下文件,复制到cyclictest文件夹下。
4.3 创建空的README文件,这是GNU编码标准所要求的:
touch README
4.4 使用autoscan生成一个configure.scan辅助编写configure.ac
4.5 创建configure.ac文件
AC_INIT(cyclictest, 2.69)
AM_INIT_AUTOMAKE
AC_CONFIG_HEADERS(config.h)
AM_PROG_CC_C_O
AC_PROG_INSTALL
AC_OUTPUT([Makefile])
2.69 就是从4.4步骤得来的。
4.6 创建Makefile.am文件
bin_PROGRAMS = cyclictest
cyclictest_SOURCES = cyclictest.c error.c rt-utils.c rt-sched.c
4.7 修改cyclictest.c,rt-utils.c文件
在头文件声明前增加
#define _GNU_SOURCE #define __USE_GNU
因为要使用GNU的编译器,但是在编译的时候却发现一直报错,找不到features.h里面的定义,因此需手动在头文件声明之前加上以上内容。
5、获取跨工具链环境设置文件
source /home/jf-yt/poky_sdk/environment-setup-cortexa9hf-neon-poky-linux-gnueabi
6、创建configure脚本: 使用该
autoreconf
命令生成
configure
脚本。
autoreconf
该
autoreconf
工具将正在运行的其他自动工具,如护理
aclocal
,
autoconf
和
automake
。
注意:
如果出现错误的
configure.ac
,它
autoreconf
运行时,指示丢失的文件,使用“-i”选项,从而确保丢失的辅助文件复制到构建主机。
7、交叉编译项目:此命令使用交叉编译器编译项目。该
CONFIGURE_FLAGS
环境变量为GNU配置的最小参数:
$ ./configure $ {CONFIGURE_FLAGS}
8、修改Makefile文件
在CC = ....加入 -lpthread -lrt,分别链接线程库和rt库。
9、编译
make
10、验证二进制文件,运行该命令将打印可以运行二进制文件的体系结构。此体系结构应与已安装的跨工具链支持的体系结构相同。
$ file ./cyclictest
输出如下
./cyclictest: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-armhf.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=c5d2416a3e22086474128ba1377e142b542a5353, not stripped
果然是ARM架构的,基本可以用了。