我需要复制大量内存(按47k的顺序)(例如,从USB缓冲区复制到更永久的缓冲区)。
这是使用手臂皮质A8。
(手臂上有霓虹灯代码。)
ARM霓虹灯指令一次可以复制4个32位元素(每条指令).
ARM、LDM和STM指令一次可以加载和存储超过4个寄存器(每条指令)。
问题:
。
工具:
ARM皮质A8处理器
IAR电子工作台IDE和编译器。
在Windows 10 PC上开发,到远程嵌入式ARM处理器(通过JTAG)。
发布于 2022-08-22 23:00:34
霓虹灯具有负载和存储不对齐的优点,但耗能更大。
而且,由于您正在将USB缓冲区复制到对齐和大小完全控制的缓冲区,因此没有霓虹灯会更好,因为内存速度是相同的。
标准的memcpy很可能已经使用了neon (它依赖于BSP),因此我会编写一个使用ldrd和strd的迷你版本,它比ldm和stm略快一些。
.balign 64
push {r4-r11}
sub r1, r1, #8
sub r0, r0, #8
b 1f
.balign 64
1:
ldrd r4, r5, [r1, #8]
ldrd r6, r7, [r1, #16]
ldrd r8, r9, [r1, #24]
ldrd r10, r11, [r1, #32]!
subs r2, r2, #32
strd r4, r5, [r0, #8]
strd r6, r7, [r0, #16]
strd r8, r9, [r0, #24]
strd r10, r11, [r0, #32]!
bgt 1b
.balign 16
pop {r4-r11}
bx lr 我认为使缓冲区大小乘以32没有问题,这两个缓冲区对齐为64字节(缓存行长度),甚至更好的是4096字节(页面大小)。
https://stackoverflow.com/questions/73449153
复制相似问题