Guten Abend :)
Ich steh grad vor einem etwas verzwickten Problem. Es geht um Filter
Koeffizienten die mit einer Software von Texas Instruments erzeugt
werden und als Textdatei mit Hexwerten gespeichert werden kann.
Nun ist es so dass ich die Hexwerte über I2C in den IC schreibe. Das
funktioniert soweit als mehrdimensionales Array. Die Formatierung dabei
ist leider etwas anders als das was mir TI ausgibt. Somit muss ich
leider bei jeder Änderung händisch die Hex Werte vom TI Array ins Array
im Atmel Studio umwandeln um es dann kompilieren zu können.
Gibt es da keine andere Möglichkeit? Kann ich die TI Textdatei nicht im
AVR Quellcode includen (trotz der anderen Formatierung)?
Das hier kommt beispielsweise aus der TI Software:
Man könnte sich natürlich auf dem PC ein C-Programm schreiben, welches
die Umformatierung macht.
Aber eigentlich gibt es dafür Werkzeuge die man Stream-Editoren nennt.
sed ist ein Beispiel dafür.
Mit 'awk' müsste die Manipulation ebenfalls möglich sein.
Auch Makro-fähige Editoren können derartige Umformatierungen direkt im
Editor machen. Man zeigt dem Editor einmal bei der Erstellung des
Makros, was er zu tun hat und speichert sich das dann als Makro ab, so
dass der Editor die Schritte auf Tastendruck wiederholt.
Such dir was aus und gewöhn dich daran, dass man im professionellen
Umfeld schon auch mal 'Zuliefer'-Programme braucht, die irgendwelche
Outputs syntaxmässig für den C-Compiler aufbereiten. Es schadet daher
nicht, wenn man da ein paar Techniken kennt und anwenden kann.
Ui danke für die Antworten. Das klingt schon mal nicht schlecht.
AWK ist ja eine Skriptsprache, aber in welchem Editor kann ich die
anwenden?
Ich dachte eher an eine Art Befehl oder Skript in der AVR Toolchain,
sodass ich die TI Datei im Header include und mir beim kompilieren die
Toolchain die Formatierung anpasst.
sed kannst du bspw. direkt aus dem makefile heraus aufrufen, und sed
sollte das können. Unter Windows gibt es sed auch, oder eben
vergleichbare Programme.
Dicker Nachteil: wenn du noch nie mit RegEx zu tun hattest ist die
Einarbeitung nicht ganz trivial.
Da ist es evtl. einfacher, eben ein C-Programm zu schreiben, was dir als
erstes und vorletztes Zeichen jeder Zeile eine Klammer in den String
schiebt.
Langfristig wirst du davon profitieren, dich mit sed & Konsorten zu
beschäftigen. Denn vergleichbare Probleme werden mit Sicherheit wieder
auftauchen.
Borsty Bürste schrieb:> Ui danke für die Antworten. Das klingt schon mal nicht schlecht.>> AWK ist ja eine Skriptsprache, aber in welchem Editor kann ich die> anwenden?
Gar nicht.
awk ist ein externes Programm, so wie auch der Compiler ein externes
Progamm ist.
Und so wie der Compiler aufgerufen wird, um aus einer Eingabedatei eine
Ausgabedatei zu erzeugen, genauso wird auch awk (oder sed) aufgerufen um
aus einer Eingabedatei eine Ausgabedatei zu machen.
> Ich dachte eher an eine Art Befehl oder Skript in der AVR Toolchain,> sodass ich die TI Datei im Header include und mir beim kompilieren die> Toolchain die Formatierung anpasst.
Die kommt ins makefile rein.
Was macht denn make: make vergleicht das Datum einer Zieldatei mit dem
Datum einer (oder mehrerer) Quelldateie(en). Ist eine der QUelldateien
jünger, dann wird ein Kommando ausgeführt, welches dann (hoffentlich)
die Zieldatei aus den QUelldateien neu erzeugt.
D.h. die Strategie ist es, dass du
* eine Datei hast, die dir von den TI-Tools erzeugt wird
* von dieser Datei erzeugst du dir mit einem Tool deiner Wahl (awk, sed,
eigenes Programm) eine weitere Datei, ....
* ... die dann im C Code inkludiert wird.
im makefile musst du dann nur noch den Schritt einbauen, dass es eine
Abhängigkeit deiner Include-Datei von der TI-Datei gibt, und der Schritt
um diese Include Datei von der TI Datei zu erzeugen erfolgt, indem man
Kommando xyz ausführt.
Der Aufbau eines Makefiles ist generell im einfachsten Fall so
1
Ziel: Quelle
2
Kommando
(AChtung: Die Zeile mit dem Kommando muss mit einem Tabulator beginnen!
Hast du dir also ein C-Programm geschrieben und compiliert/gelinkt,
welches die Textformatierung macht und das dann zb. Convert.exe heisst
und von der Kommandline 2 Argumente übernimmt, nämlich die Dateinamen
der beteiligten Dateien, dann ist im makefile enthalten:
1
data.inc: data.dat
2
convert data.dat data.inc
(Annahme: die Datei con den TI-Tools heisst data.dat, du hingegen
inkludierst ein data.inc in deinen C-Code).
Jedesmal wenn data.dat neuer ist als data.inc, wird von make dein
Programm convert.exe gestartet (dazu muss es natürlich erreichbar sein)
und dieses macht dann die Textmanipulation um aus data.dat (dem ersten
Kommand-Line Argument) die data.inc, die dann in weiterer Folge beim
eigentlichen Compilieren deines C-Source Codes per #include verwendet
wird. Dazu wird man data.inc sinnvollerweise natürlich in die
Abhängigkeiten dieses C-Source Files mit aufnehmen, damit data.inc aus
data.dat erzeugt wird, ehe es dann in der C-Datei verwendet wird.
Im regulären Developerstudio kann man das ganze ebenfalls regeln. Ob
Atmel diese Fähigkeit ins Atmel-Studio mit übernommen hat, kann ich
nicht sagen. Das lässt sich aber leicht rausfinden, indem man einfach
mal die Datei data.inc bzw. data.dat mit ins Projekt aufnimmt und bei
den Eigenschaften nachsieht, ob man da eine Abhängigkeit bzw. ein
zugehöriges erzeugendes Kommando dafür angeben kann. Das Dev-Studio
macht ja auch nichts anderes als make, indem es Dateien, deren
Abhängigkeiten und die zur Generierung erforderlichen Kommandos
verwaltet. Und das ist ja eigentlich ein recht generischer Mechanismus,
der für viele Zwecke in einem Projekt benutzt werden kann, solange es
nur 2 Dateien gibt, die voneinander abhängen und ein Programm welches
das eine aus dem anderen erzeugt.
Wie Haro schon sagte:
beschäftige dich damit. Das sind Standardaufgaben, die einem Entwickler
keine Probleme bereiten dürfen. Jeder Entwickler muss (in meinen Augen)
in der Lage sein, sich bei Bedarf eigene Tools quick&dirty schnell
selbst zu machen (oder mit einem mächtigen Werkzeug wie awk, sed, coco,
flex, bison, xslt, ... umgehen können) und er muss auch wissen, wie er
diese Tools in seine Entwicklungsumgebung integrieren kann. Was dir
natürlich jetzt ans Bein pinkelt, das ist das du wahrscheinlich nie
gelernt hast, mit einer Command Line umzugehen. Von daher ist dir der
Gedanke, dass es ausführbare Kommandos mit Argumenten, die nichts
anderes als Programme sind und von einer Command-Line nach bestimmten
Regeln in diversen Pfaden gesucht werden völlig fremd. Das ist dann halt
die Krux in den Klicki-Bunti Betriebssystemen.
Karl Heinz schrieb:> beschäftige dich damit. Das sind Standardaufgaben, die einem Entwickler> keine Probleme bereiten dürfen.
... hab ich soeben gemacht ...
Karl Heinz schrieb:> Was dir> natürlich jetzt ans Bein pinkelt, das ist das du wahrscheinlich nie> gelernt hast, mit einer Command Line umzugehen. Von daher ist dir der> Gedanke, dass es ausführbare Kommandos mit Argumenten, die nichts> anderes als Programme sind und von einer Command-Line nach bestimmten> Regeln in diversen Pfaden gesucht werden völlig fremd.
na zum Glück hab ich als Serveradmin dann doch einen Funken Ahnung von
Command Lines :)
Hab mich grad mal hingesetzt und versucht mich in awk einzuarbeiten.
Nach ein wenig rumgebastel schaff ich es schon mal folgenden Input
Bisschen tricky dabei sind die "\ um das \n herum (wie heißen die
Dinger?)
Also das hilft mir schon unheimlich weiter. Ich bastle mir jetzt noch
eine Batchdatei und kann dann schon mal auf Knopfdruck umwandeln. Werd
mir das mit dem Makefile wie oben beschrieben aber auch noch ansehen.
Vielen vielen lieben Dank auf jeden Fall schon mal für eure super
Unterstützung :)
Karl Heinz schrieb:> oder mit einem mächtigen Werkzeug wie awk, sed, coco,> flex, bison, xslt, ... umgehen können
Was ist denn "coco" bzw. gibt es einen Link dazu? - Hab im Internet dazu
nichts gefunden, außer wenn damit "COCO - the CAPE-OPEN to CAPE-OPEN
simulator" gemeint ist.
mar IO schrieb:> Karl Heinz schrieb:>> oder mit einem mächtigen Werkzeug wie awk, sed, coco,>> flex, bison, xslt, ... umgehen können>> Was ist denn "coco" bzw. gibt es einen Link dazu?
coco ist mein Leib und Magen 'Compiler Compiler', der an meiner Alma
Mater (nicht von mir) entwickelt wurde.
Der ist mir lieber als das Gespann flex/bison, weil er in der Version
die ich benutze einen rekursiven Abstieg erzeugt, der bei
Syntaxproblemen einfacher zu debuggen ist als der Tabellenansatz.
Borsty Bürste schrieb:> na zum Glück hab ich als Serveradmin dann doch einen Funken Ahnung von> Command Lines :)
Na, umso besser!
Mit den Techniken, die du dir da jetzt aneignest, kannst du auch in
Zukunft noch viel anfangen.
Insbesondere 'make' wird noch zu deinem Lieblingstool werden. Sagt ja
keiner, dass man make nur zum compilieren benutzen darf. make kann alles
was sich auf die einfache 'Formel' "Welches File hängt von welchem
anderen File ab und wie erzeuge ich es mit welchem Programm" bearbeiten.
Ob das jetzt C-Source Code oder das automatische Bearbeiten von Photos
ist, ist dem make wieder wurscht.
Guten Abend,
ich hab mich jetzt mal hingesetzt und das Makefile so abgeändert dass
die convert.bat aufgerufen wird.
Zu Beginn einfach mit:
1
all:
2
convert.bat
Dann hab ich in meinem AVR Studio Projekt angegeben dass ich das externe
Makefile verwenden möchte und beim kompilieren hat er mir doch
tatsächlich die passende Datei erzeugt. Zauberei! Wahnsinn! :)
Jetzt kommts aber :) Hat man die Datei im AVR Studio bereits geöffnet
kommt (verständlicherweise) eine Meldung dass die Datei außerhalb des
Studios modifiziert wurde und dass man diese neuladen müsste. Macht man
das hängt sich das Studio auf und man kann es mit der Begründung dass
ein modaler Dialog geöffnet sei nicht schließen. Hier hilft nur noch der
TaskManager. Meine erste Vermutung war dass die convert.bat noch im
Hintergrund läuft. Diese wird aber sauber nach Ausführung beendet (sieht
man ebenfalls im Taskmanager bei den Prozessen).
Wenn man den Dateiconvert außerhalb vom Makefile (also manuell) erledigt
passt alles. Es kommt zwar auch die Meldung dass die Datei außerhalb
bearbeitet wurde aber das Studio ist weiterhin verwendbar.
Für mich reicht das jetzt erstmal so. Muss ich halt bei einer Änderung
der Werte die Bat-Datei ausführen. So oder so eine riesen Erleichterung.
Eine Frage hab ich noch: Es handelt sich bei der Datei um ein Array,
gefüllt mir werten. Eigentlich ist das doch dann keine .h Datei, oder?
In .h sind ja nur Deklarationen drin. Da ich aber im AVR Studio nur .h
importieren kann bleibt mir ja nichts anderes übrig. Wie macht man das
sauber?
Gruß