¿Puedo usar una tarjeta SD como ROM para mi microcontrolador? ¿Qué otras opciones hay si quiero una gran cantidad de memoria ROM (barata)?
Así que depende de lo que quieras hacer. Como regla general: si estás dispuesto a correr lo suficientemente lento, puedes hacer lo que quieras.
En los microcontroladores (como un procesador PIC o ATMega (sin incluir los procesadores PIC32 o ARM de Atmel)) normalmente tiene una arquitectura Harvard, lo que significa que el código y los datos se almacenan en diferentes partes de la memoria y se accede a ellos de manera diferente. Esto significa que si carga un fragmento de código desde una tarjeta SD, estará en la RAM y no podrá tratarlo como código sin algunas acrobacias especiales. Puede escribir la información cargada en los bancos de códigos internos (que es como funcionan los cargadores de arranque), pero esencialmente nunca podrá tener más código cargado que el que comenzó su microcontrolador para los límites de tamaño del código. Ahora, podrías(con un poco de esfuerzo) escriba características especiales de "llamada" y "retorno" en su código que esencialmente eran funciones que cargarían la dirección solicitada fuera de la tarjeta SD y la escribirían en los bancos de códigos internos y luego llamarían al código recién cargado. Esto requeriría que cada función que tuviera fuera más pequeña que los bancos de códigos internos, pero eso no sería difícil. La parte difícil sería que esto causaría un gran desgaste en las secciones de código de la memoria en su chip, que con frecuencia solo están clasificados para ~ 100,000 escrituras (o como se menciona a continuación, ¡tan bajo como 10,000 escrituras!).
En la mayoría de las máquinas de arquitectura Von Neumann (e Hybrid-harvard) (ARM, Mips y x86, entre otras), los datos y las instrucciones son intercambiables. Esto significa que puede escribir código mucho más fácilmente para cargar las instrucciones desde la tarjeta SD y en la RAM, y luego comenzar a ejecutar. Si no tiene tanta RAM como código (lo cual, según su premisa original, suena poco probable), aún tendrá que hacer algunas cosas difíciles para llamar repetidamente para cargar desde la tarjeta SD a la RAM, al igual que el ejemplo anterior llamaba a cargar desde la tarjeta SD a la memoria del programa.
Si tiene una arquitectura Von Neumann y tiene la suerte de tener un microcontrolador con una unidad de administración de memoria o algún tipo de mecanismo de paginación definido por software (creo que ahora tienen esto, pero no sé qué es), entonces puede empezar a aplicar conceptos de memoria virtual . Pondrás todo el código en la RAM y sacarás el código a la tarjeta SD. Esto es muy complejo si aún no está implementado en su microcontrolador, por lo que no lo explicaré a menos que piense que esto es lo que planea hacer (tendré que buscar algunos de los mecanismos de paginación de software basados en ARM en orden de ayuda). Este requiere la menor cantidad de cambios en su código inicial, pero esencialmente requiere un sistema operativo sobre su código para manejar los cambios de página de códigos.
¡Espero que ayude!
EDITAR:
Como muchos han mencionado en los comentarios a continuación, quizás su mejor opción sea crear un intérprete que obtenga instrucciones de la tarjeta SD y las ejecute usando el código en la ROM interna. Esto funciona para las arquitecturas Harvard y Von Neumann, ya que tiene un código que es permanente y se ejecuta en función de los datos de la tarjeta SD. Ya existen varias implementaciones de esto: consulte Basic Stamp o NanoVMpara algunos puntos de partida. Comprenda que esto, por supuesto, siempre será bastante lento. Y si no desea utilizar un ejemplo prefabricado de esto, se verá atrapado creando su propio compilador/tokenizador, así como el intérprete, lo que conducirá a una depuración complicada. La ventaja de esto es que una vez que tenga todo funcionando, puede migrar su intérprete a cualquier arquitectura y estará listo para comenzar muy rápidamente.
Si bien es difícil trabajar con ella, hay situaciones en las que la técnica de "superposición" que alguna vez se usó en el pasado de la informática podría funcionar.
Por lo general, eso consistía en intercambiar explícitamente las principales fracciones funcionales de un programa en RAM limitada desde el disco, a medida que se necesitaban para varios modos distintos de operación. Si bien son "lentas" en comparación con la memoria de programa dedicada, las tarjetas SD son órdenes de magnitud más rápidas que las unidades de disquete con las que se usaba a menudo la técnica, especialmente en modo de lectura.
En gran medida, la memoria virtual moderna es una especie de implementación automática, a menudo casi invisible, de esta idea: es mucho más fácil trabajar con ella, pero requiere soporte de hardware.
Sin embargo, el problema con la técnica de superposición explícita es que debe poder dividir su programa en piezas distintas, en gran parte independientes, o al menos en piezas que solo tengan una dependencia interactiva en la parte fija del programa pero no entre sí. Por lo tanto, sería más adecuado para extras, complementos, etc. que se usan ocasionalmente que para funciones que deben utilizarse constantemente en una secuencia rápida o intercalada.
yippie
Gustavo Litovsky
Inquisitivo
Gustavo Litovsky
david tweed
kit scuzz
Gustavo Litovsky
kit scuzz