2 votes

memcpy() se bloque dans __memcpy_neon lors de la copie dans un tampon DMA

Je remplis cycliquement la mémoire tampon DMA avec mes données en les copiant à partir de la mémoire "normale" par tranches de 290 octets.

Au premier cycle memcpy passe toujours bien. Au deuxième cycle, il se bloque en __memcpy_neon (c'est du moins ce que dit la gdb à chaque fois que j'appuie sur Ctrl-C).

Le désassembleur affiche toujours le strmi instruction a été coincée dans.

À titre d'essai, j'ai remplacé memcpy() avec mon simple octet par octet memcpy1() et tout fonctionne bien sur tous les tampons DMA de 3MB (mais plus lentement évidemment...:-)). Pour exclure le problème d'alignement, j'ai testé la bibliothèque memcpy() pour copier des tampons non alignés - aucun problème n'a été détecté.

J'utilise linux 2.6.37 con glibc 2.23 (gcc 6.3.1 linaro) en DM8148 CPU.

Pourquoi ce memcpy se bloque-t-il en général et pour la deuxième fois en particulier ?

MISE À JOUR : Après des tonnes d'expériences avec différentes variantes de memcpy en assembleur, je peux affirmer que ce sont les instructions de copie de mémoire NEON, avec et sans préchargement, qui posent problème :

Loop:
  PLD [r1, #0xC0]
  VLDM r1!,{d0-d7}
  VSTM r0!,{d0-d7}
  SUBS r2,r2,#0x40
  BNE Loop

Toutes les autres variantes "normales" de memcpy() fonctionnent correctement. Y a-t-il des mystères dans l'utilisation de la mémoire DMA non mise en cache ( !) avec les instructions NEON ?

0voto

leonp Points 320

Eh bien, il semble que la réponse soit "oui ! il y a des mystères dans l'utilisation de la mémoire DMA uncached( !) mmaped avec les instructions NEON". Comme l'indique le manuel de l'ARM, "le Cortex A8 prend en charge l'accès à la mémoire non alignée". Cependant, l'accès non aligné à la mémoire fortement ordonnée n'est pas pris en charge" Comme le tampon DMA est très probablement une mémoire fortement ordonnée, le memcpy de la glibc utilisant NEON échoue lors de l'accès à cette mémoire DMA. Dans mon cas, cela se produit au deuxième cycle, parce que le premier accès était aligné, alors que le second ne l'était pas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X