mikrocontroller.net

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


Autor: Malte Marwedel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

Autor: OldBug (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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...

Autor: Malte Marwedel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja...

Gruß,
Patrick...

Autor: OldBug (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: OldBug (Gast)
Datum:

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

So, jetzt aber!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.