?

門鈴響應函數中數據讀取優化方法

2021-10-15 08:38韓向清
雷達與對抗 2021年3期
關鍵詞:寄存器門鈴指針

許 菁,黃 震,韓向清,付 林

(中國船舶集團有限公司第八研究院,南京 211153)

0 引 言

在雷達信號處理或數據處理中,當使用PPC的RapidIO進行數據傳輸時,通常采用門鈴來實現數據傳輸完成后的消息中斷。對于這樣的門鈴中斷函數,需要盡可能快地完成數據轉移,以避免多次傳輸導致來不及處理的數據丟失。一般在進行大量不確定數量數據傳輸時,會在數據頭中設計一個字段來描述當次傳輸的數量?,F有處理方法會通過內存復制函數(memcpy)將數據頭復制一個副本,然后對副本中的長度字段進行讀取。

本文對現有處理方法進行優化,以減少使用內存復制函數(memcpy)的應用,提高輸出讀取的效率。

1 原 理

在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時間,對于門鈴響應來說會造成較長時間的延遲,如果在此時間內有新的接口操作和門鈴響應,就會造成數據的丟失。

2 設 計

從式(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)

可以看出:對地址描述變量到結構體類型指針的轉換以及對結構體字段的訪問,通過編譯過程就僅僅表達為首地址和偏移量的表達,兩個過程被濃縮成一條指令,大大減少了實際有效運行指令數,將極大地提高運行效率。

3 仿真分析

在驗證程序中,設計百萬次同樣操作的循環,分別采用內存復制函數(memcpy)和本文設計方法來讀取一個字段,最終得到的數據如表1所示。

表1 運行時間比較

可以看出:本文方法所需的運行時間遠遠優于內存復制函數(memcpy),運行效率提高了一個數量級,將極大節省CPU的運行開銷,減少門鈴響應函數的響應時間,降低由于內存搬移時間過長而導致新一次數據覆蓋上一次有效數據的幾率。

4 結束語

本文研究了采用地址描述變量到結構體類型指針轉換以及對結構體字段訪問替代內存復制函數(memcpy)的方法。經試驗測試,該方法可有效提高運行效率,降低數據傳輸中數據被覆蓋而導致丟失的幾率,可以在基于PowerPC的雷達信號、數據處理軟件中推廣,具有一定的實用價值。

猜你喜歡
寄存器門鈴指針
常用電子測速法在某數字信號處理器中的應用*
郊游
飛思卡爾單片機脈寬調制模塊用法研究
移位寄存器及算術運算應用
為什么表的指針都按照順時針方向轉動
淺析C語言指針
錘子門鈴
門鈴“丁冬”
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合