¿Hay alguna forma de ejecutar código binario desde RAM?

8

Estoy buscando una computadora económica de placa única que pueda programar en lenguaje ensamblador, utilizando recursos limitados para cargar el código objeto desde una PC y periféricos de E / S simples.

Idealmente, me gustaría poder escribir en un tiempo razonable todo el código en la máquina yo mismo. No quiero un sistema operativo en el camino, ya que quiero tener un programa que escriba en la RAM algún código y luego se bifurque para ejecutarlo. Arduino probablemente sería mi mejor opción, en lo que respecta a la simplicidad del sistema adecuada para la programación de ensamblaje, pero tiene una arquitectura de Harvard y no me permite ejecutar desde RAM.

Hace años estaba usando una CPU de 8 bits con arquitectura Von Neumann que podía ramificar la ejecución a cualquier dirección, sin importar si estaba asignada a ROM, RAM o lo que sea. Esto es lo que me gustaría hacer ahora.

Probablemente podría escribir y cargar en la memoria Flash un intérprete de códigos operativos escritos en RAM, pero es una solución muy compleja y lenta, a menos que ya existan máquinas virtuales de este tipo.

¿Alguna sugerencia sobre otras soluciones con Arduino o de otros microcontroladores que podría usar?

¡Gracias!

Pierre

pierre
fuente
3
El PIC32 es un chip de arquitectura Princeton (Von Neumann). Es una CPU MIPS, por lo que está bien documentada y estandarizada, aunque algo más compleja que un AVR humilde. Los tableros chipKIT pueden ser más de su agrado.
Majenko
2
Aunque optimizada como una arquitectura de Harvard, la serie ARM Cortex-M puede ejecutarse desde RAM con una pérdida de eficiencia tolerable y aún sería mucho más rápida que un AVR al hacerlo. Al menos media docena de compañías de chips hacen ofertas ampliamente utilizadas basadas en la licencia de este núcleo, y aunque muchas personas usan bibliotecas de proveedores y / o semi-estándar, es completamente posible hacerlo todo usted mismo en base a las hojas de datos. Primero utilicé STM32 porque sus placas de descubrimiento son muy baratas, funcionan en Linux / OSX con herramientas de código abierto y pueden programar chips en placas personalizadas, pero ahora también he usado Kinetis.
Chris Stratton
La pregunta principal es ¿Por qué? ¿Por qué requiere la ejecución de ASM desde la RAM? ¿Y qué tipo de ensamblaje quieres usar? Dado que cada arquitectura tiene su propio lenguaje ... ¿Lo haces con fines de aprendizaje? ¿O tienes un objetivo específico?
frarugi87
2
Ruego diferir, por qué deseaba hacer esto es irrelevante para la pregunta que hice en ese momento, ya que esta no es una solución para algún otro problema. Por cierto, seguí el consejo de Majenko y actualmente tengo un Uno32 plus interfaces externas ejecutando ensamblado (y llamando a funciones C desde el ensamblaje), escribiendo su propio código asm modificado en RAM y ejecutándolo.
Pierre
Forth es lo que estás buscando :)
Mikael Patel

Respuestas:

1

En mi opinión, la idea del intérprete es mucho más factible. La noción de escribir, en ensamblador, código que genera código de máquina, en RAM, y luego lo ejecuta, es increíblemente complejo.

No ha dicho por qué quiere hacer esto, por lo que este es un problema XY .

No quiero un sistema operativo en el camino ...

Los Arduinos normales no tienen un sistema operativo en el camino, básicamente el código que escribes es el que se carga en el chip.

Nick Gammon
fuente
2
En una palabra, no. La incapacidad para ejecutar memoria modificable es una limitación bastante inusual en la actualidad, donde la mayoría de los otros dispositivos de arquitectura nominalmente de Harvard se modifican para evitar esa limitación. Escribir un intérprete de software será mucho más trabajo y mucho menos eficiente que lidiar con uno de los muchos chips económicos, de alto rendimiento y fáciles de usar que tienen las conexiones internas necesarias para simplemente ejecutar el código de la RAM. La operación de canalización ligeramente menos eficiente en ese modo todavía está muy, muy por delante de la interpretación del software.
Chris Stratton
1
No. Si va a realizar una modificación del código de tiempo de ejecución, es mucho más fácil generar directamente código de máquina que generar código de alto nivel y también tiene que crear un compilador o un intérprete como se recomienda. Puede valer la pena dedicar un poco de tiempo a escribir instrucciones a mano para tener alguna perspectiva. Y no, "escribir todo el código en la máquina yo mismo" no se refiere a la generación de código de tiempo de ejecución para empezar, sino más bien a crear un trabajo original en lugar de depender de otros autores para el soporte de componentes.
Chris Stratton
1
Aquí hay un sencillo shell de estilo para el Arduino que ejecuta código desde cualquiera de los almacenes de memoria (SRAM, EEMEM, EEPROM). No es el intérprete más rápido, pero muestra cómo se pueden abstraer la búsqueda de instrucciones (acceso a memoria) y el puntero de instrucciones (direcciones de llamada / retorno). github.com/mikaelpatel/Arduino-Shell
Mikael Patel
1
Estoy impresionado, Mikael. Escribí un intérprete de Forth para Apple II hace años. Dudo que incluso pueda encontrar el código en estos días. ¡El viejo Forth, todavía vivo y coleando! :)
Nick Gammon
1
@NickGammon Recientemente escribí una cuarta máquina virtual (fvm) más tradicional para Arduino. Permite incrustar un intérprete de instrucciones de bytes en un boceto de Arduino, ya que es multitarea (permite el rendimiento del fvm). github.com/mikaelpatel/Arduino-FVM . Hay un compilador de tokens (se ejecuta en Arduino :) y un cuarto intérprete interactivo tradicional. Por favor vea los bocetos de ejemplo.
Mikael Patel el