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


von S. M. (smatlok)


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:
1
char shift_buchsbe(char buchstabe) {
2
   return buchstabe+1;
3
}
4
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..

von Sven P. (Gast)


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.

von S. M. (smatlok)


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ß

von Johnny (Gast)


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.

von Auweia (Gast)


Lesenswert?

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

durch das
1
#define shift_buchstabe(buchstabe) ((buchstabe) + 1)
2
3
char hui PROGMEM = shift_buchstabe('A');
zu ersetzten. Das kann dann auch der Preprozessor.

von Sven P. (Gast)


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ä.

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
Noch kein Account? Hier anmelden.