27 de Enero, 2015

La arquitectura Harvard

Una de las características de la familia de microcontroladores AVR de Atmel es que siguen una arquitectura Harvard modificada.

Esto es muy importante porque en la arquitectura Harvard los datos y el código se acceden vía buses diferentes. El microcontrolador (MCU de ahora en adelante) lleva incorportadas tres tipos de memoria:

  • Flash: contiene el código ejecutable, y el MCU no puede ejecutar código desde otro tipo de memoria. Esta memoria se puede re-escribir (lentamente), y mantiene su contenido cuando no hay electricidad (esto es: no volátil). Gracias a ser una arquitectura Harvard modificada se puede leer esta memoria como si fueran datos (aunque es algo más lento que la SRAM).
  • SRAM: memoria estática volátil.
  • EEPROM: memoria solo lectura que se puede re-escribir en determinadas condiciones.

Así que un microcontrolador no puede cargar código a memoria externa y ejecutarlo; no ha sido diseñado para trabajar así (ese funcionamiento hace referencia a una arquitectura Von Neumann).

Parece que mucha gente empezando con Arduino no termina de enterarse de este detalle hasta que es algo tarde, y es fuente de bastantes confusiones.

Es por esto que una de las partes de mi proyecto para aprender electrónica necesita implementar un intérprete o máquina virtual para poder ejecutar los programas que pretendo cargar en memoria externa.

¿Qué opciones tengo? Bueno, hay que recordar las características del MCU. Estoy trabajando con un Arduino Uno que viene con un ATmega328p, que nos proporciona:

Flash: 32 KB (programa, datos)
SRAM: 2KB (memoria lectura/escritura)
EEPROM: 1KB (memoria solo lectura)

Y además... con un cristal que nos da una velocidad de 16MHz (se puede llegar a 20MHz, pero no podría seguir usando la comodidad de usar el Arduino como placa de desarrollo), y con muchas cosas que hacer al mismo tiempo :S.

Así que el tema es complicado, no solo por los 2048 bytes de memoria :D, sino porque lo que sea... tiene que entrar en 32KB de código (incluyendo el driver de vídeo, del teclado, etc).

Es cierto que estoy usando 64KB de SRAM externa (por ahora solo como memoria de vídeo, 256x192 en monocromo ya son 6144 bytes que no caben en el Arduino), pero no puedo usarla cuando estoy refrescando la pantalla, así que no es todo lo rápido que se podría esperar.

Llevo un par de semanas dándole vueltas, saltando desde la idea de hacer un intérprete de BASIC a la idea de implementar una máquina virtual sencilla (el 6502 parece sencillo, y existen compiladores cruzados), pero todavía no tengo nada decidido. Lo que no se puede negar es que estoy aprendiendo muchas cosas nuevas ;).

Anotación por Juan J. Martínez, clasificada en: avr, arduino.

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: