mikrocontroller.net

Forum: PC-Programmierung C Funktion schon beim compilieren ausführen


Autor: S. Matlok (smatlok)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich möchte per PROGMEM u.a. eine FAT Tabelle in den Flash des µC 
speichern.
Da ich einen FAT-Eintrag mit langen Dateinamen nicht einfach im Kopf 
zusammenbasteln kann, möchte ich eine C-Funktion schreiben, der ich nur 
den Dateinamen übergebe, und diese mir den fertigen FAT-Eintrag 
zurückgibt.(Der Dateiname wird öfter in jeder Codeversion geändert)

Natürlich sollte diese Funktion beim Compilen ausgeführt werden, und 
letzendlich natürlich einfach nur der fertige FAT-Eintrag in der 
hexfile/µC-flash gespeichert werden.

1.Wie stelle ich das an?

z.B. wird die Funktion int i = sin(3.14) ja normal automatisch 
wegrationalisiert und nur das Ergebnis verwendet. Kann ich mir sicher 
sein, das auch große komplexe Funktionen, welche keine variablen 
Parameter haben, immer sicher automatisch vor der Laufzeit berechnet 
werden ?

2.wie kann ich das Ergebnis z.B. per PROGMEM im Flash speichern ? 
PROGMEM will ja nur Konstanten, und der compiler gibt einen Fehler aus 
wenn ich z.b. das versuche:
char shift_buchsbe(char buchstabe) {
   return buchstabe+1;
}
char hui PROGMEM = shift_buchsbe('A');

error: initializer element is not constant


Oder kann ich gar auf Progmem verzichten, weil der Compiler erkennt, 
dass die Funktion einen Kontanten Wert zurückliefert und daher 
automatisch das Ergebnis (nämlich 'B') fest in den flash schreibt ?

Natürlich sind es bei meiner Anwendung später große Arrays, welche teils 
den RAM deutlich sprengen würden, falls das erst zur Laufzeit ausgeführt 
werden würde..

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
S. Matlok wrote:
> 1.Wie stelle ich das an?
So garnicht. Entweder missbrauchst du den Präprozessor dazu oder du 
schreibst ein Konstruktionsskript beispielsweise in Perl.

> z.B. wird die Funktion int i = sin(3.14) ja normal automatisch
> wegrationalisiert
Nicht unbedingt -- ganz der Compier.


> Kann ich mir sicher sein, das auch große komplexe Funktionen,
> welche keine variablen
> Parameter haben, immer sicher automatisch vor der Laufzeit berechnet
> werden ?
Nein.

> 2.wie kann ich das Ergebnis z.B. per PROGMEM im Flash speichern ?
S.o.

> Oder kann ich gar auf Progmem verzichten, weil der Compiler erkennt,
> dass die Funktion einen Kontanten Wert zurückliefert und daher
> automatisch das Ergebnis (nämlich 'B') fest in den flash schreibt ?
Nö.

> Natürlich sind es bei meiner Anwendung später große Arrays, welche teils
> den RAM deutlich sprengen würden, falls das erst zur Laufzeit ausgeführt
> werden würde..
Ich sag ja, schreib ein Perl- oder Bash-Skript dazu und mach dich nicht 
verrückt mit irgendwelchen abstrusen C-Konstruktionen.

Autor: S. Matlok (smatlok)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sven Pauli wrote:
> Ich sag ja, schreib ein Perl- oder Bash-Skript dazu und mach dich nicht
> verrückt mit irgendwelchen abstrusen C-Konstruktionen.

Ok, gut, dann schreib ich ne kleine extra consolen-app.

Hätte mich eben intressiert ob soeine "Funktionalität" mitm GCC möglich 
ist :-)
(Nicht zuletzt weil das Weitergeben des Projektes und Ändern der festen 
Dateinamen für andere Personen dann einfacher wäre..)

Thx und Gruß

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das auch mit einem Script lösen. Oder wenn Du nichts 
spezielles installieren willst, geht es sicher auch mit einer 
Batchdatei. Dieses könnte vor dem Compilieren automatisch von Make oder 
einer Batchdatei aufgerufen werden und z.B. ein C-File generieren.

Autor: Auweia (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Script ist da nicht nötig.
Es dürfte ja wohl kein Problem sein, das
char shift_buchstabe(char buchstabe) {
   return buchstabe+1;
}
char hui PROGMEM = shift_buchstabe('A');

durch das
#define shift_buchstabe(buchstabe) ((buchstabe) + 1)

char hui PROGMEM = shift_buchstabe('A');
zu ersetzten. Das kann dann auch der Preprozessor.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Da ich einen FAT-Eintrag mit langen Dateinamen nicht einfach im Kopf
>zusammenbasteln kann, möchte ich eine C-Funktion schreiben, der ich nur
>den Dateinamen übergebe, und diese mir den fertigen FAT-Eintrag
>zurückgibt.

Viel Spaß mit dem Prä.

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.