¿Cómo evitar que MPLABX y XC16 contaminen mi programa de ensamblaje en PIC24 de 16 bits?

2

Recientemente comencé a programar microcontroladores PIC después de AVR y escribí un pequeño programa para no hacer nada solo para ver lo que produce el ensamblador en el archivo HEX :

;File:  main.s

.include    "p24FJ64GA202.inc"
.global     __reset
.global     __INT1Interrupt
.text

__reset:
    nop
    goto    infinite

__INT1Interrupt:
    nop
    retfie

infinite:
    nop
    nop
    nop
    bra     infinite

.end

Después de construir y desensamblar , encontré que el ensamblador coloca estos bloques innecesarios en mi código, que no escribí:

y

¿Cómo puedo evitar que esto suceda?

    
pregunta Gábor Dani

2 respuestas

5

Esas rutinas forman parte de crt0 , las rutinas de inicialización del sistema. Son rutinas estándar. Brevemente ellos:

  • Borre la memoria vacía a un valor predeterminado de 0 en todo
  • Copie los datos predefinidos de Flash en la RAM

Sin esas rutinas, el sistema C básico no funcionará. Se requieren para cualquier programa escrito en C.

Sé que tu programa no está escrito en C, pero todo el entorno es C. Estás utilizando un compilador de C, por ejemplo.

Por eso obtienes las rutinas de C.

Puedes intentar agregar la opción de vinculador -nostartfiles para evitar la inclusión de crt0 . También puede usar -nostdlib y -nodefaultlibs para evitar la inclusión de funciones de biblioteca estándar.

Tenga en cuenta que esto interrumpirá completamente la compilación de cualquier archivo C.

Como alternativa, puede mantener los archivos de inicio allí y, en lugar de ejecutar su programa a partir del vector de reinicio, defina una función "principal" en el ensamblaje que el crt0 llamará después del sistema. La inicialización ha tenido lugar.

Por cierto, XC16 se basa en GCC 4.5.1.

    
respondido por el Majenko
2

Comprueba tus opciones de enlazador. Probablemente tengas la construcción del proyecto configurado asumiendo que C será usado. Estas rutinas se ejecutan en el inicio para inicializar la biblioteca de tiempo de ejecución de C. Si no está utilizando C, no los necesita y, de hecho, son un desperdicio de recursos. Si define __ RESET, las rutinas no se ejecutarán de todos modos.

Este es un inconveniente de usar un IDE para la construcción. Puede haber varios valores predeterminados para las elecciones que ni siquiera sabía que estaba haciendo. Investigue a través del IDE para ver cómo configurar todas las opciones de compilación para código de ensamblaje puro, o compile el proyecto fuera del IDE donde controla exactamente lo que sucede en cada línea de comando. Lo último es lo que siempre hago, en parte porque ejecuto otras herramientas como parte del proceso de compilación que MPLAB no conoce, incluido el preprocesador de mi ensamblador. También hace posible construir todas las cosas relacionadas con un proyecto en particular, no solo el firmware PIC, como una operación por lotes.

    
respondido por el Olin Lathrop

Lea otras preguntas en las etiquetas