Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

238
Views
Uso de memcpy y amigos con E/S mapeadas en memoria

Estoy trabajando en un proyecto integrado que involucra E/S en registros FPGA mapeados en memoria. Los punteros a estas regiones de memoria deben marcarse como volatile para que el compilador no "optimice" las lecturas y escrituras en el FPGA almacenando en caché los valores en los registros de la CPU.

En algunos casos, queremos copiar una serie de registros FPGA en un búfer para su uso posterior. Dado que los registros están asignados a direcciones contiguas, memcpy parece apropiado, pero pasar nuestro puntero volatile como argumento fuente da una advertencia sobre descartar el calificador volatile .

¿Es seguro (y sensato) descartar la volatile del puntero para suprimir esta advertencia? A menos que el compilador haga algo mágico, no puedo imaginar un escenario en el que llamar a memcpy no pueda realizar una copia real. La alternativa es simplemente usar un bucle for y copiar byte por byte, pero las implementaciones de memcpy pueden (y lo hacen) optimizar la copia en función del tamaño de la copia, la alineación, etc.

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Como desarrollador de FPGA y software integrado, solo hay una respuesta clara: no use memcpy et al. para esto

Algunos motivos:

  • No hay garantía de que memcpy funcione en un orden específico.
  • El compilador podría muy bien reemplazar la llamada con código en línea.
  • Dichos accesos a menudo requieren un cierto tamaño de palabra. memcpy no garantiza eso.
  • Las lagunas en el mapa de registros pueden dar como resultado un comportamiento indefinido.

Sin embargo, puedes usar un bucle for simple y copiarte a ti mismo. Esto es seguro, si los registros son volatile ( ver más abajo ).

Dependiendo de su plataforma, la volatile por sí sola podría no ser suficiente. El área de memoria tampoco debe almacenarse en caché y estar estrictamente ordenada (y, posiblemente, no compartida). De lo contrario, los buses del sistema podrían (y lo harán en algunas plataformas) reordenar los accesos.

Además, es posible que necesite barreras/vallas para que su CPU no reordene los accesos. Lea atentamente las especificaciones de su hardware al respecto.

Si necesita transferir bloques más grandes con más frecuencia, piense en usar DMA. Si el FPGA usa PCI(e), podría usar busmaster DMA con dispersión/recopilación, por ejemplo (sin embargo, esto no se implementa fácilmente; lo hice yo mismo, pero podría valer la pena el esfuerzo).

El mejor (y más sensato) enfoque depende en realidad de múltiples factores, como la plataforma, la velocidad requerida, etc. De todos los enfoques posibles, consideraría que usar mempcy() es uno de los menos sensatos (1) en el mejor de los casos (1): no estoy seguro si esa es la gramática correcta, pero espero que haya entendido mi punto).

over 4 years ago · Santiago Trujillo Report

0

Absolutamente no es seguro. No hay garantía alguna en qué orden memcpy copiará los datos y cuántos bytes se copian a la vez.

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!