许 菁,黄 震,韩向清,付 林
(中国船舶集团有限公司第八研究院,南京 211153)
在雷达信号处理或数据处理中,当使用PPC的RapidIO进行数据传输时,通常采用门铃来实现数据传输完成后的消息中断。对于这样的门铃中断函数,需要尽可能快地完成数据转移,以避免多次传输导致来不及处理的数据丢失。一般在进行大量不确定数量数据传输时,会在数据头中设计一个字段来描述当次传输的数量。现有处理方法会通过内存复制函数(memcpy)将数据头复制一个副本,然后对副本中的长度字段进行读取。
本文对现有处理方法进行优化,以减少使用内存复制函数(memcpy)的应用,提高输出读取的效率。
在PowerPC的RapidIO数据传输时,需要进行内存地址映射,读取传输的数据是通过直接访问内存地址实现的。
编译器实现直接(或间接)地址访问读取数据,可以表达为
MOV AX,[Address]
(1)
而对结构体的字段访问表达为
MOV AX,[Address + offset]
(2)
式中,Address为结构体的首地址;offset为字段相对首地址的偏移量。
采用内存复制函数(memcpy)复制数据头的副本,实际上是对式(1)、跳转语句(jnz)以及计数器的多次调用,它主体的汇编表达将如下所示:
10:MOV CX,Count
20:MOVEAX,[Address]
30:MOV [DST],EAX
40:INC Address
(3)
50:INC DST
60:DEC CX
70:JNZ 20
同时,采用内存复制函数(memcpy)还将带来函数开销,如寄存器保存、函数堆栈等操作,这将涉及ESP、EBP等栈寄存器和EAX、ECX、EDX等调用者寄存器及EBX、ESI、EDI等被调用者寄存器的操作和保存。
首先,调用内存复制函数(memcpy)时,需要先将EAX、ECX、EDX等调用者寄存器进行保存:
10:PUSH EAX
20:PUSH EBX
30:PUSH ECX
其次,需要将输入给内存复制函数(memcpy)的参数,入栈后推送给内存复制函数(memcpy):
10:MOV EAX,[Address1]
20:PUSH EAX
30:MOV EAX,[Address2]
40:PUSH EAX
然后,内存复制函数(memcpy)执行式(3)所示的函数主体;
再者,内存复制函数(memcpy)将执行结果入栈:
10:MOV EAX,[Address3]
20:PUSH EAX
最后,调用函数将栈中结果出栈,并还原保存的寄存器:
10:POP EAX
20:MOV[Address4],EAX
30:POP EAX
40:POP EAX
50:PUSH ECX
60:PUSH EBX
70:PUSH EAX
上述开销将占用大量的CPU时间,对于门铃响应来说会造成较长时间的延迟,如果在此时间内有新的接口操作和门铃响应,就会造成数据的丢失。
从式(1)、(2)的描述可以看出,尽管C语言程序的写法不一致,但是实际上对内存的访问方法是统一的。因此,只要通过强制类型的转换实现对应数据字段的访问,就可以达到同样的目的。方法如下式所示:
int datalen=(([datastruct]*)address)->[lenfield]
(4)
式中,[datastruct]为待转换结构体类型描述字;[datastruct]*为该类型的指针;address为数据首地址;[lenfield]为描述数据长度的字段名。
式(4)实现了一个地址描述变量到结构体类型指针的转换以及对结构体字段的访问,从表达上看,是一个相对复杂的过程,可能也将占用一定的CPU开销。但是从编译器的表达上看,则恰恰相反,由于这个类型指针的转换过程及对结构体字段的访问的表达将在编译阶段完成,实际的有效运行指令将极为简单,示意如下式所示:
10:MOV EAX,[Address + offset]
20:MOV [DST],EAX
(5)
可以看出:对地址描述变量到结构体类型指针的转换以及对结构体字段的访问,通过编译过程就仅仅表达为首地址和偏移量的表达,两个过程被浓缩成一条指令,大大减少了实际有效运行指令数,将极大地提高运行效率。
在验证程序中,设计百万次同样操作的循环,分别采用内存复制函数(memcpy)和本文设计方法来读取一个字段,最终得到的数据如表1所示。
表1 运行时间比较
可以看出:本文方法所需的运行时间远远优于内存复制函数(memcpy),运行效率提高了一个数量级,将极大节省CPU的运行开销,减少门铃响应函数的响应时间,降低由于内存搬移时间过长而导致新一次数据覆盖上一次有效数据的几率。
本文研究了采用地址描述变量到结构体类型指针转换以及对结构体字段访问替代内存复制函数(memcpy)的方法。经试验测试,该方法可有效提高运行效率,降低数据传输中数据被覆盖而导致丢失的几率,可以在基于PowerPC的雷达信号、数据处理软件中推广,具有一定的实用价值。