Ejecutar código desde RAM y no usar FLASH (ARM)

Tengo una aplicación para mi ARM7 que generalmente se graba en FLASH y luego, al ejecutarla, se copia en la RAM (para que se ejecute un poco más rápido). Pero recuerdo que mi profesor dijo una vez que debería ejecutar mi programa desde la RAM porque solo puedes grabar la FLASH tantas veces. Entonces, mi pregunta es: ¿hay alguna forma especial de grabar el programa para que pueda ejecutarse directamente desde la RAM (no copiándolo desde FLASH)? Sé que podría usar algún cargador de arranque personalizado, pero esa no es una opción. Puedo usar el cargador SAM-BA pero, según tengo entendido, se usa para actualizar el dispositivo, no se puede usar para ejecutar ningún código desde la RAM y, si pudiera, ¿es posible escribir directamente en la RAM?

SAM-BA se puede usar para escribir el código de su aplicación directamente en la RAM, pero debe compilarse con la dirección base correcta. También necesitará que el cargador de arranque sepa buscar en la RAM para comenzar la ejecución. El cargador de arranque SAM (grabado en el chip) busca automáticamente en varias ubicaciones para encontrar un vector de arranque adecuado, si no encuentra ninguno, lo lleva al shell de depuración y puede grabar ram y hacer un restablecimiento parcial. Una vez que haya programado para flashear el cargador de arranque, simplemente lo copia en la memoria RAM para su ejecución, por lo general no escribe de nuevo, por lo que solo ejecuta el flash cuando descarga su binario.
Bien, la hoja de datos dice que SAM-BA usa una parte de la RAM para operaciones internas, por lo que el espacio de usuario comienza en 0x202000, mientras que la RAM comienza en 0x200000 (y FLASH en 0x100000). Supongo que la tabla de vectores debe comenzar en 0x202000 al comienzo del espacio de usuario. ¿Es esa la dirección (suponiendo que el proceso de vinculación se realice correctamente) donde debo "grabar" el binario? Entonces, ¿en qué se diferencia eso de escribir en flash?
Si está ejecutando bare metal, entonces usaría toda la RAM, SAM-BA vive en la ROM e intenta mover el código de su flash a los primeros bloques de RAM y luego se conecta a su sistema operativo o cargador de arranque secundario, está tratando de usar para iniciar una aplicación baremetal, el caso más simple es grabarlo en toda la memoria RAM y ejecutar un salto a 0x2000 0000, pero si desea que el cargador de arranque SAM lo haga automáticamente, deberá recorrer los documentos para descubrir qué es. busca para decidir por dónde empezar a ejecutar. Esto requerirá retoques, pero generalmente es factible.
Debería poder programar la RAM a través de la interfaz JTAG/SWD.
Bien, lo descubrí. Usé SAM-BA para enviar el .bin (vinculado correctamente) al inicio del espacio de usuario, justo después de la pila interna de SAM-BA, y luego usé 'go 0x202000' para iniciar la ejecución desde esta dirección. Encontré el comando en un sitio antiguo, ahora estoy tratando de encontrarlo en los documentos oficiales. Gracias por la información proporcionada de todos modos!

Respuestas (1)

SAM-BA es un cargador de arranque, por lo que si tiene samba, realmente no necesita reinventar otro. Solo úsalo. Jtag generalmente también funciona para poder cargar programas en RAM y ejecutarlos. Eventualmente, supongo que su aplicación deberá ejecutarse desde flash una vez que convierta esto en un proyecto/dispositivo o lo que sea. no requerido pero asumido. podría envolver su versión ram con una pequeña copia en el programa ram.

Le recomiendo que use sam-ba o lo que sea para borrar el flash del usuario para que samba no intente cargar eso y para asegurarse de que el chip esté en un estado conocido. No estoy seguro acerca de samba, pero es posible que una vez que el gestor de arranque no detecte un programa en flash, podría aumentar los relojes o configurar periféricos (uart) que podría no tener si hubiera copiado flash, por lo que aún puede terminar en una situación que su programa probado en ram funciona, pero una vez que lo copia desde un programa basado en flash o lo ejecuta desde flash, es posible que no funcione. Es posible que se requieran algunos ciclos de flash para finalizar la prueba. o puede crear su propio gestor de arranque que ejecuta samba y luego se encuentra en un estado conocido. Mi preferencia es una cosa tonta de xmodem, el cargador de arranque hace lo suficiente para configurar el uart y comenzar a esperar una descarga de xmodem, luego se descarga a una dirección conocida en ram. luego reemplace el descargador xmodem con la copia para ram y ejecútelo. así no hay sorpresas.