请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号:TMS320DM8148 工具/软件:Linux
我通过从"normal"存储器中以290字节的块复制数据、循环地将 mmap 处理的 DMA 缓冲区填充到数据中。
memcpy 在第一个周期始终通过 OK。 在第二个周期、它会挂起 __memcpy_neon routine (至少这是每次按 Ctrl-C 时 gdb 所说的内容)。
反汇编器始终显示 strmi 指令卡在中。
仅出于测试目的、我用 memcpy() 简单的字节字节替换 memcpy1() 、所有内容在所有3MB DMA 缓冲区上都能正常工作(但显然更慢...:-)。
为了排除对齐问题、我测试了库 memcpy()来复制未对齐的缓冲区-未检测到问题。
在对 memcpy 的不同汇编器变体进行了大量实验之后、我可以说、挂起的是带和不带预加载的 NEON 存储器复制指令:
Loop:
PLD [r1, #0xC0]
VLDM r1!,{d0-d7}
VSTM r0!,{d0-d7}
SUBS r2,r2,#0x40
BNE Loop
memcpy()的所有其他"正常"变体工作正常。 在使用 DMA 未缓存(!)时是否有任何 mysteries 带 NEON 指令的堆装存储器?
( linux 2.6.37 glibc 2.23 (gcc 6.3.1 linaro) DM8148 我在 CPU 上使用)。