在工业控制领域,很多时候对系统实时性的要求较高,下面就通过英创公司的EM9160(内核为Linux-2.6)和EM9280(内核为Linux-3.9)工控主板,对Linux的不同版本2.6和3.9进行实时性的探究,对它们分别测试,得出测试结果,通过实验数据说明Linux-2.6和Linux-3.9在实时性方面的差别。
实时性的一个重要参数就是任务的响应延迟时间,它包含了其它几个重要的实时性参数(中断潜伏期时间,调度潜伏期时间等),任务响应延迟时间越短,说明任务对外部事件的响应速度越快,实时性也就越好。
本次测试就是针对任务的响应延迟时间进行的,使用串口接收整包数据然后解包得到数据,再对数据打包回发。测量出串口接收端RX接收数据完毕到发出端TX开始发送数据的时间间隔,并对EM9160和EM9280的测试结果进行比较。
测试中,使用一块工控主板通过串口向测试使用的EM9160和EM9280每秒发送一个9字节的整包数据。
测试中通讯数据包定义如下:
0x55 | 0xaa | DestAddr | SourceAddr | DatLen | Dat0 | … | Datn | checksum |
测试得出的时间间隔包括两段,串口RX端接受数据完毕至系统响应数据的延迟时间和处理数据的时间。这里的处理数据非常简单,读取数据解包,再打包回发,所用时间仅为10us不到。所以,测量出的时间间隔主要是系统响应串口接收数据的延迟时间。
由于测量任务的响应延迟时间不同于一般的时间参数测量,它要求很高的时间测量精度(至少微秒级)。所以,测试中采用示波器作为测试工具,分别测出在接受处理数据时串口RX端和TX端的波形,观察波形之间的时间间隔,就能精确的测量出串口收发数据的时间间隔。
根据上面所阐述的,在EM9160和EM9280工控主板上分别进行Linux系统对任务响应延迟的测量。
测试所用程序的一些主要部分;
首先配置并打开串口:
rc = m_Serial.OpenPort( 2, 115200, '8', '1', 'N');
这里为打开ttyS2,波特率115200,8位字符长度掩码,1位停止位,无奇偶校验。
数据的接收采用建立一个单独线程的方式,在线程中调用select()函数等待数据,当接受到数据以后,对数据处理,要进行相应解包,检验和的验证,并且回发:
pthread_create(&m_thread,&attr,(void *(*) (void *))&ReceiveThreadFunc, (void*)this );
串口发送数据需要经过打包处理:
int CSerial::WritePort(unsigned char *Buf, int len ,int fd)
对该例程感兴趣的客户可以点此下载该例程完整代码。
在EM9160和EM9280上面都使用同样的程序进行测试。
基于EM9160平台,对Linux-2.6的测试结果:
橙色线CH1的波形是串口接收端RX的波形,蓝色线CH2的波形是串口发送端TX的波形,波形横轴每一格的单位为2.5ms。测试波形的截图如下。
通过对以上四张图波形的观察,可以发现,EM9160工控主板在Linux-2.6的环境下,系统等任务的响应延迟是一个范围值,最短时间在1ms左右,最长时间已经超过了10ms。
下面来看基于EM9280平台,对Linux-3.9的测试结果:
橙色线CH1的波形是串口接收端RX的波形,蓝色线CH2的波形是串口发送端TX的波形。波形横轴每一格的单位为250us,测试波形的截图如下。
通过对这三张图中波形的分析,可以看出,在EM9280工控主板在Linux-3.9的环境下波形很稳定,系统对任务的响应延迟时间在1MS以内。能够满足对实时性的较高要求。
分析实验数据,可以发现,Linux-3.9对任务的响应延迟时间能够保持在1ms之内,而Linux-2.6对任务的响应延迟时间最短时间在1ms左右,但是最长时间却达到了10ms左右。通过对比,可以得出Linux-3.9相对于Linux-2.6在实时性上有相对较大的提升。
本次测试采用的波特率是115200,这样可以尽可能的减少数据传输时间和接收与发送超时的影响,与系统的响应时间对比,能够显现出实时性的特点。对于较慢的波特率,比如9600,4800等,数据传输本身较慢,等待数据传输和超时的时间也较长,可能一次数据传输完成的时间和系统响应的时间已经相差不大或者超过系统响应时间,这种情况下,Linux-2.6已经能够满足实时性的要求。但是当客户的传输速率较快而且对实时性的要求较高时,建议选用内核为Linux-3.9的工控主板进行相关开发,能够满足需求。
全部0条评论
快来发表一下你的评论吧 !