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?
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:
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...
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.