Mover el código y las ubicaciones de interrupción en Arduino

Necesito poder elegir entre dos aplicaciones Arduino que se ejecutan en un atmega 1280 (megaavr) en el momento del arranque. Por lo tanto, necesito mover una de esas aplicaciones a una ubicación diferente en la memoria del programa y también necesito mover las interrupciones a esa ubicación.

Ya tengo un método para ejecutar las interrupciones correctas (con la ayuda del gestor de arranque) en cualquier lugar de la memoria.

Sin embargo, no entiendo el proceso de compilación lo suficiente como para ver dónde decide el enlazador dónde colocar las cosas y cómo mover el programa y las secciones de interrupción a nuevas ubicaciones de memoria.

  • ¿Dónde se define la ubicación del vector de interrupción?
  • ¿Dónde se define la ubicación del programa?

Las compilaciones actuales se realizan con Arduino 22. Si bien preferiría modificar los scripts o archivos de compilación en ese entorno, si fuera necesario, consideraría moverlo todo a un proceso de compilación de archivos MAKE y fuera del entorno Arduino.

Respuestas (2)

Prefacio esta respuesta diciendo que nunca he intentado hacer esto. Dicho esto, Arduino es solo una capa encima de avr-libc / avr-gcc. Las preguntas frecuentes del manual del usuario explican cómo ubicar el código en una dirección fija, y creo que debería poder hacerlo de la misma manera en su código fuente de Arduino. El IDE de Arduino está escrito en Java y la fuente está disponible; puede modificar el archivo Compiler.java para agregar los indicadores necesarios al enlazador (es decir, -Wl, --section-start) para ubicar su código. Sin embargo , no recomendaría intentar ir por este camino.

Lo que sería mejor es intentar usar Eclipse como su IDE de Arduino (mucha información en la web sobre cómo hacer esto), podría establecer la configuración del enlazador allí como lo haría normalmente. Mucho más directo.

AVRGCC carga las interrupciones y el programa en la misma sección, con las interrupciones primero. La sección simplemente está etiquetada .text, por lo que solo se necesita enviar una bandera al compilador para mover tanto las interrupciones como el programa:

-Wl,--section-start=.text=0x10000 # Exactly 1/2 of a 128k device

Finalmente opté por una costumbre Makefile(hay una multitud de ejemplos de archivos makefile de arduino en Internet) en lugar de intentar hacer esto dentro de Arduino. Esto me permitirá personalizar aún más el proceso de construcción para otras partes del proyecto también.

No investigué más la secuencia de comandos del enlazador, pero sospecho que la sección de interrupción podría separarse de la .textsección con otra directiva de sección simple.