目录

1.什么是实时性操作系统?

2.怎么实现实时性系统?

3.PREEMPT_RT

4.使用方法

4.1下载linux内核源码

4.2下载RT patch

4.3 使用方法

5.测试

6.总结

7.别的方法

7.1 ubuntu 安装低延时内核

7.2 centos  安装预编译的实时内核

用到的命令行


1.什么是实时性操作系统?

https://blog.csdn.net/ywx123_/article/details/53861274

实时性是指调度的时候,任务响应时间。windows一般是15ms,最大的问题是不能保证。比如平均值是1ms,但是随着系统负载的变化,有时甚至达到100ms,在这工业上是无法使用的。工业上一些应用要求必须有更高的时间精度,比如,一个电力监测系统必须在10ms内运行一次任务对电力运行状况进行监测,一旦时间不准,调度不到该程序运行,则无法保证对电力故障的及时响应。

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.使用方法

4.1下载linux内核源码

网址:https://mirrors.edge.kernel.org/pub/linux/kernel/

国内镜像网址:http://mirror.bjtu.edu.cn/kernel/linux/kernel/  ,http://mirror.tuna.tsinghua.edu.cn/kernel/

这两个国内的可以看一下,速度比较快。

4.2下载RT patch

patch在https://rt.wiki.kernel.org/index.php/Main_Page 下载,与linux内核的版本号一定要一样。

4.3 使用方法

1.解压内核源码

2.打patch

3.编译linux内核并安装 

  1. tar xzvf  linux-4.4.138.tar.gz

  2. cd linux-4.4.138

  3. patch -p1 < ../patch-4.4.138-rt65.patch

make menuconfig需要安装这个libncurses-dev模块

编译内核需要libssl-dev模块

  1. sudo apt-get install libncurses-dev

  2. sudo apt-get install libssl-dev

 配置linux内核

make menuconfig
   

选择Processor type and feature   —>   Fully Preemptible Kernel (RT)这个选项,具体路径如下图。保存。

编译内核,再安装,更新grub.

编译时加上 INSTALL_MOD_STRIP=1 可以生成没有调试信息的模块,大大减小内核的大小。


   
  1. make -j2
  2. <span class= "hljs-comment"> #sudo make modules_install -j2</span>
  3. <span class= "hljs-comment"> #这一条命令生成的内核含有调试信息非常大,因此要使用INSTALL_MOD_STRIP选项</span>
  4. sudo make INSTALL_MOD_STRIP= 1 modules_install
  5. sudo make install -j2
  6. sudo update-grub2

重启后会多一个  linux-4.4.138-rt  的启动选项

5.测试

可参考以下网页:

https://blog.csdn.net/kl1125290220/article/details/78560220

https://blog.csdn.net/longerzone/article/details/16897655

sudo apt-get install rt-tests 

安装这个工具,运行cyclictest程序进行实时性测试:

  1. sudo cyclictest -t 5 -p 80 -n

  2. 注释: 运行五个线程,线程优先级为80,无限循环

cyclictest运行结果详解

  1. T: 0 序号为0的线程

  2. P: 0 线程优先级为0

  3. C: 9397 计数器。线程的时间间隔每达到一次,计数器加1

  4. I: 1000 时间间隔为1000微秒(us)

  5. Min: 最小延时(us)

  6. Act: 最近一次的延时(us)

  7. Avg:平均延时(us)

  8. Max: 最大延时(us)

测试结果示例:

1.实体机测试结果

  1. # /dev/cpu_dma_latency set to 0us

  2. policy: fifo: loadavg: 0.13 0.06 0.02 1/244 19255

  3.  
  4. T: 0 (18989) P:80 I:1000 C: 155947 Min: 1 Act: 1 Avg: 1 Max: 17

  5. T: 1 (18990) P:80 I:1500 C: 103964 Min: 1 Act: 1 Avg: 1 Max: 15

  6. T: 2 (18991) P:80 I:2000 C: 77973 Min: 1 Act: 1 Avg: 1 Max: 7

  7. T: 3 (18992) P:80 I:2500 C: 62378 Min: 1 Act: 1 Avg: 1 Max: 10

  8. T: 4 (18993) P:80 I:3000 C: 51982 Min: 1 Act: 1 Avg: 1 Max: 7

2.虚拟机测试结果 

在虚拟机中效果一般,受主机的限制太大。


   
  1. my@ubuntu :~/rt/linux- 4.4. 138$ sudo cyclictest -p 80 -t5 -n
  2. # /dev/cpu_dma_latency set to 0us
  3. policy: fifo: loadavg: 0. 69 0. 19 0. 07 1/ 726 5825
  4. T: 0 ( 5821) P: 80 I: 1000 C: 8168 Min: 7 Act: 445 Avg: 327 Max: 7005
  5. T: 1 ( 5822) P: 80 I: 1500 C: 5455 Min: 7 Act: 411 Avg: 319 Max: 7516
  6. T: 2 ( 5823) P: 80 I: 2000 C: 4098 Min: 14 Act: 174 Avg: 320 Max: 2362
  7. T: 3 ( 5824) P: 80 I: 2500 C: 3275 Min: 5 Act: 52 Avg: 319 Max: 6940
  8. 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以内。

  1. # /dev/cpu_dma_latency set to 0us

  2. policy: fifo: loadavg: 0.36 0.33 0.28 1/246 32690

  3.  
  4. T: 0 (32688) P:99 I:2 C:10000000 Min: 0 Act: 2 Avg: 1 Max: 15

  5. # Histogram

  6. 000000 000051

  7. 000001 6635143

  8. 000002 3352561

  9. 000003 008966

  10. 000004 002414

  11. 000005 000648

  12. 000006 000180

  13. 000007 000025

  14. 000008 000002

  15. 000009 000001

  16. 000010 000000

  17. 000011 000000

  18. 000012 000001

  19. 000013 000001

  20. 000014 000006

  21. 000015 000001

  22. …………(中间都是0,省略)

  23. 000097 000000

  24. 000098 000000

  25. 000099 000000

  26. # Total: 010000000

  27. # Min Latencies: 00000

  28. # Avg Latencies: 00001

  29. # Max Latencies: 00009

  30. # Histogram Overflows: 00000

  31. # Histogram Overflow at cycle number:

  32. # Thread 0:

6.总结

实时性补丁能够较好地满足我们的需求(1ms),实现较强的实时性。

 

7.别的方法

ubuntu 和centos 都提供了预编译的prempt 内核, 只是ubuntu的是lowlatency 低延时内核,centos的是rt kernel最高级实时

7.1 ubuntu 安装低延时内核

参考https://linuxmusicians.com/viewtopic.php?t=18536

apt-get install linux-lowlatency
   

7.2 centos  安装预编译的实时内核

参考https://unix.stackexchange.com/questions/341933/install-a-real-time-kernel-on-centos

  1. sudo tee /etc/yum.repos.d/CentOS-rt.repo >/dev/null <<EOF

  2. # CentOS-rt.repo

  3.  
  4. [rt]

  5. name=CentOS-7 - rt

  6. baseurl=http://mirror.centos.org/centos/\$releasever/rt/\$basearch/

  7. gpgcheck=1

  8. gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7

  9. EOF

  10.  
  11.  
  12. sudo yum update -y

  13. sudo yum install -y kernel-rt rt-tests tuned-profiles-realtime

  14. sudo reboot


用到的命令行

mkdir -p /usr/src/kernels
cd /usr/src/kernels
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.9.47.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/4.9/older/patch-4.9.47-rt37.patch.xz
tar xf linux-4.9.47.tar.xz
mv linux-4.9.47 linux-4.9.47-rt37
cd linux-4.9.47-rt37
xz -d ../patch-4.9.47-rt37.patch.xz
patch -p1 <../patch-4.9.47-rt37.patch

cp /boot/config-4.9.0-4-amd64 .config

In the last step, before the kernel can be compiled, the new kernel has to be configured so that the functionality imported with the RT patch is also used. The command make menuconfig is called and we select Processor type and features -> Preemption Model -> Fully Preemptible Kernel (RT).

  1. make -j4

  2. make modules_install

  3. make install

 

参考

https://blog.csdn.net/v6543210/article/details/80941906

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐