Linux下的USB实时性测试
系统:Windows10
软件:VMWare
测试系统:Ubuntu
0.Cyclictest工具介绍
0.0 cyclictest简介
cyclictest是一个高精度(us级别)的系统实时性测试程序(维基主页地址) 。该工具是rt-tests下使用最为广泛的测试工具,一般用来进行内核的延迟,从而判断内核的实时性能。一般来说,在Ubuntu下面可以容易地通过$ apt-get install rt-tests
,从而获得该测试工具。也可以git 该程序的源代码到本地进行编译。
0.1 git仓库源码安装
首先机器必须要有git,通过$ sudo apt-get install git
进行安装。具体的代码安装步骤如下:
$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/clrkwllms/rt-tests.git//拷贝
$ cd rt-tests//进入git仓库
$ git branch testing//创建一个分支,比如testing->不影响源代码
$ git checkout testing//转到分支
$ git branch//查看确认目前所在的分支
$ make//进行编译
若遇到缺失numa.h
错误提示,需要先进行
$ sudo apt-get install libnuma-dev 之后再make
0.2 cyclictest的使用
具体的设置参数,须对照说明来进行。 在还没有安装的rt补丁的系统上先进行一次测试,以方便进行对比。在安装完rt补丁之后再进行一次测试。
$ sudo ./cyclictest –t1 –p 80 –n –i 10000 –l 10000
$ sudo ./cyclictest -p 90 - m -c 0 -i 200 -n -h 100 -q -l 1000000
1.Ubuntu打实时内核补丁(RT-PREEMPT kernel)
1.1下载内核即对应的内核rt补丁
RT补丁下载
内核代码下载
下载的的内核和补丁的版本号必须严格一致。
1.2打补丁
解压linux源码linux-3.18.59.tar.gz,把补丁文件patch-3.18.59-rt65.patch.gz放到和内核文件夹同一目录。
$ sudo apt-get install libncurses-dev//下载编译必须库文件
$ sudo apt-get install libssl-dev
$ cd linux-3.18.59
$ gzip -cd ../patch-3.18.59-rt65.patch.gz | patch -p1 --verbose
$ make mrproper//删除目录下残留的.o文件和其他旧的配置文件
到/usr/src/kernel/下面把当前的机器配置的.config拷贝(替换)内核文件夹下面的.config文件需显示隐藏文件
1.3配置内核
$ make menuconfig//进入内核配置
选择processor type and features ->preemption mode ->complete preemption(Real-Time) 不同的内核配置不一样,根据实际内核版本进行配置
1.4编译安装内核
$ make –jn//n根据内核数量不同对应不同数值,一般来说,一个核心配置两个线程。如8核心,此处应为make –j16
$ sudo make modules_install -jn
$ sudo make install –jn
1.5更新grub(启动顺序)
$ cd /boot
$ sudo update-grub
1.6 校验
重新启动系统,如果输入如下命令。
$ uname –a
如果出现PREEMPT RT字样,表示当前系统已经是实时系统。如若不是,那可能实时内核的序号比原来ubuntu内核的序号小(意味着开机的时候,不会优先启动)。需要在开机的时候,进入系统之前按下esc按钮,手动选择实时系统。
2.实时性测试
2.1测试方法
在实时系统中,通过QT程序结合libusb库,编写程序,每隔一定间隔发送信号到控制板,控制板一收到信号,马上转换对应GPIO口的电平,通过逻辑分析仪采集对应IO口的电平序列。在本测试中,逻辑分析仪的采集频率是4M/s,采集时间是10秒,分别对1ms,2ms,5ms和10ms间隔进行测试。
2.2测试结果
第一组1ms-4Mhz
,共采集转换点9943,其分布如下:
|Error|<-1.0ms|(-1.0,-0.9)ms|(-0.9,-0.8)ms|(-0.8,-0.7)ms|(-0.7,-0.6)ms|(-0.6,-0.5)ms|(-0.5,-0.4)ms|
|Count|0|0|20|2976|248|0|0|
|Error|(-0.4,-0.3)ms|(-0.3,-0.2)ms|(-0.2,-0.1)ms|(-0.1,0)ms|(0,0.1)ms|(0.1,0.2)ms|(0.2,0.3)ms
|Count|0|0|0|0|0|2|131
|Error|(0.3,0.4)ms|(0.4, 0.5)ms|(0.5,0.6)ms|(0.6,0.7)ms|(0.7,0.8)ms|(0.8,0.9)ms|(0.9,1.0)ms|
|Count|5664|901|0|1|0|0|0|
|Error|>1.0ms|
|Count|0|
第二组2ms-4Mhz
,共采集转换点5013,其分布如下:
|Error|<-1.0ms|(-1.0,-0.9)ms|(-0.9,-0.8)ms|(-0.8,-0.7)ms|(-0.7,-0.6)ms|(-0.6,-0.5)ms|(-0.5,-0.4)ms|
|Count|1|0|0|167|1466|249|1|
|Error|(-0.4,-0.3)ms|(-0.3,-0.2)ms|(-0.2,-0.1)ms|(-0.1,0)ms|(0,0.1)ms|(0.1,0.2)ms|(0.2,0.3)ms|
|Count|0|0|1|0|1|1|44|
|Error|(0.3,0.4)ms|(0.4, 0.5)ms|(0.5,0.6)ms|(0.6,0.7)ms|(0.7,0.8)ms|(0.8,0.9)ms|(0.9,1.0)ms
|Count|1970|1111|0|0|0|1|0|
|Error|>1.0ms|
|Count|0|
第三组5ms-4Mhz
,共采集转换点2006个,其分布如下:
|Error|<-1.0ms|(-1.0,-0.9)ms|(-0.9,-0.8)ms|(-0.8,-0.7)ms|(-0.7,-0.6)ms|(-0.6,-0.5)ms|(-0.5,-0.4)ms|
|Count|1|0|0|15|529|215|0
|Error|(-0.4,-0.3)ms|(-0.3,-0.2)ms|(-0.2,-0.1)ms|(-0.1,0)ms|(0,0.1)ms|(0.1,0.2)ms|(0.2,0.3)ms|
|Count|0|0|0|0|0|0|56|
|Error|(0.3,0.4)ms|(0.4, 0.5)ms|(0.5,0.6)ms|(0.6,0.7)ms|(0.7,0.8)ms|(0.8,0.9)ms|(0.9,1.0)ms|
|Count|741|440|8|0|0|0|1|
|Error|>1.0ms|
|Count|0|
第四组10ms-4Mhz
,共采集转换点1002个,其分布如下:
|Error|<-1.0ms|(-1.0,-0.9)ms|(-0.9,-0.8)ms|(-0.8,-0.7)ms|(-0.7,-0.6)ms|(-0.6,-0.5)ms|(-0.5,-0.4)ms|
|Count|1|0|0|0|351|25|0|
|Error|(-0.4,-0.3)ms|(-0.3,-0.2)ms|(-0.2,-0.1)ms|(-0.1,0)ms|(0,0.1)ms|(0.1,0.2)ms|(0.2,0.3)ms|
|Count|0|0|0|0|0|0|6|
|Error|(0.3,0.4)ms|(0.4, 0.5)ms|(0.5,0.6)ms|(0.6,0.7)ms|(0.7,0.8)ms|(0.8,0.9)ms|(0.9,1.0)ms|
|Count|526|92|0|0|1|0|0|
|Error|>1.0ms|
|Count|0|
3.新内核再测试
在虚拟机里面对实时性再进行测试.2017-12-21日.
运行系统windows10
linux版本:Ubuntu17.10-Kernel4.13.0-16
运行于vmware虚拟机上.
安装完系统之后,进行如下的命令.
$ sudo apt-get purge libreoffice* //删除office相关的东西,禁止此部分的程序更新.
$ sudo apt-get update//更新软件源
$ sudo apt-get upgrade//更新系统内核
$ uname -a查看系统当前的内核版本号
进行实时性测试,用以对比实时补丁前后的差别.下载并安装rt-tests
$ sudo apt-get install rt-tests
$ sudo cyclictest -p 90 - m -c 0 -i 200 -n -h 100 -q -l 100000
测试的结果为:
sudo cyclictest -p 90 - m -c 0 -i 200 -n -h 100 -q -l 100000
# /dev/cpu_dma_latency set to 0us
# Histogram
000000 000000
000001 000000
000002 000002
000003 000059 ->延时在3us的有59次
000004 000382
000005 000406
000006 000464
000007 000470
000008 000379
000009 000218
000010 000212
000011 000410
000012 000548
000013 000457
000014 000455
000015 000458
000016 000440
000017 000269
000018 000151
000019 000118
000020 000090
000021 000077
000022 000042
000023 000035
000024 000043
000025 000020
000026 000019
000027 000019
000028 000014
000029 000015
000030 000018
000031 000011
000032 000008
000033 000011
000034 000008
000035 000010
000036 000012
000037 000009
000038 000013
000039 000008
000040 000012
000041 000005
000042 000006
000043 000011
000044 000008
000045 000007
000046 000006
000047 000007
000048 000003
000049 000003
000050 000002
000051 000003
000052 000003
000053 000003
000054 000006
000055 000003
000056 000005
000057 000003
000058 000003
000059 000002
000060 000002
000061 000006
000062 000004
000063 000003
000064 000005
000065 000003
000066 000004
000067 000002
000068 000003
000069 000003
000070 000005
000071 000004
000072 000007
000073 000003
000074 000004
000075 000005
000076 000004
000077 000003
000078 000001
000079 000002
000080 000006
000081 000004
000082 000002
000083 000003
000084 000005
000085 000002
000086 000003
000087 000002
000088 000004
000089 000004
000090 000007
000091 000005
000092 000003
000093 000004
000094 000002
000095 000003
000096 000002
000097 000005
000098 000006
000099 000002
# Total: 000006628
# Min Latencies: 00002
# Avg Latencies: 00431
# Max Latencies: 02017
# Histogram Overflows: 93372 ->超过99us延迟有93372次
# Histogram Overflow at cycle number:
# Thread 0: 00000 00001 00002 00003 00004 00006 00007 00009 00011 00013 00014 00015 00016 00017 00018 00019 00020 00021 00022 00023 00024 00025 00026 00027 00028 00029 00030 00031 00032 00033 00034 00035 00036 00037 00038 00039 00040 00041 00042 00043 00044 00045 00046 00047 00048 00049 00050 00051 00052 00053 00054 00055 00057 00058 00059 00060 00061 00062 00063 00064 00065 00066 00067 00068 00069 00074 00077 00081 00082 00083 00084 00085 00086 00087 00088 00089 00090 00091 00092 00093 00094 00095 00096 00097 00098 00099 00100 00101 00102 00103 00104 00105 00106 00107 00108 00109 00110 00111 00112 00113 # 93272 others
参考资料:
[1]cyclictest 测试以及原理浅谈
[2]ubuntu打实时内核补丁(RT-PREEMPT kernel)
[3]Linux内核实时补丁PREEMPT_RT安装
[4]Linux 实时性测试和实时补丁
[5]使用嵌入式 Linux 进行实时系统开发
[6] Ubuntu 14.04.05上安装xenomai 2.6.4实时核