Ejecutar instrucciones desde RAM en un microcontrolador amigable para aficionados

12

Uno de mis proyectos se beneficiaría enormemente de poder ejecutar un programa que no está almacenado en el microcontrolador (sino que está almacenado en una tarjeta SD).

Entonces, estoy buscando un dispositivo que me permita cargar el código de la tarjeta SD en la RAM y luego ejecutar el código desde la RAM. Actualmente, solo tengo el programador que viene con PicKit2, por lo que preferiría quedarme con los PIC.

¿Alguien sabe qué, si alguno, los PIC pueden hacer esto? Si ningún PIC es capaz de esto, ¿cuáles son algunos microcontroladores diferentes que funcionarían para esto? Preferiblemente los que están disponibles en un paquete compatible de placa de pruebas.

Ponkadoodle
fuente
2
¿eh? ... ¿Para qué necesitas ejecutar exactamente desde ram? ¿Y qué quieres decir con "estático"? en realidad no estás tratando de escribir código auto modificante, ¿verdad? ¿Estás hablando de la falta de asignación dinámica de memoria? aka no malloc?
Mark
2
@ Mark Quiero poder cargar un programa desde un dispositivo externo, como una tarjeta SD, y ejecutarlo. Trataré de explicar mejor en mi publicación.
Ponkadoodle
2
gotcha, el único PIC que conozco que permitiría esto es un PIC32. A menos que haga algo loco como copiarlo de la tarjeta SD al flash, que consumirá ciclos de flash bastante rápido si cambia de programa con frecuencia. La mayoría de los pequeños CC de 8/16 bits están muy segmentados entre el espacio de datos (ram) y el programa (flash) y no permiten que el contador del programa aborde el ram (arquitectura de Harvard, sin protección de memoria, etc.).
Mark

Respuestas:

5

Hay algunos PIC que le permiten agregar memoria de programa externa. Nunca he hecho esto, pero las Notas de aplicación AN869 y AN778 tienen más información sobre cómo implementar la memoria externa.

Daniel Grillo
fuente
11

Otra opción a considerar es usar un lenguaje interpretado para sus programas almacenados en la tarjeta SD. De esta manera, el procesador no está ejecutando el código de máquina leído desde la tarjeta, solo lo trata como datos.

Este enfoque le brinda flexibilidad a costa de la velocidad.

Hay muchas opciones para elegir: Encuesta de intérpretes / compiladores de lenguaje de alto nivel para microcontroladores

Toby Jaffey
fuente
1
Tira tu propio DSL. Esta opción me atrae al máximo de todas las soluciones sugeridas.
Amós
6

Como ya se ha dicho, los PIC (que no sean el PIC32) no pueden hacer esto. Probablemente tendrá que ir a los procesadores más grandes de cualquier familia o a un procesador con un bus de memoria externo ya que la mayoría de los microcontroladores tienen recursos de RAM muy limitados.

Los procesadores MSP430 pueden ejecutar código desde su espacio RAM, pero necesitará algo como el F5438 con 16k de espacio RAM: ¡ejecutar código en 128 bytes no es realmente una opción!

Si un procesador tiene un bus externo, puede colocar RAM en el espacio de código. Es posible que deba agregar algo de lógica adicional para asignar la RAM en dos regiones de memoria si la arquitectura del procesador no permite que los datos se escriban en la memoria de ejecución.

He ejecutado código desde RAM en un sistema basado en 8051, pero eso significaba que la RAM tenía que asignarse al espacio de memoria EXTERN para la programación y luego de vuelta al espacio de CÓDIGO para la ejecución. El programa cargador / monitor manejó el cambio y la carga del banco de memoria. No solicite el código: lo hice hace unos 30 años y hace mucho que se perdió (y está escrito en PL / M-51)

uɐɪ
fuente
5

Ninguno de los PIC de rango medio y bajo puede ejecutarse desde RAM debido a su arquitectura de memoria.

Cualquier CPU basada en ARM debe ejecutarse desde RAM. Aunque tienden a estar en paquetes smd, hay bastantes módulos de tamaño 'DIP' que ya tienen el microcontrolador cargado. Eche un vistazo a mbed o LPCXpresso, por ejemplo. Ambos vienen con un gestor de arranque o, en el caso de LPCXpresso, una interfaz de depuración junto con compiladores gratuitos.

Si prefiere quedarse con micros simples de 8 bits, quizás considere algo de la familia HCS08 de escala libre. Estos pueden ejecutarse desde RAM y hay una versión de código limitado del compilador Codewarrior IDE y C disponible de forma gratuita.

Estoy bastante seguro de que el MPS430 también debería ser capaz de hacer esto, pero nunca lo he hecho yo mismo.

Clint Lawrence
fuente
El mbed realmente recibe archivos binarios al copiarlos en la unidad flash incorporada y luego reiniciarlos. Aparece como una unidad flash cuando se conecta al puerto USB de una computadora. Si puede encontrar un método para usar la unidad flash en lugar de la tarjeta SD, o configurarlo para que un binario de la tarjeta SD se copie automáticamente a la unidad flash y se realice un reinicio, entonces podría tener suerte. El mbed no requiere un programador de hardware.
Amós
5

La hélice carga su programa desde el almacenamiento externo.

joeforker
fuente
1
Por lo general, el chip Propeller se inicia desde una EEPROM de 32K (24LC256), pero aquí hay una manera de arrancar desde una tarjeta SD: gadgetgangster.com/news/45-designer-news/…
tcrosley
3

Recuerdo haber leído sobre un gestor de arranque para AVR que volvería a flashear el chip con un archivo .hex (presumiblemente) desde una tarjeta SD. No puedo encontrar la fuente original, pero esta búsqueda en Google arroja un par de resultados interesantes. Sí, sé que esto es AVR y no PIC, pero puede resultarle útil si el PIC no funciona.

blalor
fuente
+1 para el gestor de arranque PIC .
davidcary
3

Como han señalado otros carteles, no se puede ejecutar desde RAM en un PIC de 8 o 16 bits, porque usan una arquitectura de Harvard (código separado y espacios de datos). Si es práctico o no cargar un programa de una tarjeta SD y actualizarlo a la memoria de código depende de la frecuencia con la que lo va a hacer.

Si está intentando crear un entorno dinámico como un sistema operativo que está superponiendo programas constantemente, entonces no. Pero en mi caso, tengo un programa que carga los controladores según sea necesario desde una tarjeta SD de 2 GB. El PIC24FJ256GB110 tiene un mínimo de 10,000 ciclos de borrado / escritura. Incluso si esto se hiciera cinco veces al día, el flash duraría un mínimo de 5 1/2 años.

(Nota: la cifra de 10,000 es un mínimo. La resistencia típica de los ciclos de borrado / escritura puede ser cinco veces mayor que, por lo tanto, si está haciendo desarrollo, probablemente pueda volver a flashear un procesador 140 veces al día, cada 3 1/2 minutos durante ocho horas, y aún podría durar un año).

tcrosley
fuente
2

En mi escuela utilizamos procesadores HC11 o HC12 con RAM externa para cargar y ejecutar programas en ... pero olvidé el nombre de las placas / kit :( En cualquier caso, las MCU de línea Freescale HC (S) abordan la RAM y la ROM de forma idéntica , para que pueda cargar el código en la RAM y ejecutarlo.

Tomando una cola blalor, la mejor solución podría ser simplemente agregar un botón en su placa que pueda actualizar el PIC de los datos almacenados en una tarjeta SD que inserte con un gestor de arranque. No puedo imaginar qué tipo de código no encajaría en los PIC más grandes; Si tiene algunos datos estáticos (gráficos, texto, sonido), guárdelos en un almacenamiento externo.

Nick T
fuente
1

Probablemente no pueda asignar desde la RAM, pero para su aplicación puede tener un pequeño cargador en flash que luego puede leer los datos de la tarjeta SD en el resto del flash. He utilizado este enfoque con un chip flash controlado por SPI para permitir que el firmware se cargue desde un enlace inalámbrico y luego se instale una vez que se recibió por completo; No se me ocurre ninguna razón en particular para que no funcione con una tarjeta SD, aunque un gestor de arranque compatible con SD podría ocupar algo de espacio.

Super gato
fuente
He hecho algo similar para un dispositivo que tenía unos pocos firmwares y propósitos ligeramente diferentes: escribir todos los archivos en un flash SPI externo (que está disponible en tamaños mucho más grandes que la mayoría de los microcontroladores) y actualizar el controlador con una de las imágenes con el gestor de arranque si se mantiene presionado un botón durante el reinicio.
Kevin Vermeer
0

Unos cuantos microcontroladores te permitirán hacer esto, parece que no es la foto. lo que querría hacer es tener un gestor de arranque que use spi para leer desde la tarjeta sd, copiar el programa, que probablemente quiera ser un nombre de archivo conocido o codificado, probablemente en el directorio raíz, analizar ese archivo en ram y luego bifurcarse a El programa en ram. Los controladores basados ​​en ARM ciertamente le permitirán hacer algo como esto.

Una alternativa sería hacer que el gestor de arranque lea la tarjeta SD a través de spi y en lugar de copiar en ram y ramificar quemar en una parte de la memoria flash. Probablemente desee tener un botón si se presiona el botón al encender o reiniciar, luego cargue un nuevo programa desde la tarjeta SD, de lo contrario, si la firma o la suma de verificación se ve bien en esa parte cargable del flash y luego en la rama de arranque en esa parte del flash. O tal vez si la tarjeta SD está presente, cargue de ella, de lo contrario, bájela a la parte cargable del flash. Puede usar este método con brazo y avr, posiblemente incluso con foto, pero mi experiencia con la foto está anticuada. msp430 Yo asumiría también. Básicamente, si puede reprogramar partes del flash desde el que ejecuta el microcontrolador,

viejo contador de tiempo
fuente
Hmmm, en realidad no he programado un avr desde el avr, lamento que haya sido en serie desde un host. Presenta una tercera solución que ves que hacen muchas placas de hobby baratas ... usa dos microcontroladores. En este caso, uno mantendría al otro en restablecimiento, leería la tarjeta SD, programaría el otro micro, a través de serie u otro, y luego liberaría el restablecimiento en el otro micro. Las placas de hobby / evaluación a menudo tienen un micro para la interfaz usb y generalmente se conectan al otro.
old_timer