Forum: PC-Programmierung Wie am einfachsten Formatierung von Code ändern?


von Borsty B. (mantabernd)


Lesenswert?

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:
1
Q1
2
0x00, 0xA9, 0xE4, 0x4E,
3
0x0F, 0x1D, 0x41, 0x2B,
4
0x00, 0x56, 0x02, 0x95,
5
0x00, 0x9C, 0x44, 0x0E,
6
0x0F, 0xC6, 0x93, 0xE4
7
Q2
8
0x00, 0x80, 0x00, 0x00,
9
0x00, 0x00, 0x00, 0x00,
10
0x00, 0x00, 0x00, 0x00,
11
0x00, 0x00, 0x00, 0x00,
12
0x00, 0x00, 0x00, 0x00

und das wird von mir im AVR Studio kompiliert:
1
{0x53, 0x00, 0xA9, 0xE4, 0x4E},     
2
{0xFE, 0x0F, 0x1D, 0x41, 0x2B},
3
{0xFE, 0x00, 0x56, 0x02, 0x95},
4
{0xFE, 0x00, 0x9C, 0x44, 0x0E},
5
{0xFE, 0x0F, 0xC6, 0x93, 0xE4},
6
7
{0x54, 0x00, 0x80, 0x00, 0x00},    
8
{0xFE, 0x00, 0x00, 0x00, 0x00},
9
{0xFE, 0x00, 0x00, 0x00, 0x00},
10
{0xFE, 0x00, 0x00, 0x00, 0x00},
11
{0xFE, 0x00, 0x00, 0x00, 0x00},


Danke, Gruß
Borsty

: Verschoben durch User
von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von awk ist dein Freund (Gast)


Lesenswert?

Klassische Aufgabe für awk:
1
awk -F, \
2
 '
3
  BEGIN { i = 0 }
4
5
  NR % 6 == 1 { printf "\n"; next };
6
  NR % 6 == 2 { printf "{ 0x%02X, %s,%s,%s,%s },\n", i++, $1, $2, $3, $4; next }
7
              { printf "{ 0xFE, %s,%s,%s,%s },\n", $1, $2, $3, $4 }
8
 ' input.txt

PS: Das wäre im Forum PC-Programmierung besser aufgehoben.

von Karl H. (kbuchegg)


Lesenswert?

awk ist dein Freund schrieb:

> PS: Das wäre im Forum PC-Programmierung besser aufgehoben.

Jetzt wo dus sagst :-)

von Borsty B. (mantabernd)


Lesenswert?

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.

von ./. (Gast)


Lesenswert?

> sodass ich die TI Datei im Header include und mir beim kompilieren die
> Toolchain die Formatierung anpasst.

Sowas tut man dann ins Makefile.

von Haro (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von Borsty B. (mantabernd)


Lesenswert?

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
1
Q1
2
0x00, 0x7E, 0xAB, 0x87,
3
0x0F, 0x02, 0xA8, 0xF2,
4
0x00, 0x7E, 0xAB, 0x87,
5
0x00, 0xFD, 0x55, 0x46,
6
0x0F, 0x82, 0xA7, 0x2B
7
Q2
8
0x00, 0x80, 0x00, 0x00,
9
0x00, 0x00, 0x00, 0x00,
10
0x00, 0x00, 0x00, 0x00,
11
0x00, 0x00, 0x00, 0x00,
12
0x00, 0x00, 0x00, 0x00

in diesen Output zu verzaubern:
1
{0x00, 0x00, 0x7E, 0xAB, 0x87}
2
{0xFE, 0x0F, 0x02, 0xA8, 0xF2}
3
{0xFE, 0x00, 0x7E, 0xAB, 0x87}
4
{0xFE, 0x00, 0xFD, 0x55, 0x46}
5
{0xFE, 0x0F, 0x82, 0xA7, 0x2B}
6
7
{0x01, 0x00, 0x80, 0x00, 0x00}
8
{0xFE, 0x00, 0x00, 0x00, 0x00}
9
{0xFE, 0x00, 0x00, 0x00, 0x00}
10
{0xFE, 0x00, 0x00, 0x00, 0x00}
11
{0xFE, 0x00, 0x00, 0x00, 0x00}

Der Befehl dazu lautet:
1
C:\tmp>awk -F, " BEGIN {i=0} 
2
NR%6 == 1  {printf \""\n\""; next };
3
NR%6 == 2  {printf \"{0x%02X, %s,%s,%s,%s}"\n\"",i++,$1,$2,$3,$4; next}      
4
           {printf \"{0xFE, %s,%s,%s,%s}"\n\"",$1,$2,$3,$4};"
5
input.txt > output.txt

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 :)

: Bearbeitet durch User
von mar IO (Gast)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

mar IO schrieb:
> Was ist denn "coco" bzw. gibt es einen Link dazu?

Da Karl Heinz coco in einem Satz zusammen mit flex und bison nennt,
meint er vermutlich dieses Teil hier:

  http://www.ssw.uni-linz.ac.at/Research/Projects/Coco/

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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.

: Bearbeitet durch User
von mar IO (Gast)


Lesenswert?

Vielen Dank, werde ich mir mal genauer anschauen bzw. den Link in die 
Favs speichern!

von Borsty B. (mantabernd)


Lesenswert?

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ß

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.