加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ARM上的高效复制,两个16位读取还是一个32位?

发布时间:2020-12-16 07:05:50 所属栏目:百科 来源:网络整理
导读:我正在使用ARM7TDMI处理器的嵌入式系统. 在时间关键的ISR中,我需要从硬件寄存器中将24个16位值快照(复制)到SRAM中.值是连续的,可以视为数组. 数据总线(到SRAM和硬件寄存器)是16位,我们在ARM模式(8/32)下运行. 在商店,我们正在讨论复制数据的最佳方法:16位量
我正在使用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}
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位存储器中获取代码.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读