Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

247
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda