Opción 1: idiomas interpretados
Esto no responde directamente a la pregunta (que es una excelente pregunta, por cierto, y espero aprender de una respuesta que lo aborde directamente), pero es muy común cuando se realizan proyectos que pueden cargar programas externos para escribir los programas externos en Un lenguaje interpretado. Si los recursos son limitados (que estarán en este procesador, ¿ha pensado usar un PIC32 o un procesador ARM pequeño para esto?), Es común restringir el idioma a un subconjunto de la especificación completa. Aún más abajo en la cadena hay lenguajes específicos de dominio que solo hacen algunas cosas.
Por ejemplo, el proyecto elua es un ejemplo de un lenguaje interpretado de bajos recursos (64 kB RAM). Puede reducir esto a 32k de RAM si elimina algunas funciones (Nota: no funcionará en su procesador actual, que es una arquitectura de 8 bits. El uso de RAM externa probablemente será demasiado lento para los gráficos). Proporciona un lenguaje rápido y flexible en el que los nuevos usuarios podrían programar fácilmente juegos si proporciona una API mínima. Hay mucha documentación disponible para el idioma en línea. Hay otros idiomas (como Forth y Basic) que podría usar de manera similar, pero creo que Lua es la mejor opción en este momento.
De manera similar, podría crear su propio lenguaje específico de dominio. Tendría que proporcionar una API más completa y documentación externa, pero si los juegos fueran todos similares, esto no sería demasiado difícil.
En cualquier caso, el PIC18 probablemente no sea el procesador que usaría para algo que involucra programación / scripting y gráficos personalizados. Puede que esté familiarizado con esta clase de procesadores, pero sugeriría que este sería un buen momento para usar algo con un controlador de pantalla y más memoria.
Opción 2: solo reprograme todo
Sin embargo, si ya está planeando programar todos los juegos usted mismo en C, no se moleste en cargar solo la lógica del juego desde la tarjeta SD. Tiene solo 32kB de Flash para reprogramar, y podría obtener fácilmente una tarjeta microSD de 4 GB para esto. (Nota: las tarjetas más grandes a menudo son SDHC, que es más difícil de interactuar). Suponiendo que use cada último byte de sus 32 kB, eso deja espacio en la tarjeta SD para 131,072 copias de su firmware con cualquier lógica de juego que necesite.
Hay muchas aplicaciones para escribir cargadores de arranque para PIC, como AN851 . Tendría que diseñar su gestor de arranque para ocupar una región específica de memoria (probablemente la parte superior de la región de memoria, debería especificar esto en el vinculador) y especificar que los proyectos de firmware completos no llegan a esta región. La nota de aplicación explica esto con más detalle. Simplemente reemplace "Sección de inicio del PIC18F452" con "Sección de inicio que especifique en el vinculador" y todo tendrá sentido.
Luego, su gestor de arranque solo necesita permitir al usuario seleccionar un programa para ejecutar desde la tarjeta SD y copiar todo. Una IU podría ser que el usuario tiene que mantener presionado un botón para ingresar al modo de selección. Por lo general, el gestor de arranque simplemente verificaría el estado de este botón al reiniciar y, si no se mantiene presionado, iniciará el juego. Si se mantiene presionado, deberá permitir al usuario elegir un archivo en la tarjeta SD, copiar el programa y continuar iniciando el juego [nuevo].
Esta es mi recomendación actual.
Opción 3: Magia profunda que implica almacenar solo parte del archivo hexadecimal
El problema con su mecanismo previsto es que el procesador no maneja las API y las llamadas a funciones, sino que trata con números : direcciones a las que el puntero de instrucciones puede saltar y esperar que haya un código que ejecute una llamada a funciones de acuerdo con una especificación API. Si intenta compilar solo una parte del programa, el enlazador no sabrá qué hacer cuando llame check_button_status()
o toggle_led()
. Puede saber que esas funciones existen en el archivo hexadecimal en el procesador, pero necesita saber con precisión en qué dirección residen.
El vinculador ya divide su código en varias secciones; teóricamente podrías dividir esto en secciones adicionales con algunos -section
y #pragma
encantamientos. Nunca he hecho esto, y no sé cómo. Hasta que los dos métodos anteriores me fallen (o alguien publique una respuesta increíble aquí), probablemente no aprenderé este mecanismo, por lo que no puedo enseñárselo.