Nicht angemeldet. · Kennwort vergessen · Registrieren

Mosha
Mitglied seit 10/2010
19 Beiträge
Betreff: "Initialisierungselement ist nicht konstant"
#define PORTD (*(volatile uint8_t*)(0x12))
static volatile uint8_t    array_PORT[] = {PORTD};

-->  hier bringt mit der Compiler die Meldung  "Initialisierungselement ist nicht konstant"
(mir ist bekannt, dass man anscheinend keine globalen Variablen mit anderen Variablen initialisieren darf);

bei

static volatile uint8_t* array_PORT[] = {(volatile uint8_t*)(0x12)}
nicht

Ich dachte, der Präprozessor ist reine Textverarbeitung und ersetzt mir die Ausdrücke automatisch vor dem Compilen.
Offenbar merkt das mein Compiler nicht und meckert rum. So ist es natürlich sau unschön, diese Arrays anzulegen.
Woran kann das liegen?

Ich benutze gcc unter Linux mit dem originalen Makefile. Muss man da irgendwelche Optimierungsflags entfernen?


Danke für jede Hilfe,
mfg, Markus
morty
SPiC-Meister
(Moderator)
Mitglied seit 05/2011
331 Beiträge
Zitat von Mosha:
#define PORTD (*(volatile uint8_t*)(0x12))
static volatile uint8_t    array_PORT[] = {PORTD};
Ich dachte, der Präprozessor ist reine Textverarbeitung und ersetzt mir die Ausdrücke automatisch vor dem Compilen.
Offenbar merkt das mein Compiler nicht und meckert rum. So ist es natürlich sau unschön, diese Arrays anzulegen.
Woran kann das liegen?


Ja, die Textersetzung ist das Problem, denn da kommt
  1. #define PORTD (*(volatile uint8_t*)(0x12))
  2. static volatile uint8_t    array_PORT[] = {(*(volatile uint8_t*)(0x12))};
raus.
Während
  1. #define PORTD (*(volatile uint8_t*)(0x12))
  2. static volatile uint8_t    array_PORT[] = {(volatile uint8_t*)(0x12)};
selbstverständlich funktioniert.
Mosha
Mitglied seit 10/2010
19 Beiträge
aber wieso? Im oberen Fall hab ich ein uint8_t array[] und PORTD steht ja für einen dereferenzierten uint8_t-Pointer, müsste Datentyptechnisch also hinhauen

im unteren Fall hab ich ja ein uint8_t *array[] und in klammern hab ich die dereferenzierung weggelassen.
Datentyptechnisch also eigtl. auch ok.

Der compiler meckert ja nicht wegen Datentypen, sondern wegen den nicht konstanten Ausdrücken.

Schreibe ich im oberen fall statt PORTD (*(volatile uint8_t*)(0x12)) manuell rein, geht's auch.


echt verzwickt die Sache.

mfg,
Markus


Nachtrag:

#define PORTD ((volatile uint8_t*)(0x12))
static volatile uint8_t    *array_PORT[] = {PORTD};

so gehts.

#define PORTD (*(volatile uint8_t*)(0x12))
static volatile uint8_t    array_PORT[] = {PORTD};

so nicht. :D

egal
Dieser Beitrag wurde am 18.06.2011, 22:12 von Mosha verändert.
sicherha
Informatik-Veteran
Mitglied seit 10/2010
53 Beiträge
Zitat von Mosha:
#define PORTD ((volatile uint8_t*)(0x12))
static volatile uint8_t    *array_PORT[] = {PORTD};
so gehts.
Hier definierst du PORTD als eine Speicheradresse. Die Adresse ist konstant 0x12, deswegen funktioniert es.

Zitat von Mosha:
#define PORTD (*(volatile uint8_t*)(0x12))
static volatile uint8_t    array_PORT[] = {PORTD};
so nicht. :D
Durch den Sternchen-Operator vorne ("Dereferenzierung") wird auf das Datenbyte zugegriffen, das an der konstanten Adresse 0x12 liegt. Die Adresse selber ist konstant - der Wert, der an dieser Stelle steht, aber nicht [1]! Deswegen mault der Compiler.

[1] Warum kann der gar nicht konstant sein? - Na klar, weil sich dahinter ein Port-Register befindet!
Schließen Kleiner – Größer + Auf diesen Beitrag antworten:
Prüfcode: VeriCode Gib bitte das Wort aus dem Bild ins folgende Textfeld ein. (Nur die Buchstaben eingeben, Kleinschreibung ist in Ordnung.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Weitere Zeichen:
Gehe zu Forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen