【JokerのLinux】RT-Linux 4.14。

软件环境:vivado 2017.4        硬件平台:XC7Z020        系统及补丁版本:Debian 9 - patch 4.14


首先一定一定一定要明确,通常所说的Linux系统,是非实时的操作系统。那么,与此相对,什么是实时操作系统,什么又是非实时操作系统,两者之间的差别是啥。在我看来,最主要的差别感觉应该算是内核中进程调度的抢占与非抢占式。好嘛,那啥子又是抢占,啥子又是非抢占,且听我细细哔哔。举个栗子,如果对于一个系统,IO设备在任意时刻发生中断,CPU都会停止当下正在执行的进程,保护现场,然后转入中断处理函数,如果在执行当前中断处理程序中,又有高优先级中断进来,依旧能够停止当下进程,保护现场,转入中断处理函数,那么当前系统就可被看作是可抢占式的实时操作系统,因为中断的处理和进程的切换,都能够在确定的时间内完成。那非实时呢?首先想到的词应该是时间片轮转调度,排队,来中断了?搁队列后面等着,到你的时间片了再处理你,什么?等五年了?等五年了也得等着。

再哔哔下RTLinux到底是个啥,跟Linux差别在哪,我这里说的都很简单,想深挖的朋友可以CSDN搜一搜,货很多。

通常的Linux是没有上图中的实时内核和RT进程这两个框的,RTLinux中,通过多的这一层实时内核,全面接管外部硬件中断,并把原本的Linux内核,作为实时内核的一个低优先级的进程,当有实时任务需要处理时,通过实时内核调度RT进程完成,无实时任务时,运行优先级较低的Linux非实时进程。


接下来说下具体怎么搞,首先需要确定自己内核的版本,进入kernel以后make menuconfig最顶上就能看见当前内核版本,依次进入processor type and features -> preemption model可以看到,当前没有RT配置选项。如果你用不了make menuconfig命令,调出控制台,sudo apt-get install libncurses-dev。

在下方网址下载对应自己内核版本的补丁,如果找不到,就在older路径下面找。

https://mirrors.edge.kernel.org/pub/linux/kernel/projects/rt/

补丁下载好后,放在跟自己内核一个路径的文件夹下。

 然后调出控制台,依次进行如下操作。

不对,你先别急,先别急着操作,我在这里要着重用红字哔哔几句,这里有个大坑,在给内核打补丁之前一定切记切记切记,把内核的配置文件.config先单独保存出来,最好连内核也备份一份出来,以便打补丁遇到疑难杂症的时候好恢复回去,.config单独备份出来是有重要原因的,因为补丁打完了以后.config会被改的面目全非,直接编译内核各种报错加启动不起来,最好的做法是.config单独保存,然后再给内核打补丁,补丁打完了以后,把单独保存的.config再覆盖回去,这样就是打过补丁的原配置了,最起码能保证编译正确,然后再在新内核修改RTLinux的配置项。

好叻,继续看打补丁进行的操作。

cd kernel
gzip -cd ../patch-4.14-rt1.patch.gz | patch -p1 --verbose

其中p后面的参数通常有p0和p1,p0意思是不忽略目录,从当前目录开始打补丁,p1是忽略第一层目录,因为我们要进入内核目录打补丁,所以使用p1参数。补丁打完以后如下图所示。

此时,在kernel里make menuconfig, 进入processor type and features -> preemption model可以看到,有关RTLinux的配置项就出来啦,说明补丁包打的目前基本没什么问题。

kernel配置修改完毕以后,做系统这些就不多说了吧,各人有各人的做法, 先看下没打补丁之前,系统启动以后用uname -a看当前操作系统内核信息如下。

打了补丁以后,系统启动uname -a再看看系统内核信息,可以看到内核有RT标识了。 

但是这也仅仅只是标识上面多了个RT而已吗?究竟性能上有没有实际差异呢?继续往下看。


 这里就要说下测试工具了,cyclictest,两种方式得到,一种是控制台里用git命令

git clone git://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git

cd rt-tests
 
git checkout stable/v1.0

另一种是直接去网页里面下,网页下面还有很多其他版本的,这里我用的是v1.0版的。

 https://git.kernel.org/pub/scm/utils/rt-tests/rt-tests.git/

下载解压以后,进入rt-test-1.0,如果你跟我一样要测zynq平台的话,别直接make直接make的用不了,要改一下makefile文件。

把默认的CC和AR修改成你给zynq用的编译工具的CC和AR,也就是arm-linux-gnueabihf-路径。 修改后如下图。

接下来再make,搞定以后,把生成的cyclictest拖到zynq上。

输入测试命令./cyclictest -p 80 -t5 -n,设置线程优先级为80,开启5个线程,循环输出。

对测试结果做如下说明,第一个红框,内核非RT的增强版本。第二个红款,先说下T、P、C等字母含义。

T: 线程号      P: 线程优先级   

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

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

Min: 最小延时(us)     Act: 最近一次的延时(us)   

 Avg:平均延时(us)     Max: 最大延时(us)

所以可以看出,非RT下,0线程测试6万8千次时,出现了6万次时最大值延迟6798 us,接下来看看RT核跑的情况。
 

 RT核下,同样是0线程,跑68万次,这个结果已经很可以说明问题了吧。


2020-02-24更新    几个重要情况说明

一、cyclictest测试说明

这里首先需要说明一下,上面的测试结果是有问题的,先看之前更新的,也就是下面这张图。

这张图里,刷新时候0线程错行了是一方面,另一方面是,所有线程最大切换时间都是6 ms的时候,没可能就0线程不受影响的跑49 us,当时也怀疑过这个问题,但没引起注意,最近不是待家里太长时间么,好好又翻出来琢磨了下,发现问题了。

看红框处,在跑cyclictest时候多刷了个这出来,然后紧跟着就是错行输出,且最大时间发生变化,所以由此可以认为是在测试的过程中,发生了一致性随机数生成器(congruential random number generator) 初始化,从而导致的线程切换失常,在这次测试完成之后,重新再测一次。

这次的结果就比较正常了,重启系统以后,只要不出现crng初始化的问题,测试结果基本都是这样。

二、系统配置说明

 kernel在没打补丁之前,preemption model里有这三个选项。

No Forced Preemption(Server) :非强迫式抢占这是传统的Linux抢占式模型,针对于高吞吐量设计。它同样在很多时候会提供很好的响应,但是也可能会有较长的延迟。如果是要建立服务器或者用于科学运算,或者要最大化内核的运算能力而不理会调度上的延迟,则选这项。

Voluntary Kernel Preemption(Desktop):自动式内核抢占。这个选项通过向内核添加更多的“清晰抢占点”来减少内核延迟。这些新的抢占点以降低吞吐量为代价,来降低内核的最大延迟,提供更快的应用程序响应。这通过允许低优先级的进程自动抢占来响应事件,即使进程在内核中进行系统调用。这使得应用程序运行得更“流畅”,即使系统已经是高负荷运转。

Preemptible Kernel(Low-Latency Desktop):可抢占式内核。这个选项通过使所有内核代码(非致命部分)编译为“可抢占”来降低内核延迟。通过允许低优先级进程进行强制抢占来响应事件,即使这些进程正在进行系统调用或者未达到正常的“抢占点”。这使得应用程序运行得更加“流畅”,即使系统已经是高负荷运转。代价是吞吐量降低,内核运行开销增大。

第二项我没编译过,编译完了烧板子启动,卡在kernel了,也就没多管,说下第一个和第三个,差别在于抢占核的策略,接下来的话你会看到红色的字颜色---如果你系统的后台空转,没有任何CPU、内存、IO的负荷,那么No Forced Preemption、Preemptible Kernel和Fully Preemptible Kernel之间基本没有任何差别,或者说,单用cyclictest在zynq7020板上测,我是没测出来有什么太大差别;如果你系统后台带我上面说的负荷了,那么,No Forced Preemption和后两种是有差的,而且差距不小,后两种Preemptible Kernel和Fully Preemptible Kernel之间,是没差的,对,用cyclictest在zynq7020板上测,基本没差。

所以,就鄙人愚见,没必要,您这样真是没必要,Preemptible Kernel基本就能满足性能要求了,就别费那个劲打补丁了,或者您有别的测试方法,能说明两种抢占核的差距,希望与您讨论。最后,贴下No Forced Preemption后台满负荷时候跑下来的情况。哦对了,再重复哔哔一句,负荷加多少,加什么类型,对测试来说真的很重要,加的不一样,测试结果真的可能完全不一样。

三、RT核以及应用编译

 rt核配置描述里是这么说的。

其中depends on里,有一样IRQ_FORCED_THREADING,中断线程化,这个我找半天没找到在哪配置,后来直接去.config里面,发现默认是没使能的,直接从.config里加进去了,这里需要注意一下。 

另外,编写rt系统下的应用,需要注意下面几点。

 优先级设定不用多说,mlockall为了防止进程的虚拟地址空间对应的物理页面被swap出去,cyclictest里也是这么用的。

最后,在编译应用的时候,别忘了加  -lrt。 

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值