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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.