Kana DS

Learning Japanese writing on the Nintendo DS

10 January, 2007

Arquitectura de Nintendo DS (II)

En el anterior artículo hablé sobre la organización de la memoria, los procesadores ARM9, ARM7 y algunas de sus peculiaridades. Esta vez voy a comentar algunas cosas sobre el DMA.

DMA
El DMA, o 'acceso directo a memoria' permite la lectura y escritura de la memoria principal sin la intervención de la CPU, esto es, con una circuitería dedicada. Las ventajas de usar DMA para transferencias de memoria son varias, pero a nosotros nos interesa especialmente por 1) su rapided y 2) eficiencia. Las operaciones DMA pueden ser en modo síncrono(la CPU permanece bloqueada hasta que la operación termina) o asíncrono. Éste último modo es el utilizado por los SO modernos para permitir p.ej. que podais estar reproduciendo un vídeo y a la vez grabando un CD sin saturar la CPU.

En un PC corriendo Windows o Linux es el propio SO el que gestiona la DMA, siendo totalmente transparente al programador de aplicaciones. Sin embargo, la Nintendo DS no tiene un sistema operativo en sí, sino una colección de rutinas BIOS y un puñado de registros que activan ciertas funciones. Debemos pues gestionar el DMA manualmente :-/

Por suerte Libnds nos provee de varias funciones para hacer uso del hardware DMA de la consola, y así poder hacer transferencias síncronas o asíncronas de manera eficiente. Si miramos en "include/nds/dma.h" podemos ver p.ej. el código de la función dmaCopy:

static inline void dmaCopy(const void * source, void * dest, uint32 size) {
DMA_SRC(3) = (uint32)source;
DMA_DEST(3) = (uint32)dest;
DMA_CR(3) = DMA_COPY_HALFWORDS | (size>>1);
while(DMA_CR(3) & DMA_BUSY);
}

En total tenemos siete (7) funciones para controlar el DMA, siendo sus nombres autoexplicativos:
  • dmaCopyWords
  • dmaCopyHalfWords
  • dmaCopy
  • dmaCopyWordsAsynch
  • dmaCopyHalfWordsAsynch
  • dmaCopyAsynch
  • dmaBusy
Si usamos las funciones -Asynch desde el ARM9 o ARM7, podremos seguir utilizando la CPU mientras la transferencia se realiza en un 'segundo plano'. Esto puede ser útil para aplicaciones que hacen decompresión de audio MP3/OGG o vídeo en tiempo real y que usan un sistema de doble buffer. Otro ejemplo práctico: si tuviésemos que hacer un MMORPG, usaríamos transferencias asíncronas para ir cargando el terreno y objetos segun avanzásemos por el mundo virtual, de manera que el juego no se viese nunca interrumpido por estas cargas.

En el próximo artículo hablaré sobre los modos de vídeo soportados por la consola y sus respectivos planos 2D/3D, poniendo como ejemplo el juego Rudolph Steady Go!

PD: Al igual que el resto de participantes del planet, yo tambien estoy hasta el cuello de prácticas y exámenes :P

2 Comments:

At 13:01, Anonymous informatica said...

Hola Julio, muy interesante el post sobre DMA, pero intentando hacer uso de las funciones dmaCopy, no veo nada en pantalla. ¿Por qué podría ser?
Un saludo.

 
At 20:02, Anonymous costa rica retirement said...

Muy interesante este blog gracias por explicar como se utilizan esta funciones son de mucha utilidad

 

Post a Comment

Links to this post:

Create a Link

<< Home