Forum: Compiler & IDEs Compiler Quellcode schreiben lassen / bessere Lösung?


von Malte Marwedel (Gast)


Lesenswert?

In meinem Quellcode gibt es eine Konstante.
#define maxweck 10
Je nachdem welchen Wert diese hat, wird im EEPROM eine bestimmte Menge
Speicher benötigt und der soll mit bestimmten Werten voreingestellt
sein.
Wenn maxweck eins ist soll es lauten:
u08 weckzeiten[] _attribute_ ((section (".eeprom"))) =
{6,30,0xff,0};
Wenn maxweck zwei ist soll der Quelltext lauten:
u08 weckzeiten[] _attribute_ ((section (".eeprom"))) =
{6,30,0xff,0,6,30,0xff,0};
bei maxweck gleich drei dann:
u08 weckzeiten[] _attribute_ ((section (".eeprom"))) =
{6,30,0xff,0,6,30,0xff,0,6,30,0xff,0};
u.s.w.
maxweck darf einen Wert von 1 bis 60 haben.

Wie bringe ich den Compiler (gcc) dazu, basierent auf dem Wert von
maxweck automatisch die richtigen Werte ins EEPROM zu schreiben?

von Jörg Wunsch (Gast)


Lesenswert?

Da Du vermutlich nicht unbedingt 60 verschiedene #ifdefs haben willst
und der C-Präprozessor keine Schleifen versteht, kommst Du wohl
besser, wenn Du die Quelldatei für den EEPROM-Inhalt einfach separat
von einem anderen Tool erzeugen läßt.  Perl oder awk würden sich für
sowas anbieten.  Das Ganze baust Du dann (einschließlich der globalen
Definition für MAXWECK, die Du per -D an den Compiler übergeben lassen
kannst) in Dein Makefile ein.

MAXWECK= 3

CFLAGS+= -DMAXWECK=$(MAXWECK)

eeprom.c: force
  awk 'print "uint8_t weckzeiten[]";\
       print "__attribute__((section(".eeprom"))) = {";\
       for (i=0;i<$(MAXWECK);i++) {print "6,30,0xff,0,"};\
       print "};"' > eeprom.c

.PHONY: force
force:

von OldBug (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen!

Hab mir, bevor Jörg geantwortet hat, auch mal Gedanken dazu gemacht.
Ich hab überlegt, ob man nicht eine Struct verwenden könnte, aber das
Problem liegt wohl darin, die Einzelnen Elemente jeder Struct zu
Initialisieren.
Mein Beispiel im Anhang.

Gruß,
Patrick...

von Malte Marwedel (Gast)


Lesenswert?

Dass der Präprozessor keine Schleifen kann wusste ich nicht :-|
Also wenn ich u08 weckzeiten[4*maxweck] schreibe wird schon mal die
richtige Menge Speicher belegt. Wenn ich danach zu viele Werte stehen
habe scheinen die Überschüssigen einfach weg zufallen. Allerdings gibt
mir dann gcc (berechtigterweise) für jede überflüssige Zahl eine
Warnung aus. Habe ich zu wenige stehen werden sie einfach als Null ins
EEProm geschrieben.
Eventuell werde ich dafür sorgen, dass der AVR nach einer
Neuprogrammierung selber die nötigen Werte ins EEProm schreibt.


@Old Bug:
Hab ich das mit der Struct richtig verstanden, dass man auch schreiben
könnte?

struct
sWakeUpJob
{
  unsigned char a;
  unsigned char b;
  unsigned char c;
  unsigned char d;
};
typedef struct sWakeUpJob tWakeUpJob

von OldBug (Gast)


Lesenswert?

Ja...

Gruß,
Patrick...

von OldBug (Gast)


Lesenswert?

Hm, ich seh grad, daß sich durch das rumprobieren da ein kleiner aber
schlimmer Fehler eingeschlichen hat ;-)

Die Zeile, in der "wecker" deklariert und initialisiert wird, muss
natürlich "weckzeiten" anstatt "wecker" deklarieren.

Gruß,
Patrick...

von OldBug (Gast)


Lesenswert?

static tWakeUpJob weckzeiten[MAXWECK] = {6, 30, 0xff, 0};

So, jetzt aber!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.