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 arquitecturaHarvard
modificada se puede leer esta memoria como si fueran datos (aunque es algo más lento que laSRAM
). - 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 ;).
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.