tarjeta SD como memoria ROM en un microcontrolador

4

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

    
pregunta Inquisitive

2 respuestas

8

Depende de lo que quieras hacer. Como regla general: si está dispuesto a correr lo suficientemente lento, puede hacer lo que quiera.

En los microcontroladores (como un procesador PIC o ATMega (sin incluir los procesadores ARM PIC32 o Atmel)), normalmente tiene un Harvard Architecture lo que significa que el código y los datos se almacenan en diferentes partes de la memoria y se accede de manera diferente. Esto significa que si carga un fragmento de código de una tarjeta SD, estará en la RAM y no podrá tratarlo como un código sin algunas acrobacias especiales. Usted puede escribir la información cargada en los bancos de códigos internos (que es cómo funcionan los cargadores de arranque), pero esencialmente nunca podrá tener más código cargado que con lo que comenzó su microcontrolador para los límites de tamaño de código. Ahora, podríamos (con algo de esfuerzo) escribir funciones especiales de "llamada" y "retorno" en su código que esencialmente eran funciones que cargarían la dirección solicitada desde el SD tarjeta y escríbala en los bancos de códigos internos y luego llame al código recién cargado. Esto requeriría que cada función que tuvieras 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 mucho desgaste en las secciones de código de la memoria en tu chip, que con frecuencia solo tienen una clasificación de alrededor de 100,000 escrituras (o como se menciona a continuación, ¡tan solo 10,000 escrituras!).

En la mayoría de las máquinas Von Neumann (y Hybrid-harvard) (ARM, Mips y x86, entre otras) ), los datos y las instrucciones son intercambiables. Esto significa que puede escribir mucho más fácilmente el código para cargar las instrucciones de la tarjeta SD y en la memoria 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, como el ejemplo anterior llamado para cargar desde la tarjeta SD a la memoria del programa.

Si tiene una arquitectura de 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), luego puede comenzar a aplicar los conceptos de memoria virtual . Colocará todo el código en la RAM y enviará el código a la tarjeta SD. Esto es muy complejo si aún no está implementado en / en su microcontrolador, así que no voy a explicarlo 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 para ayudar). Este requiere la menor cantidad de cambios en su código inicial, pero esencialmente requiere un sistema operativo además de 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, tal vez su mejor opción sea construir un intérprete que obtenga las instrucciones de la tarjeta SD y las ejecute utilizando el código en la ROM interna. Esto funciona tanto para las arquitecturas de Harvard como de Von Neumann, ya que tiene un código que es permanente y se ejecuta en base a los datos de la tarjeta SD. Hay varias implementaciones de esto que ya existen: vea Sello Básico o NanoVM para algunos puntos de salto. Comprende que esto, por supuesto, siempre será bastante lento. Y si no quiere usar un ejemplo prefabricado de esto, lo atraparán haciendo su propio compilador / tokenizador, así como el intérprete, lo que dará lugar a una gran cantidad de depuración complicada. Lo mejor es que una vez que lo tenga todo funcionando, puede llevar a su intérprete a cualquier arquitectura y estará listo para ir muy rápido.

    
respondido por el Kit Scuzz
2

Aunque es difícil trabajar con él, hay situaciones en las que la técnica de "superposición", una vez utilizada en el pasado de la computación, podría ser viable.

Por lo general, consistía en intercambiar explícitamente las principales fracciones funcionales de un programa en una RAM limitada desde el disco, a medida que se necesitaban para varios modos distintos de operación. Mientras que "lento" en comparación con la memoria dedicada del programa, las tarjetas SD son órdenes de magnitud más rápidas que las unidades de disquete con las que se usaba la técnica, especialmente en el 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 necesita poder dividir su programa en partes distintas, en gran parte independientes, o al menos aquellas que solo tienen una dependencia interactiva de la parte fija del programa pero no de El uno al otro. Por lo tanto, sería más adecuado para extras, plug-ins, etc. utilizados ocasionalmente que para características que deben utilizarse constantemente en secuencia rápida o intercalada.

    
respondido por el Chris Stratton

Lea otras preguntas en las etiquetas