This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/TMS320DM8148:当复制到 DMA 缓冲器时、memcpy ()在__memcpy_neon 中挂起

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/799274/linux-tms320dm8148-memcpy-hangs-in-__memcpy_neon-when-copying-into-dma-buffer

器件型号: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 上使用)。