Agregue el código fuente a la imagen flash al programar un AVR

¿Es posible que Arduino / ATmega / ATtiny al programar el dispositivo adjunte el código fuente C al final de la imagen flash del código de la máquina? De esa manera, si tengo el dispositivo, siempre puedo recuperar el código fuente leyendo la memoria flash.

La forma más fácil en que puedo pensar en mí mismo es una declaración similar al final del programa C que lee el código fuente del archivo y lo adjunta como datos al programa. Pero no tengo ni idea de cómo hacer eso.

El código fuente de un microcontrolador suele ser inútil sin el esquema del circuito en el que se encuentra.
@TurboJ: estoy de acuerdo, menciono otros documentos en mi respuesta. Pero si un programa está bien documentado, incluye en el comentario una lista completa de todas las E/S. Y según tengo entendido, OP quiere distribuir el controlador en su PCB.
O puede tener todo esto en algo así como un servidor de subversión alojado en línea... luego su computadora y el servidor tienen registros completos y acceso.

Respuestas (2)

Siempre debe poder agregar cualquier tipo de datos a su código. Simplemente cree una matriz de texto que complete con el código C.

char source_code[9189] = {'m', 'a', 'i', 'n', '(', ')', 13, 10, '{' ,'}', 0};

¡Definitivamente querrá escribir un programa para crear la matriz a partir de un archivo de texto!


Personalmente creo que esta es una mala manera de hacerlo. ¡Organizarse! Incluya una referencia de código que incluya el número de versión, que hace referencia al código de su PC . Incluso puede agregar la posibilidad de leer la referencia en el sistema. A menudo incluyo un código que emite la identificación del controlador a través de UART cuando un determinado pin de prueba se baja, como lo haría en un bloque de prueba. El bloque de prueba podría mostrarlo como por ejemplo

ID del programa: 10121
Revisión: 02

Esto debería ser suficiente para encontrar el código fuente en su PC.

editar
Si la idea es dejar que el código viaje con el controlador para que pueda llevarlo a otras PC, entonces también usaría la idea de Fake: en lugar de enviar la idea del programa, podría purgar la fuente completa de esa manera.
Tenga en cuenta que todavía no estoy completamente convencido. A excepción de los programas más simples, el diseño de un programa es más que solo el código fuente. ¿Qué pasa con los diagramas de flujo u otros documentos de diseño?

¡Me gusta el método de extracción de pines! La idea detrás de mi pregunta es resolver el problema en caso de que mi PC no esté disponible.
¿A qué vas con el código C si tu PC no está disponible? y tu como lo vas a leer??
@jippie Puede almacenar su código en un repositorio de código de fuente en línea ( github o incluso Dropbox), si desea tener acceso a su código en otras PC que no sean la suya.
No quiero depender de sitios web, discos o impresiones. Tengo un AVR y quiero poder pasárselo a otra persona. Si esta persona tiene ganas de revisar o mejorar el código, simplemente puede leerlo desde el dispositivo.
Un ejemplo más relevante es ¿qué pasa si le das el IC a alguien sin conexión a Internet? Hacer que el dispositivo sea capaz de describir su propio código es una idea genial. Es como el equivalente en hardware de un Quine
@jippie: puede combinar la idea de stevenvh de un pin de prueba y su idea de incrustar el código en flash, y hacer que enumere el código cuando tira de un pin de prueba bajo o alto. Eso tendría la ventaja de facilitar la obtención del contenido del código.
De acuerdo, pero ¿cómo adjunto el código fuente como datos al programa?
@jippie: cree una matriz de caracteres y complete cada elemento con un carácter de su código fuente. Deberá escribir un programa para convertir el código fuente de 10k en asignaciones de 10 000 caracteres. Agregado a mi respuesta.
No olvide evitar que su incluidor de código fuente se repita. :)
@JRobert: correcto, pero si quiere volcar la tabla a UART en el sistema, tendrá que incluir una tabla ficticia; de lo contrario, no puede hacer referencia a ella.
Tal vez mi pregunta sea tan simple como '¿Cómo puedo adjuntar un archivo de datos a mi programa C, de tal manera que el archivo de datos se incluya en el binario final?'
'¡Definitivamente querrás escribir un programa para crear la matriz a partir de un archivo de texto!' Ya existe:xxd -i
@jippie Como sugiere la gente, la mejor manera de hacerlo es generar un archivo fuente C como parte de su proceso de compilación. Sin embargo, realmente desea comprimir la fuente primero, e incluso entonces consumirá una gran parte de su memoria, más que el código compilado.
Aceptaré tu respuesta ya que me llevó a descubrir cómo hacerlo. Creo que es injusto aceptar mi propia pregunta con tanto esfuerzo.

Encontré una pregunta similar aquí . Parece que no funciona para mí porque el archivo que estoy tratando de incluir tiene comillas dobles y simples. Funciona si se usa con un archivo MAKE, pero el IDE de Arduino no. Sin embargo, funciona para la programación desde la línea de comandos.

Combina el:

$ echo hello world | xxd -i > xxd.txt

xxd.txt contiene:

  0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x0a

o

$ cat blinker.ccp | xxd -i > xxd.txt

Luego inclúyelo de la siguiente manera:

const char text[] = {
#include "xxd.txt"
};

Solo necesita llamarlo desde el programa en algún lugar de una impresión más o menos, de lo contrario, los datos se optimizarán.