Initialisieren von variablen mit PIC mcu's



  • Hallo ich muss mal wieder die "C" Nerd's nerven
    Ich programmiere Microchip Mcu's mit xc8 8bit ich konnte, meine variablen
    im header so konfigurieren.

    like
    int _4ms =4;

    nun bin ich auf 32 bit PIC32 umgestiegen der gleich compiler ccc nur mit 32bit

    nun muss ich
    extern int _40us ;

    in den Header schreiben

    und

    int _40us = 40 im
    xxx.c file;

    Kann mir das jemand erklären

    Ich habe just for fun eine Test Var im Header angelegt
    mit der Compiler Meldung.
    c:/microchip/harmony/v1_07_01/framework/driver/tmr/drv_tmr_compatibility.h:96: multiple definition of Test' build/default/production/\_ext/977502197/drv\_spi\_tasks.o:c:/microchip/harmony/v1\_07\_01/apps/mulitimerapp/firmware/src/system\_config/default/framework/driver/spi/dynamic/drv\_spi\_tasks.c:52: first defined here build/default/production/\_ext/1271179505/sys\_devcon.o: In functionSYS_DEVCON_TraceDisable':
    c:/microchip/harmony/v1_07_01/framework/system/devcon/src/sys_devcon.c:104: multiple definition of `Test'



  • Jede .c Datei wird für sich seperat übersetzt. Davor werden noch die mit #include angegebenen Dateien eingesetzt.
    Die fertig überstzten Dateien (Objektdateien, .o oder .obj) werden dann vom Linker zum ausführbaren Programm/Bibliothek gebunden.

    Wenn du jetzt deinen Header in mehreren .c einbindest, wird jedesmal eine neue Variable (mit demselben Namen) definiert.

    Der Linker hat jetzt Probleme, weil er nicht weiß, welche Variable gemeint ist.

    Definitionen (Variablen und Funktionen) gehören in die .c
    Deklarationen gehören in den Header.
    (War schon immer so)



  • foo.h

    int foo = 42;
    

    foo.c

    #include "foo.h"
    

    bar.c

    #include "foo.h"
    

    führt dazu, daß foo in den Übersetzungseinheiten foo.c und bar.c definiert sind. Damit ist die One Definition Rule verletzt.

    ➡

    foo.h

    extern int foo;
    

    foo.c

    #include "foo.h"
    
    int foo = 42
    

    bar.c

    #include "foo.h"
    

    foo ist nur in der Übersetzungseinheit foo.c definiert. --> Alles gut.



  • Ich danke Euch 👍
    Gut werde ich nie in "C" aber es macht die Sache einfacher mit MCU'S 🤡
    Danke


Anmelden zum Antworten