Ubuntu下实时Linux内核的编译安装(PREEMPT_RT)以及测试
Ubuntu下实时Linux内核的编译安装(PREEMPT_RT)以及测试
1.了解什么是实时系统?
实时性是指调度的时候,任务响应时间。windows一般是15ms,最大的问题是不能保证。比如平均值是1ms,但是随着系统负载的变化,有时甚至达到100ms,在这工业上是无法使用的。工业上一些应用要求必须有更高的时间精度,比如,一个电力监测系统必须在10ms内运行一次任务对电力运行状况进行监测,一旦时间不准,调度不到该程序运行,则无法保证对电力故障的及时响应。
https://blog.csdn.net/ywx123_/article/details/53861274
2.怎样实现实时性系统?
参考连接:https://blog.csdn.net/lu_embedded/article/details/52485527
3.PREEMPT_RT是什么?
PREEMPT_RT是Linux内核的一个实时补丁。得到Linus的高度评价:
Controlling a laser with Linux is crazy, but everyone in this room is crazy in his own way. So if you want to use Linux to control an industrial welding laser, I have no problem with your using PREEMPT_RT." -- Linus Torvalds
项目主页见:https://rt.wiki.kernel.org/index.php/Main_Page
具体怎么用可以参考:https://wiki.linuxfoundation.org/realtime/documentation/howto/applications/preemptrt_setup ,这是官方的说明。
4.Ubuntu下编译安装PREEMPT_RT补丁
运行环境:使用的VMware虚拟机,上面安装的Ubuntu16.04 64位系统。
下载Linux内核和实时补丁文件
rt补丁下载 https://www.kernel.org/pub/linux/kernel/projects/rt/
内核源码下载 https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/
下载的内核和补丁版本号必须严格对应。
使用方法
1.将下载的文件放到指定文件夹
cd ~
mkdir kernel
cd kernel
2.解压内核源码
tar -zxvf linux-4.4.tar.gz
3.解压补丁
gunzip patch-4.4-rc6-rt1.patch.gz
4.打补丁
cd linux-4.4
patch -p1 < ../patch-4.4-rc6-rt1.patch
5.安装编译内核需要的模块
sudo apt-get install libncurses-dev
sudo apt-get install libssl-dev
6.配置linux内核
make menuconfig
第6步make menuconfig 可能会出现一些问题,按提示安装相应的软件即可。
选择Fully Preemptible Kernel (RT)这个选项,具体路径如下图。保存。
保存退出即可。
编译Linux内核并安装
make
sudo make modules_install
sudo make install
sudo update-grub
make 执行时间较长,本人亲测大约两个小时,可以 make -j2 ;make -j4 ;make -j8;采用多线程运行。
启动实时内核
启动Ubuntu时,想进入grub选择界面,当进入VMware启动界面时,长按shift键
之后就会出现grub界面:
5.测试效果
使用cyclictest实时测试工具。具体参考点击以下链接:
https://blog.csdn.net/kl1125290220/article/details/78560220
https://blog.csdn.net/longerzone/article/details/16897655
安装测试工具:
sudo apt-get install rt-tests
使用cyclictest测试实时性:
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)
测试结果示例:
1.实体机测试结果
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.13 0.06 0.02 1/244 19255
T: 0 (18989) P:80 I:1000 C: 155947 Min: 1 Act: 1 Avg: 1 Max: 17
T: 1 (18990) P:80 I:1500 C: 103964 Min: 1 Act: 1 Avg: 1 Max: 15
T: 2 (18991) P:80 I:2000 C: 77973 Min: 1 Act: 1 Avg: 1 Max: 7
T: 3 (18992) P:80 I:2500 C: 62378 Min: 1 Act: 1 Avg: 1 Max: 10
T: 4 (18993) P:80 I:3000 C: 51982 Min: 1 Act: 1 Avg: 1 Max: 7
2.虚拟机测试结果
在虚拟机中效果一般,受主机的限制太大。
aaa@qq.com:~/rt/linux-4.4.138$ sudo cyclictest -p 80 -t5 -n
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.69 0.19 0.07 1/726 5825
T: 0 ( 5821) P:80 I:1000 C: 8168 Min: 7 Act: 445 Avg: 327 Max: 7005
T: 1 ( 5822) P:80 I:1500 C: 5455 Min: 7 Act: 411 Avg: 319 Max: 7516
T: 2 ( 5823) P:80 I:2000 C: 4098 Min: 14 Act: 174 Avg: 320 Max: 2362
T: 3 ( 5824) P:80 I:2500 C: 3275 Min: 5 Act: 52 Avg: 319 Max: 6940
T: 4 ( 5825) P:80 I:3000 C: 2732 Min: 8 Act: 214 Avg: 299 Max: 5198
3.也可以进行多次运行并统计结果
sudo cyclictest -l10000000 -m -n -t1 -p99 -i2 -h100
-l10000000 指定1千万循环,
-m锁定当前和将来的内存分配,
-n指定使用 clock_nanosleep,
-t1指定开一个线程进行测试,
-p99指定最高优先级,
-i2指定基本线程间隔,单位是us,此处是2us,
-h100指定统计结果的分布情况。
程序20秒执行结束,输出显示平均延时1 us,最大延时15 us,通过直方分布图察看,大多集中在1-7 us以内。
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.36 0.33 0.28 1/246 32690
T: 0 (32688) P:99 I:2 C:10000000 Min: 0 Act: 2 Avg: 1 Max: 15
# Histogram
000000 000051
000001 6635143
000002 3352561
000003 008966
000004 002414
000005 000648
000006 000180
000007 000025
000008 000002
000009 000001
000010 000000
000011 000000
000012 000001
000013 000001
000014 000006
000015 000001
…………(中间都是0,省略)
000097 000000
000098 000000
000099 000000
# Total: 010000000
# Min Latencies: 00000
# Avg Latencies: 00001
# Max Latencies: 00009
# Histogram Overflows: 00000
# Histogram Overflow at cycle number:
# Thread 0:
参考连接:
https://blog.csdn.net/lsky380/article/details/90769058
https://blog.csdn.net/v6543210/article/details/80941906
下一篇: 3dsMax怎么设计一款皮质的双人沙发?