Tarjeta SD como memoria ROM en un microcontrolador

¿Puedo usar una tarjeta SD como ROM para mi microcontrolador? ¿Qué otras opciones hay si quiero una gran cantidad de memoria ROM (barata)?

respuesta corta Sí. Respuesta algo más larga: la mayoría de los microcontroladores no pueden ejecutar un programa debido a su arquitectura Harvard.
Depende de lo que entiendas por ROM. ¿Te refieres solo a algo de memoria que lees y no modificas, o te refieres a la RAM a la que accede la CPU? Si solo está buscando algo de memoria para colocar datos, entonces sí, las tarjetas SD pueden actuar como tales, pero su velocidad no se acercará a la velocidad que puede proporcionar la memoria más cercana a la CPU.
@ gl3829 Quiero un método más económico para tener una ROM adicional donde almacenaré el programa que se ejecutará.
Usar una tarjeta SD para esto es muy complicado (casi imposible) ya que tendrás que leer el código del programa en la memoria del microcontrolador. Considere que pasará mucho tiempo para que esto funcione y, dado que el tiempo es dinero, la alternativa más económica es simplemente comprar un microcontrolador más grande u optimizar el código para que se ajuste. Además, este método hará que la ejecución se vea afectada dependiendo de la cantidad de transferencias que necesite y de la rapidez con la que se pueda realizar. ¿Puede dar una idea del tamaño que necesita en cuanto al espacio del código del programa?
¿Qué tipo de microcontrolador?
@ gl3829 Creo que "rozando lo imposible" es una exageración. Esto es muy factible tanto en C como en ensamblaje, aunque definitivamente no es trivial. Definitivamente va a hacer que la velocidad de ejecución se vea seriamente afectada, y requerirá alrededor de 512 bytes de memoria RAM de repuesto en cada llamada/retorno que vaya a la tarjeta, pero es posible. ¡Depende de lo loco que quiera estar! (Estoy un poco cavando el aspecto loco en este momento>: D)
De acuerdo. Tal vez fui demasiado lejos al llamarlo casi imposible: D El operador quería algo muy económico. A medida que pasa el tiempo, esta es una de esas cosas. He hecho cosas similares en el pasado y, por lo general, no vale la pena el esfuerzo, excepto en algunos casos muy específicos.
¡Estoy de acuerdo en que es probable que no valga la pena!

Respuestas (2)

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.

Una configuración similar a la de un intérprete funcionará con Harvard. El pseudocódigo se puede cargar desde SD y ejecutar por el intérprete en ROM.
@jippie ¡Vaya! Sí, eso es definitivamente cierto y lo he visto hacer antes , aunque no estoy seguro de recomendarlo en un contexto serio...
Creo que los chips 8051 son una excepción a esto. Por favor verifica mi comentario.
Hay varios módulos de trabajo/comerciales que ejecutan lenguaje interpretado en un µC; por ejemplo el "Basic Stamp" o el "C-Control" .
@HannoBinder ¡Hice explícitamente su primer punto sobre el número limitado de escrituras en la respuesta! Dije 100,000, pero eso puede no ser completamente exacto. En cuanto a su segundo punto: sí, esto es definitivamente cierto, simplemente son lentos y escribir su propio intérprete sigue siendo una gran tarea abrumadora (y en mi cabeza también me imaginaba tratando de escribir algo más grande que eso). Supongo que hacer algo como tomar un sello básico y modificarlo para tomar un flujo de instrucciones de una tarjeta SD probablemente no sería demasiado difícil y definitivamente más simple que algunas de las cosas que sugerí...
@sandundhammika No entiendo tu comentario. ¿Y excepción a qué?
@KitScuzz: Lo siento, debo haber leído en exceso esa parte de tu respuesta; Borro ese comentario :)
Por supuesto, antes de almacenarlo en la tarjeta SD, uno 'compilaría' el lenguaje interpretado en algún 'código de bytes' que el µC interprete fácilmente. Supongo que así es como lo hacen los módulos comerciales. - Para el rendimiento, solo se delegaría la lógica no crítica en el tiempo al intérprete mientras se realizan otras tareas 'de forma nativa'.
@HannoBinder: no sé cómo lo han hecho las soluciones recientes, pero los primeros BASIC tendían a tokenizarse, es decir, analizaban previamente, pero en realidad no compilaban. En parte porque eran interactivos, es decir, podías desarrollar en el dispositivo y hacer declaraciones inmediatas.
Ah, y está el NanoVM , que proporciona todo lo necesario para un intérprete de Java simplificado.
Creo que 8051 no es tu arquitectura harvard
@ChrisStratton Sí, también recuerdo esos tiempos... :)
@sandundhammika Wikipedia parece sugerir que el 8051 es un chip de arquitectura de Harvard.
@ChrisStratton / HannoBinder Una vez que llegamos al punto en el que está creando su propio compilador/tokenizador, ¡me imagino que ha superado el ámbito de la razón para la mayoría de los proyectos! Dicho esto, es un buen consejo, lo agregaré a la respuesta.

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.

Esto también exige que tenga una arquitectura "híbrida-Harvard" o Von Neumann. ¡Con un PIC estándar o ATMega (Arquitectura de Harvard), no puede ejecutar código desde la RAM!
Eso prácticamente no hace falta decirlo. Aunque técnicamente, podría, con una máquina virtual o un intérprete, como ahora veo que otros han estado mencionando.