¿Cuál es la solución para no alineados de acceso a la memoria de excepción en ARM9 con C?

StackOverflow https://stackoverflow.com/questions/673930

  •  21-08-2019
  •  | 
  •  

Pregunta

La arquitectura ARM9.Lenguaje De Programación C.

Tenemos una tercera parte de la pila y una de las llamadas toma un puntero(pBuffer) a una ubicación de memoria.Dentro de la pila, que son libres de moverse el puntero pasado y el acceso como deseen.Por desgracia, estos compensan el pasado en el puntero y se la pasó en una otra función que trató de hacer esto de una odd/unalighed ubicación de la memoria

         ((uint16 *)pBuffer)[index] = value;

donde value es de tipo uint16 y index es límites revisados y los índices de pBuffer.Esto provoca un alineamiento de acceso a la memoria de excepción. pBuffer puntos a char * en el montón.

Como se ha mencionado, aunque podamos mirar en la tercera parte de la pila, no podemos actualizar el código oficialmente.Así se lo notificará al proveedor y proporcionan la actualización en la próxima versión.

Quiero entender si hay un trabajo alrededor de este.¿Cómo puedo realizar la asignación anterior, sin violar el alineamiento de acceso?Cuál es el mejor enfoque para la resolución de tales problemas.

¿Fue útil?

Solución

Copia el byte a byte de valor. Echarlo a un (sin firmar) puntero char, y luego copiar un byte a la vez.

No es bonito, pero no suena como usted tiene muchas opciones.

Otros consejos

Hay tres posibilidades, y no se pueden determinar a partir de su pregunta hasta el momento, que es el caso.

Caso 1: El índice es siempre impar. Solución: memmove () pBuffer más de 1 bytes Caso 2: El índice es a veces extraño, y se puede predecir por adelantado cuando será. Solución: memmove () pBuffer más de 1 byte cuando se sabe índice será impar. Caso 3: El índice es a veces extraño, y no se puede predecir cuándo va a ser. Esto es lamentable, ya que el código falla.

Si usted está en control de pBuffer, como un trabajo alrededor, se puede declarar como una matriz de uint32_t (o lo que coincide con la alineación de su arquitectura). Con declarando el búfer como uint32_t, el compilador va a elegir la correcta alineación. Puede echarlo a uint8_t * cuando se llama a la función de su objetivo.

Esto debería funcionar con el código de ejemplo informados, pero todavía puede fallar si el código de terceros se aplica cualquier desplazamiento en el búfer no alineado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top