首页 > 编程知识 正文

实时系统设计,嵌入式实时系统

时间:2023-05-05 03:09:24 阅读:107540 作者:3003

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

实时性是指调度时的任务响应时间。 windows一般为15ms,最大的问题是不能保证。 例如,平均值为1ms,但根据系统的负荷不同,有时会达到100ms,无法在该工业上使用。 工业上的一些应用需要更高的时间精度,比如一个电力监测系统必须在10ms内执行一次任务监测电力运行情况,时间错位,不能调度该程序的运行,才能保证对电力故障的及时响应

2 .如何实现实时系统?

3.PREEMPT_RT

PREEMPT_RT是Linux内核的实时修补程序。 获得了Linus的高度评价:

controllingalaserwithlinuxiscrazyinhisownway.soifyouwanttouselinuxtocontrolanindustrialweldingway

具体使用方法请参阅https://wiki.Linux foundation.org/real time/documentation/how to/applications/preempt rt _ setup。 这是官方的说明。

4 .使用方法

4.1Linux内核源代码下载

这两个国内的人请看一下。 速度很快。

4.2rtpatch下载

patch可在https://rt.wiki.kernel.org/index.PHP/main _ page下载。 它必须与linux内核的版本号相同。

4.3使用方法

1 .解压缩内核源代码

贴补丁

编译并安装linux内核

tar xzvf linux-4.4.138.tar.gz

cd linux-4.4.138

patch-P1 ./patch-4.4.138-rt65.patch

make menuconfig必须安装此libncurses-dev模块

编译内核需要libssl-dev模块

sudo apt-getinstallibncurses-dev

sudo apt-get install libssl-dev

配置linux内核

生成菜单

选择processortypeandfeature—fullypreemptiblekernel (rt )选项,如下图所示。 保存。

编译内核,重新安装并更新grub。

如果在编译时添加INSTALL_MOD_STRIP=1,则会生成没有调试信息的模块,从而大大减小内核的大小。

生成- J2

#sudo make modules_install -j2

#由于此命令生成的内核包含调试信息,因此请使用INSTALL_MOD_STRIP选项

sudomakeinstall _ mod _ strip=1modules _ install

sudo make install -j2

sudo update-grub2

重新启动后,linux-4.4.138-rt的启动选项增加1。

5 .测试

请参阅以下页面:

sudo apt-get install rt-tests

安装此工具并运行cyclictest程序进行实时性测试。

sudo cyclictest -t 5 -p 80 -n

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

cyclictest运行结果详细信息:

T: 0序列号为0的线程

P: 0线程的优先级为0

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

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

Min:最小延迟(us ) ) ) )。

Act:的最近延迟(us ) )。

Avg :平均等待时间(us ) ) ) ) ) ) ) ) ) ) ) ) ) ) ) )。

最大延迟(us ) )。

测试结果示例:

1 .实机测试结果

# /dev/cpu_dma_latency set to 0us

policy : FIFO : load avg :130.060.021/24419255

t:(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 :0

     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.虚拟机测试结果

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

my@ubuntu:~/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:

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

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

# CentOS-rt.repo

[rt]

name=CentOS-7 - rt

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

gpgcheck=1

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

EOF

sudo yum update -y

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

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 <..>

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).

make -j4

make modules_install

make install

————————————————

版权声明:本文为CSDN博主「笨笨的灰狼哥哥」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/v6543210/java/article/details/80941906

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。