PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 2 Fragen zu C/AVR-GCC



gnarr
26.01.2007, 10:25
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. :-)

Felix G
26.01.2007, 10:58
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)"

SprinterSB
26.01.2007, 13:05
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, ...)

#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)

#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

#include "module.h"

func()
{
// Verwenden von Makros, Funktionen, Typen, Objekten aus module
}

carlos_soost
26.01.2007, 13:42
oder du übergibst einfach die variable als parameter.

void blub(char x);

und dann einfach mit

blub(test);

aufrufen.

gnarr
26.01.2007, 17:27
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. ;- )