[NDS][C] Alinear datos a 4 bytes.

Buenas.

Necesito alinear los datos de las paletas y sprites que cargo de FAT a 4 bytes y no se como hacerlo. Yo tengo los datos que necesito en la memoria, pero no tienen por qué estar alineados al cargarlos, lo que me da problemas ya que para hacer copias con DMA se necesita que los datos que se van a copiar estén alineados...

Un saludo y gracias.
Necesitas añadir esto: __attribute__((aligned(4)));

Ejemplo:

u8 lista[5] __attribute__((aligned(4)))= {1,2,3,4,5};
Pero me refiero a que cargo las cosas con malloc desde FAT, no las tengo incluídas en el ejecutable (perfectamente podría usar memalign, pero por algún motivo se me pilla el juego cuando lo uso).

Vamos, ¿que despues de cargar los datos tengo que meterlos a algún lado alineado a 4 bytes simplemente?

PD: ¿Estoy diciendo alguna burrada?
ANTONIOND escribió:Pero me refiero a que cargo las cosas con malloc desde FAT, no las tengo incluídas en el ejecutable (perfectamente podría usar memalign, pero por algún motivo se me pilla el juego cuando lo uso).

Vamos, ¿que despues de cargar los datos tengo que meterlos a algún lado alineado a 4 bytes simplemente?

PD: ¿Estoy diciendo alguna burrada?



malloc() ya te da los datos alineados a 4 bytes, pero tienes la funcion memaling() que te permite especificar la alineación del bloque a asignar.

Por ejemplo memalign(16, 1024); te asignaría 1024 bytes alineados a 16 bytes.
Pues entonces ni idea de lo que estoy haciendo mal... Las paletas se cargan mal y por lo que había averiguado buscando era por la alineación... Pues nada, tendré que hacer una función que haga la copia sin usar DMA a ver si ése era el problema. Supongo que sí es el problema porque en el emulador, que no creo que compruebe la alineación (vete a saber...), funciona bien y en la DS no.

Gracias por la ayuda, Hermes.
ANTONIOND escribió:Pues entonces ni idea de lo que estoy haciendo mal... Las paletas se cargan mal y por lo que había averiguado buscando era por la alineación... Pues nada, tendré que hacer una función que haga la copia sin usar DMA a ver si ése era el problema. Supongo que sí es el problema porque en el emulador, que no creo que compruebe la alineación (vete a saber...), funciona bien y en la DS no.

Gracias por la ayuda, Hermes.



Entonces tu problema es otro: necesitas flushear los datos de la cache.

Las DMA's siempre trabajan fuera de la caché del procesador, por lo que debes asegurarte que se refrescan los datos de forma correcta.

Usa DC_FlushRange( addr, size ); para ello: addr la direccion de inicio y size es la longitud en bytes del bloque de memoria a "Flushear"

EDITO:

Por ejemplo, yo usaba este codigo para actualizar sprites via DMA:

DC_FlushAll(); // esto flushea toda la cache

dmaCopy(sprite_entryA, OAM, 128 * sizeof(SpriteEntry));
dmaCopy(sprite_entryB, OAM_SUB, 128 * sizeof(SpriteEntry));

Sería mas correcto usar DC_FlushRange, pues solo "flushea" los bytes necesarios :D
¿Sería algo así?

vramSetBankG(VRAM_G_LCD);
DC_FlushRange(VRAM_G + (palette_number << 9), 256);
DMA_Copy(palette, VRAM_G + (palette_number << 9), 256, DMA_16NOW);
vramSetBankG(VRAM_G_OBJ_EXT_PALETTE);


Porque así me sigue dando problemas. A veces salen los colores bien y a veces mal, como antes...

EDIT: No había visto tu edit, probaré haciéndolo también con los sprites, aunque éstos se cargan bien...

EDIT:
¡¡GRACIAS!! Usando DC_FlushAll(); justo antes de usar dmaCopy para cargar la paleta funciona perfectamente. Ahora tengo que recompilar las condenadas PAlib con algún cambio en las funciones de sprites y paletas para olvidarme de éste problema... O mejor modifico las funciones y las incluyo en el juego a parte... De verdad, cada vez me doy cuenta mejor de por qué las odia tanto alguna gente.

Eres un crack, tío. Haces programas, juegos, librerías y ayudas a la gente... Sin ir más lejos acabas de sacar una documentación de GX en Wii... De mayor quiero ser como tú. XD

¡Un saludo!

PD: Al final me ha dado pereza recompilar las PAlibs... lo he dejado como funciones nuevas en mi código y solucionado ^^.
6 respuestas