为了让英创更多的Linux主板能够满足工业应用在实时性上的要求,我们在ESM6800H/E和ESM7000系列主板的内核(4.9.11)基础上,使用了针对该版本的RT PATCH(实时补丁),将系统升级为实时Linux系统,让主板能够满足一定的实时性需求。ESM6800H/E板载Crotex A7架构CPU(iMX6ULL),主频为792MHz,是一款性价比极高的工控主板。而ESM7000系列主板板载双核Crotex A7架构CPU(iMX7D),主频为1GHz,是性能非常强劲的工控主板系列,客户可以根据性价比以和性能来选择符合需求的工控主板进行开发,同时这两个系列的主板硬件和软件都是兼容的,方便客户根据不同应用需求无缝替换主板。
实时Linux系统主要是提升了实时线程的响应时间,所以对于应用程序来说,只需要对有实时要求的线程设置实时优先级属性,以及设置响应的实时线程调度策略就可以了,并没有特殊的API函数。英创公司网站上面有专门关于设置实时线程的相关编程介绍,可以参考《移植Real Time Linux到英创工控主板》。本文主要介绍ESM6800和ESM7000升级实时Linux系统后对于实时性提升的测试实验。
为了验证系统的实时性,我们采用了两种方法来测试,第一种方法是采用实时Linux网站推荐的测试工具cyclictest,这个工具会先创建一个普通进程,然后再根据参数创建实时线程,并定时唤醒和休眠实时线程,通过对比实时线程预期唤醒时间和实际唤醒时间来计算出系统的响应时间。第二种方法是由GPIO中断作为硬件事件,使用外部的方波信号作为中断源,驱动检测到GPIO中断后会唤醒用户层的中断处理线程(该线程已设置为实时线程),实时中断处理线程作为对中断事件的响应,将另一位GPIO的输出电平反相(Toggle处理)。用示波器测量输入的中断信号和作为响应的GPIO信号之间的时间延迟。
因为系统实时性还和负载也有一定的关系,所以我们采用了空载和满载两种情况测试,满载的测试条件是考虑模拟出对系统实时性最差的情况,即将CPU的使用率以及IO的使用率全部提升到满载。满载和空载是两种相对极端的情况,最终的实时性还是应该以实际使用的负载和运行的程序而定,关于系统负载和实时性测试的相关介绍可以通过网站realtime:documentation:howto:tools:cyclictest:test-design [Wiki]来了解。
首先是第一种方法采用cyclictest工具来进行测试,通过软件来记录全部数据,并且可以采集大量数据来参考,结果如下:
主板型号 | ESM6800 | ESM7000 | ||
CPU信息 | 单核Cortex A7 主频792MHz | 双核Cortex A7 主频1G Hz | ||
操作系统 | Linux-4.9.11 | RT Linux-4.9.11 | Linux-4.9.11 | RT Linux-4.9.11 |
空载唤醒延时最小值(us) | 17us | 15us | 8us | 8us |
空载唤醒延时最大值(us) | 1662us | 119us | 66us | 54us |
空载唤醒延时平均值(us) | 29us | 28us | 13us | 12us |
满载唤醒延时最小值(us) | 28us | 27us | 10us | 10us |
满载唤醒延时最大值(us) | 2167us | 161us | 1946us | 62us |
满载唤醒延时平均值(us) | 82us | 70us | 33us | 22us |
第二种方法,选用100Hz方波作为信号源,通过示波器随机采样的方式来选取测试数据,测试结果如下:
主板型号 | ESM6800 | ESM7000 | ||
CPU信息 | 单核Cortex A7 主频792MHz | 双核Cortex A7 主频1G Hz | ||
操作系统 | Linux-4.9.11 | RT Linux-4.9.11 | Linux-4.9.11 | RT Linux-4.9.11 |
空载中断延时最小值(us) | 25us | 65us | 20us | 25us |
空载中断延时最大值(us) | 400us | 180us | 85us | 115us |
空载中断延时平均值(us) | 38us | 80us | 70us | 80us |
满载中断延时最小值(us) | 80us | 120us | 25us | 30us |
满载中断延时最大值(us) | 1800us | 500us | 2000us | 90us |
满载中断延时平均值(us) | 145us | 165us | 60us | 60us |
最主要关注的参数应该是响应时间的最大值,这个参数可以反映系统响应时间的稳定性以及能够达到的实时性指标,因为两个表格测试的方法不同,所以两个表格之间没有比较的意义,应该在表格内部比较不同的主板和不同的系统之间的差异。
第一个表格主要是测试实时线程的响应时间,从表格中可以看到实时和非实时Linux系统在最小响应时间和平均响应时间上没有太大的差距,而在最大响应时间上实时Linux系统有明显的提升,这也验证了实时补丁主要提升的是响应时间的稳定性。
第二个表格主要是测试对于外部中断的响应,结论和表格一是相同的,即实时补丁主要提升的是响应时间的稳定性。关于ESM7000主板的测试结果需要说明一下,在空载的时候,非实时Linux系统的平均时间表现要比实时系统好一些,这是因为在多核的情况下,系统缺省把对中断的处理均放在CPU0所致。尽管可通过手动重新配置各个CPU核的初始任务,来消除这个现象,但实际应用肯定会有一定负载率的,系统将会根据负载,自动均衡各CPU的任务,达到表二的指标。对这个问题感兴趣的客户,可关注我们后续关于实时性分析的文章。
根据上面的总结,可以看到升级为实时Linux系统后,对于系统响应时间的稳定性有较大的提升,对系统实时性有一定要求的客户,可以根据上面的测试数据来选择主板。而对比ESM6800和ESM7000,拥有双核CPU的ESM7000响应时间更快,而且在实验中模拟的满载情况下对响应时间的影响较小,能够满足较高的实时性要求。