武汉科技大学本科毕业设计
4. I/OAT DMA测试
4.1 测试环境的概述
4.1.1 测试平台
表4.1 测试环境介绍
配套测试产品型号 软件版本 IOAT DMA 版本 将32M的内存 按着不同的任务数、不同描述符MS5000 V1.0.18 V106 的个数、每个描述符的传输大小的组合情况下进行传输,探讨其传输性能; MS5000单板本地内存测试 测试内容 备注 4.1.2 测试目的
1. 验证I/OAT DMA 数据传输的一致性;
2. 探讨DMA传输的性能,对于不同的任务数、描述符的个数以及描述的传输大 小的组合,通过对传输时间的比较,来评估DMA传输的性能;
4.2 测试方法
为了测试的便捷性和以后对I/OAT其它功能的测试,在这里,将测试用例和底层的DMA驱动之间,从Linux DMA引擎中抽象出一个DMA外部接口驱动程序,如图4.1所示:
27
武汉科技大学本科毕业设计
测试用例DMA外部接口驱动程序DMA驱动 图4.1 测试方案
在DMA外部接口驱动程序中,定义了个task的关键结构体,用这个结构体来记录我们当前task的所有相关信息,比如task的操作类型(暂时默认MEMCPY)、DMA操作的对象(硬件描述符链)、操作完成时的回调函数以及记录当前task的数据域和额外的控制信息(注:在上层的测试用例中,将使用它来记录相关的时间点)等。
由于它处于中间层,所以对于上层的测试用例只是提供一个接口函数,即: dma_transfer(task_desc_t *task_desc)
对于底层的DMA驱动,则定义了一些相关函数,来完成对通道的申请与分配、硬件描述资源的填充与准备以及对相关任务的发起与执行,详细内容可参考前面第3章相关内容,在此不再鳌述。
下面我们主要谈谈测试用例的实现,流程图如下:
28
武汉科技大学本科毕业设计
创建一个任务组开始创建一个任务发起任务组传输创建一个任务组向内存申请一块内存,用于记录任务组信息,是二维指针的形式,组成一个任务表。申请一个task内存,并完成相关域的初始化调用接口函数,发起一个任务OK?NOERR 硬件传输,等待中断发起任务组OK?NOERRYES创建一个记录task相关信息的结构体。NOYES产生中断YESNO传输完毕,产生中断?YES结束创建一个任务,并添加到任务表中OK?YESERR创建一个软件描述符,并填写相应的地址信息ERRNOERROK?YESNO调用回调函数任务是否创建完毕OK?YESYESNOERRNO是否是最后一个任务YES唤醒completion结构,处理相关数据结棍,打印相关信息。将软件描述符填加到task中的描述链中NO是否创建完毕YES
图4.2 测试用例流程图
对于任务组的构造,用了一个二维结构体指针,创建了一个任务表,而在相应的任务结构体中记录了当前任务在任务表中的相对位置,这样便于在回调函数中定位完成信息;当然了,对于每个任务,也相关记录信息的结构体;任务与任务之间的切换,为了克服一个任务完成之后,结束当前进程,在这里面引用了一个内核提供的completion结构体的操作,即在创建任务组时,初始化该结构体,然后在最后一个任务体的回调函数中唤醒该结构体,这样保证了任务执行的连续性。但一点需要注意的,就是对相关资源的回收,特别时申请的内存和映射的地址信息的释放,所以在该用例中,定义一个清理函数,在整个任务组执行完毕,则调用清理函数,回收
29
武汉科技大学本科毕业设计
相关资源。为了测试的方便,将任务数task_count;每个任务所占有的描述符的个数soft_desc_count和每个软件描述符所传输数据的字节数soft_desc_size,作为模块参数导出来了。这样就和传输的时间有一定的量化关系,关系如下函数: f(t)=x(task_count)*y(soft_desc_count)*z(soft_desc_size) 计数DMA传输的数据量:
dmalength=task_count*soft_desc_count*soft_desc_size
通过改变三个参数中的两个,我们可以三维的数据表,这样能过对数据表的分析,我们就可以得出IOAT DMA性能与task_count,soft_desc_count,soft_desc_size之间的关系。
对于DMA传输数据一致性问题的研究,我们则可以在创建任务组之前,申请一块数据内存,然后填入相关的已知道数据,在回调函数中,通过memcmp函数判断源和目的数据是否一致,最后打印相关结果。
4.3 测试结果与缺陷
测试结果如下所示:
表 4.2 测试1
软件版本V18.3,IOAT DMA驱动版本V106环境下对本端内存拷贝的测试结果 硬件描述预取 1M 512KB 256KB 128KB 64KB 32KB 16KB 8KB 4KB
1 11.7 11.8 11.9 12 11.7 11.9 11.3 12 12.9 2 11 11.5 11.9 11.9 11.8 11.8 11.8 11.7 12.1 4 11 11.7 11.7 11.8 11.5 11.9 11.4 11.8 12 8 11 11.6 11.7 11.7 11.8 11.5 11.8 11.6 12.1 1 16 11 11.8 11.4 11.8 11.8 11.6 11.9 11.9 12.2 32 11 * 11.6 11.8 11.9 11.8 11.6 11.9 11.9 12.1 11.6 11.9 11.5 11.7 11.4 12.3 12.4 64 128 * 11.4 11.7 11.9 11.8 11.8 12.5 12.7 产品:MS50000 软件:V18.3 IOAT:V106 测试条件:单板本端测试,传输数据量为32M 备注 11.3 *
30
武汉科技大学本科毕业设计
表 4.3 测试2
软件版本V18.3,IOAT DMA驱动版本V106环境下对本端内存拷贝的测试结果 硬件预取描述符的个数 task_count 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 desc_count 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 5000 2500 1250 625 desc_size(KB) 0.5 1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 transfer_size 4.89M 9.77M 19.53M 39.06M 78.13M 156.25M 312.5M 625M 1.22G 2.44G 4.88G 4.88G 4.88G 4.88G 4.88G 1 spend time(ms) 7.1 7.2 7.8 13.2 24.9 48 94.7 186.8 371.9 742.2 1482.8 1481.8 1481.4 1481.2 1481.2 4 spend time(ms) 4.5 5.4 7.6 13.2 24.8 48 94.2 186.9 372 742.1 1482.6 1481.7 1481.5 1481.1 1481.3
测试的缺陷:
? 由于使用的时内核定时器,因为它的精度是毫秒集,可是对于DMA传输,速度很快,所以这里面可能会存在很大的时间误差,但是如果我们把所有的时间误差看一个系统所带来的一个恒定误差,那么在这个条件下对表中结果的分析,虽然不能定量的分析,但可以进行定性的分析;
? 还有一个缺陷就是我们所测试的时间差,这里面软件部分占用了很大的部分,因为前面也提到过,对小数据量的DMA硬件传输,其实是很快的,而对于软件部分,在传输的过程,有可能会出现回调不及时的情况,所以测试的结果也有待考证。当然了,曾经也做过一些相关的测试,发现从DMA传输完成,然后产生中断到调用回调函数,不管你的任务量是如何,都有10毫秒级单位的误差。
? 由于时间和工作量的问题,在这里只是从局部进行测试,即硬件描述预取个数1,传输的数据量为32M等,这对于整个性能的分析只是冰山一角。
4.4 测试结论
从上面的数据分析可知道:
? 如果对一个任务,一个切片的传输大小可能在4KB是个拐点,因为在传输过程中可以通过预取功能来保证传输的连续性,如果小于4KB,那么一个描述符的任务传输
31