-         

Ergebnis 1 bis 5 von 5

Thema: 2 Fragen zu C/AVR-GCC

  1. #1
    Neuer Benutzer
    Registriert seit
    09.11.2006
    Ort
    Wien
    Beiträge
    2

    2 Fragen zu C/AVR-GCC

    Anzeige

    Hi!

    Wie der Titel schon sagt, habe ich 2 kurze Fragen zu C, bzw. AVR-GCC die mir zur Zeit etwas Kopfzerbrechen bescheren.

    1) Wieso werden mit volatile definierte Variablen (welche im sourcefile main.c deklariert wurden) in anderen sourcefiles, die Unterprogramme aus main beinhalten, nicht erkannt?
    Bsp:
    Sourcefile main.c beinhaltet Variablendeklaration

    volatile uint8_t test;

    int main(void){

    blub();
    }

    Sourcefile blub.c beinhaltet Unterprogramm:

    void source(void){

    test = 5;
    }

    Ich erhalte nun eine Fehlermeldung, dass die Variable test nicht deklariert sei. Die Variable ist übrigens als volatile deklariert, da ich sie in einer ISR verwende und anschließend zusätzlich noch in anderen Unterprogrammen auf sie zugreife. Natürlich kann ich alle Unterprogramme auch in einem Sourcefile schreiben, allerdings hatte ich eigentlich vor, mein Programm auf mehrere Sourcefiles zwecks Übersicht aufzuteilen.
    Wenn ich die Variable übrigens im Sourcefile erneut deklariere, kann AVRStudio 4 keine .elf Datei erstellen und ich erhalte Warnings aufgrund einer multiple deklaration.



    2) Gibt es einen bestimmten Grund, wieso für das Setzen von Bits die Maskierung (Register |= (1<<Bit)) und zum Löschen (Register &= ~(1<<Bit)) verwendet wird - allerdings in keinem Tutorial das Löschen
    von Bits unter Verwendung dieser Maksierung erwähnt ist: (Register |= (0<<Bit)) ?

    Danke schonmal im Voraus.

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Felix G
    Registriert seit
    29.06.2004
    Ort
    49°32'N 8°40'E
    Alter
    34
    Beiträge
    1.780
    1) schreib das mal in deine Sourcefiles: extern volatile uint8_t test;
    (edit: mit Ausnahme von main.c versteht sich)

    2) naja, überleg doch mal wie diese Ausdrücke binär aussehen...
    (1 << 5): 00100000
    ~(1 << 5): 11011111
    (0 << 5): 00000000

    genau aus diesem Grund macht man das nicht mit "Register |= (0<<Bit)"
    So viele Treppen und so wenig Zeit!

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.801
    Das übliche Vorgehen ist, daß man zu jedem Modul, das Funktionen/Objekte bringt, die in anderen Modulen verwendet werden, einen Header-File macht.

    In modul.c: (Implementierung+Instanziierung von globalen Funcs und Objekten, Modul-lokale typedefs, #define, ...)
    Code:
    #include "module.h"
    
    // lokal in module.c
    
    typedef ... local_t;
    
    #define MODULE_MACRO ....
    
    static type3_t bar_module(...);
    
    // global
    type1_t foo;
    
    type2_t bar (...)
    {
       ...
    }
    
    static type3_t bar_module(...)
    {
       ...
    }
    In modul.h: (Bekanntmachung, globale #defines, globale typedefs)
    Code:
    #ifndef _MODULE_H_
    #define _MODULE_H_
    
    typedef ... global_t;
    #define GLOBAL_MACRO ...
    
    extern type1_t foo;
    extern type2_t bar (...);
    
    #endif // _MODULE_H_
    In sonstwas.c
    Code:
    #include "module.h"
    
    func()
    {
       // Verwenden von Makros, Funktionen, Typen, Objekten aus module
    }
    Disclaimer: none. Sue me.

  4. #4
    Neuer Benutzer Öfters hier
    Registriert seit
    15.01.2007
    Ort
    Wolfsburg
    Alter
    36
    Beiträge
    23
    oder du übergibst einfach die variable als parameter.

    void blub(char x);

    und dann einfach mit

    blub(test);

    aufrufen.

  5. #5
    Neuer Benutzer
    Registriert seit
    09.11.2006
    Ort
    Wien
    Beiträge
    2
    Arr ja, das extern wars, was ich gesucht/übersehen habe. Danke für die schnellen Antworten! :- )

    An einen extra Header-File dachte ich auch bereits, hierfür also auf jeden Fall schonmal danke für die Anleitung. ;- )

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •