簡體   English   中英

ARM上的高效復制,兩個16位讀取還是一個32位?

[英]Efficient copy on ARM, two 16-bit fetches or 1 32-bit?

我正在使用ARM7TDMI處理器的嵌入式系統。

在時間關鍵的ISR中,我需要從硬件寄存器中將24個16位值快照(復制)到SRAM中。 值是連續的,可以視為數組。

數據總線(到SRAM和硬件寄存器)是16位,我們在ARM模式(8/32)下運行。

在商店,我們正在討論復制數據的最佳方法:16位量或32位量。

我的論點是ARM處於32位模式,因此它將使用一條指令進行2次16位讀取比使用兩條16位指令進行一次讀取更快。
此外,獲取的指令數量只有一半,這應該會減少1/2的時間。

有人有任何數據支持這兩種方法嗎? (我的Ocope是全部分配的,所以我無法對嵌入式系統進行測量。由於ISR每隔一毫秒中斷,也無法運行很多次。) *(由於我們的JTAG Jet探測器不能進行分析,因此難以進行分析。不提供准確分析的方法。*

示例代碼 - 16復制:

#define MAX_16_BIT_VALUES 24U
uint16_t volatile * p_hardware;
uint16_t data_from_hardware[MAX_16_BIT_VALUES];
data_from_hardware[0] = p_hardware[0];
data_from_hardware[1] = p_hardware[1];
data_from_hardware[2] = p_hardware[2];
data_from_hardware[3] = p_hardware[3];
//...
data_from_hardware[20] = p_hardware[20];
data_from_hardware[21] = p_hardware[21];
data_from_hardware[22] = p_hardware[22];
data_from_hardware[23] = p_hardware[23];

示例代碼,32位副本:

uint32_t * p_data_from_hardware = (uint32_t *)&data_from_hardware[0];
uint32_t volatile * p_hardware_32_ptr = (uint32_t volatile *) p_hardware;
p_data_from_hardware[0] = p_hardware_32_ptr[0];
p_data_from_hardware[1] = p_hardware_32_ptr[1];
p_data_from_hardware[2] = p_hardware_32_ptr[2];
p_data_from_hardware[3] = p_hardware_32_ptr[3];
//...
p_data_from_hardware[ 8] = p_hardware_32_ptr[ 8];
p_data_from_hardware[ 9] = p_hardware_32_ptr[ 9];
p_data_from_hardware[10] = p_hardware_32_ptr[10];
p_data_from_hardware[11] = p_hardware_32_ptr[11];

詳細信息:ARM7TDMI處理器以8/32位模式運行,IAR EW編譯器。

注意:代碼已展開以防止指令緩存重新加載。
注意:匯編語言列表顯示使用常量索引的訪問內存比增加指針更有效。

編輯1:測試

根據Chris Stratton的評論,我們在16位FPGA寄存器上進行32位讀取時遇到問題,因此無法進行32位優化。

也就是說,我使用DMA進行了分析。 使用DMA控制器的性能提升為30 us(微秒)。 在我們的項目中,我們希望節省更多的時間,因此這種優化是不值得的。 該實驗表明,如果我們有更多的數據要傳輸,或者傳輸可以並行,那么DMA將非常有用。

一個有趣的說明是DMA需要17條指令來設置。

如果速度是最重要的,那么如果硬件可以支持它,那么最好的選擇就是匯編語言例程:

; Assume R0 holds source base and R1 holds destination base
PUSH   {R4-R7}
LDMIA R0,{R2-R7}
STMIA R1,{R2-R7}
LDMIA R0,{R2-R7}
STMIA R1,{R2-R7}
POP    {R4-R7}

我相信ARM7TDMI,當使用32位總線時,LDR需要三個周期,STR需要兩個周期; 使用LDRMIA / STRMIA加載或存儲n個字需要3 + n個周期。 因此,12個LDR和12個STR需要60個周期,但上面的序列應該需要50個(包括寄存器保存/恢復)。 我希望使用16位總線會給每個32位加載或存儲增加額外的周期損失,但如果LDM *和STM *指令將每個32位操作分成兩個16位操作,它們仍然應該比離散的加載和存儲快得多,特別是如果必須從16位存儲器中獲取代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM