Forum: Compiler & IDEs Lookup-Table


von mr.chip (Gast)


Lesenswert?

Hallo

Ich brauche für ein Projekt eine grössere Lookup-Table, sie beinhaltet
Punkte auf verschieden grossen Kreisen. Es sind ca. 360 Bytes, die ich
bevorzugt im Flash ablegen möchte.

Nun dachte ich daran, diese Lookup-Table vom Präprozessor berechnen zu
lassen, z.B. indem ein Array berechnet wird. Dazu brauche ich aber eine
Schleife - geht sowas mit dem C-Präprozessor? Oder wie könnte man das
Problem mit der Lookup-Table alternativ lösen?

Gruss

Michael

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> Dazu brauche ich aber eine
> Schleife - geht sowas mit dem C-Präprozessor?

Nein, das kann er nicht.

Der m4-Makroprozessor kann sowas, aber er ist, ähem, sehr
gewöhnungsbedürftig.

Ich würde eine Scriptsprache bevorzugen und mit dieser die
Datei generieren.  WinAVR bringt zum Beispiel einen awk mit
(heißt dort "gawk"), damit ließe sich das bestimmt machen.

von mr.chip (Gast)


Lesenswert?

> Ich würde eine Scriptsprache bevorzugen und mit dieser die
> Datei generieren.

Das ist natürlich auch eine gute Möglichkeit. Würdest du damit einfach
C-Klartext erstellen:

const uint8_t pgmFooByteArray1[] PROGMEM = {.......};

oder könnte man das ganze auch in eine separate Datei ausgeben, die
dann irgendwie eingebunden wird? (Abgesehen jetzt vom einbinden mit
include)

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Klartext erstellen ist am einfachsten. Ich verwende z.B. folgendes um
eine Sinus-Tabelle von 0 bis pi/2 zu berechnen:

const unsigned char sinus[] = {

<%= (0..20).map {|x| (Math.sin(x * Math::PI/40) * 255).round }.join(',
') %>

}

Das ganze durch "erb" (embedded Ruby) geschickt und in eine eigene
Headerdatei sinus.h gepipet, die dann so aussieht:

const unsigned char sinus[] = {

0, 20, 40, 60, 79, 98, 116, 133, 150, 166, 180, 194, 206, 217, 227,
236, 243, 248, 252, 254, 255

}

Lässt sich wunderbar ins Makefile integrieren, und geht natürlich auch
mit awk, PHP, Perl etc.

von mr.chip (Gast)


Lesenswert?

@Andreas: Klingt sinnvoll, werde das dann wohl so machen! Mal das awk
von WinAVR anschauen...

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Wenn du uns sagst, was in die Tabelle rein soll, kann ich dir
die paar Zeilen awk bestimmt auch posten.

von Karl H. (kbuchegg)


Lesenswert?

Übrigens.

Du kannst durchaus auch folgendes machen:

const unsigned char sinus[] = {
#include "Werte.txt"
}

und in Werte.txt stehen dann nur deine Werte

0,
20,
40,
60,
79,
98, 116,
133, 150,
166, 180, 194, 206, 217, 227,
236, 243, 248, 252, 254, 255

#include ersetzt lediglich die Zeile mit dem #include durch
den Inhalt der angegebenen Datei. Was in der Datei steht,
interessiert den Präprozessor nicht wenn er den #include
durchführt.

von mr.chip (Gast)


Lesenswert?

> Wenn du uns sagst, was in die Tabelle rein soll, kann ich dir
> die paar Zeilen awk bestimmt auch posten.

Danke für das Angebot! Aber ich denke mal, ich werde es zuerst selbst
versuchen.

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.