Hola.
Perdona el retraso, pero el sabado me apetecia terminar el GOW y ayer cuando me puse, estuve trabajando en el nuevo Wifiloader y no me he puesto hasta ahora a mirar lo tuyo.
Te cuento: segun mis pruebas, el compilador funciona perfectamente, incluso me funciona bien creando la estructura despues del pack(0) e incluso si lo fuerzo a pack(4)
Veamos, si creo la estructura asi:
#pragma pack(1) // alineacion a 1
struct MulCell
{
u16 TileID;
s8 Z;
};
struct MulBlock
{
MulCell cells[8][8];
};
#pragma pack(0) // restaura la alineacion por defecto (a 4)
#pragma pack(4)
struct MulBlock prueba ={5,8,9,10};
Incluso si 'prueba' lo defino como local, me pilla bien los valores e imprimiendo las direcciones de cada elemento (TileID y Z) las direcciones son completamente correctas (y el tamaño de las estructuras, tambien es correcto)
Es decir: que no se puede hablar de fallo de compilador, a no ser que estes usando una version de GCC diferente (yo uso el 4.1.1 de devkitarm release 19b, cosa que puedes ver si metes en consola arm-eabi-gcc --version ). Salvo que estes usando una optimizacion con la que se atragante el compilador, solo se me ocurre una cosa.
Veamos, tu problema viene de usar la libfat, con gran probabilidad. En mi opinion, es probable que libfat requiera que le pases un buffer alineado, asi que haz lo siguiente:
- Crea un buffer temporal que este alineado a 4 (la forma facil es usar un array de ints o unsigned)
- Lee los datos que necesites ahi y luego los copias a tu estructura con ayuda de memcpy
No he mirado el fuente de libfat, pero es muy probable que esté utilizando alguna dma o rutina de copiado rapido que provoque ese fallo si el buffer esta desalineado. O eso o hay algun fallo en la libreria de algun tipo, pues ya te digo que desde mi ejemplo de prueba se comporta a la perfeccion, incluso me mantiene la alineacion de base cuando creo la estructura en un punto donde el pragma pack es diferente.
Si te sigue fallando con eso, prueba a leer todo el fichero en un buffer alineado a 4 y copia los datos con ayuda de memcpy. Si eso no te funciona, sera mejor que pases de libfat