Compiler Quellcode schreiben lassen / bessere Lösung?

Gast #99985
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?
Gast #99986
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:
Gast #99987
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...
Angehängte Dateien:
Gast #99988
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
Gast #99990
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...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren