4 votos

PIC32 ejecutando un programa desde la RAM

Me pregunto si alguien ha probado a ejecutar un programa completo en un PIC32 sin memoria RAM. ¿Cómo se puede hacer eso? Tengo entendido que se puede utilizar la palabra clave ramfunc para mover ciertas funciones a la RAM, sin embargo, todavía requieren que la copia esté en Flash.

Lo que me gustaría hacer es tener un programa cargador en el PIC32 que pueda aceptar un archivo hexadecimal a través del puerto serie, etc. y en lugar de escribirlo en la memoria flash que se ejecute en la memoria ram directamente.

Idealmente esperaba que modificando el linker por defecto script se pudiera apuntar a un programa para que se ejecute desde la RAM alternativamente si alguien sabe como podríamos parchear un programa que estuviera enlazado para que se ejecute desde la flash para que se ejecute desde la RAM eso también podría funcionar

Gracias Mike

0 votos

No sé sobre las herramientas PIC, pero algunos otros IDEs (como CrossStudio para ARM) le permiten elegir muy fácilmente dónde colocar su código, ya sea en la flash o en la RAM, para fines de depuración.

0 votos

Es una gran idea.

0 votos

Mira allí - ya está hecho. Aquí está el ejemplo de trabajo con el código fuente. github.com/elect-gombe/nativeC-MachiKania hackaday.io/project/29198-native-c-pic32-color-video-on-tv

4voto

Matt McMinn Puntos 6067

Ambos atributos longramfunc y ramfunc colocan la función en un área especial de la flash que será copiada a la RAM por el código de inicio. No es conveniente utilizarlos.

Para las funciones que serán llamadas desde la flash, se debe utilizar el atributo longcall que especifica que se necesita una llamada de 32 bits (JALR) en lugar de una llamada de 28 bits (JAL), ya que la flash y la RAM se encuentran en segmentos separados de 512MB.

También tendrás que configurar un archivo linker personalizado con una sección RAM ejecutable, e incluir el nombre de esa sección en cada función que se coloque allí.

La macro longramfunc también incluye el atributo longcall, mientras que la macro ramfunc no, y está pensada para llamadas de una función RAM a otra. En su caso, para las funciones llamadas por otras funciones RAM, no quiere usar el atributo ramfunc porque establece la copia desde flash.

Dado que vas a copiar las funciones tú mismo (por ejemplo, desde una tarjeta SD), tendrás que incluir tu propio cargador que interprete el código hexadecimal y copie los datos a la flash según sea necesario.

0 votos

¿Sería posible cargar un programa en un área fija de la memoria RAM y simplemente hacer un salto ciego a la dirección cero de ese rango, asumiendo que el archivo hexadecimal tendrá código válido en ese punto?

0 votos

@CMP, sí que podrías hacerlo escribiendo el salto en ensamblador PIC32. Creo que sería más fácil, sin embargo, para crear una función ficticia que establecería la vinculación, y luego sería sobrescrito por el código realmente cargado en la RAM.

1voto

Simon Gillbee Puntos 366

Tienes tres soluciones básicas a tu problema de querer descargar programas para ejecutar después de flashear la pieza.

  1. Utilice un lenguaje interpretado como Lua, Basic o Forth. Escribir (o, más probablemente, sólo portar) una máquina virtual existente que interprete instrucciones de texto en lugar de código máquina, y descargar el programa como texto. Tienes que reimplementar tu programa en el lenguaje interpretado, pero es más rápido y fácil (especialmente en Lua) que escribirlo en C.
  2. Sólo tienes que conseguir un poco de almacenamiento adicional y reflash toda la parte. No has descrito lo que estás haciendo, así que no puedo saber si esto es aplicable, pero es bastante fácil añadir un IC Flash de serie y/o una tarjeta microSD con mucho almacenamiento a tu placa y hacer que el cargador de arranque seleccione un perfil para ejecutar. Con una vida útil de la Flash de 10.000 reescrituras, esto te da 27 años de recargas una vez al día.
  3. Haz lo que pretendías en un principio. Esto requerirá una cuidadosa programación (ver Respuesta de tcrosley para algunos métodos requeridos) y algunas secuencias de comandos de enlace de lujo. Buena suerte.

Adaptado en gran medida de mi respuesta a "Compilación de código para ejecutar desde la RAM externa un problema similar.

0 votos

He mirado de usar Lua en un micro. Es posible, pero necesitas mucha RAM. Creo que recomiendan algo así como al menos 256k.

0 votos

@Rocketmagnet - La recomendación es 64k, que es bastante común en las plataformas Cortex-M3, ARM7TDMI y AVR32 a las que se dirige eLua. También está disponible en el PIC32 (pero no hay puerto para PIC32 todavía). Puede caber en 32k, pero eso no le deja mucho espacio para los programas - recuerde que cada carácter en un programa es un byte. Los requisitos reales de RAM para las bibliotecas estándar que se cargan al inicio son de unos 17k, pero eso puede reducirse a menos de 6k con el Lua Tiny RAM parche.

0voto

doshea Puntos 1095

La forma más fácil de hacer una librería de DLLs que se ejecuten desde la RAM una a la vez - haz un proyecto de ayuda, incluye en él algunas funciones que se ejecutarán desde la RAM, (depúralo en hardware real si es necesario), luego haz un subprograma UART2 (en este proyecto de ayuda) que guarde la RAM en formato hexadecimal desde las ubicaciones indicadas por el archivo de mapa (generado por el enlazador). Ejecuta este programa en el emulador y haz que guarde el contenido de la RAM en un archivo (estará codificado en UTF8, así que conviértelo de nuevo a ascii). Aquí tienes - la imagen de memoria de la primera DLL está hecha. Su proyecto puede cargar esta imagen desde la tarjeta SD y llamar a la primera función (que debe ser la misma, es decir, no el cuerpo de la función es el mismo, pero sólo la declaración debe ser exactamente la misma, y en el mismo lugar en el ayudante y en el proyecto principal). Luego pasas a esa función el puntero a la tabla de punteros a funciones y otras estructuras que las funciones en la RAM pueden necesitar usar desde el programa principal que reside en la memoria flash. Procede con el resto de DLLs que necesites.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X