Forum: Projekte & Code uParse - die zweite.


von TheMason (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

wie schon in dem uShell-Thread angedeutet, stelle ich (trotz androhung 
von Punktabzug bei Verwendung von Zeiger-Schweinereien :-)) hier mal die 
neue Version meines Parsers vor.

Dieser Parser ist deutlich einfacher aufgebaut.
Im Gegensatz zum 1. Parser wird hier ein Eingangsbuffer benötigt.
Auch werden nicht, wie im ersten Parser, die Tokens sukzessive 
ermittelt, sondern schlicht und ergreifend einfach alles in der 
Command-Liste durchsucht.
Durch diese beiden Einschränkungen kann der Parser auf 1 einzige 
Funktion reduziert (mit integrierter Hilfe sinds etwas mehr) werden.

Weiters sind eine intergrierte Hilfe implementiert (die sich über den 
Compilerschalter PARSE_USE_HELP deaktivieren lässt), und wie schon im 
ersten Parser die sogenannten Value-Codecs.
Durch Verwendung eines Eingangsbuffers haben die Value-Codecs auch 
deutlich mehr Möglichkeiten.

Die Parameterübergabe des Parsers an die aufzurufenden Funktionen 
erfolgt, anders als im alten Parser, über einen Datentyp, in dem eine 
fest definierte Anzahl von Parametern enthalten sind. Diese Parameter 
sind Unions in denen Platz für die Daten der Value-Codecs ist.

Der Präprozessor (und damit auch das Gemüt der Leute die sich diesen 
Code evtl. antun :-)) wird in diesem Parser nicht so sehr strapaziert. 
Allerdings konnte ich mir (nach einigen Überlegungen) es doch nicht 
nehmen lassen die Konfiguration des Parsers ebenfalls in einem separaten 
Konfigurations-File abzulegen.

Die Konfiguration in uParse_cfg.h erfolgt in folgenden Abschnitten :

- PARSE_DATA_UNION

Hier wird der Union-Datentyp für die Parameterübergabe definiert. Die 
Variable ucType entspricht dem Value-Codec der aufgerufen wurde.

- PARSE_COMMAND_FUNC

Hier werden externals für die, per Command, aufzurufenden Funktionen 
definiert.
Beispiel :

extern void vTest (UCHAR ucCmd, T_CMD_DATA_ELEMENTS *pstElements);

Mit #define PARSE_USE_HELP in diesem Abschnitt kann die Hilfe 
mitcompiliert werden.

- PARSE_LIST_FUNC

Hier kann dem Makro vParserWriteChar(x) eine Funktion zum Ausgeben von 
Zeichen zugeordnet werden, damit die integrierte Hilfe genutzt werden 
kann.

- PARSE_CODEC

Hier werden die Funktionen der Value-Codecs eingetragen. Weiterhin kann 
für die Auflistung ein Text zum jeweiligen Codec angegeben werden.

- PARSE_COMMAND

Hier stehen alle Befehle die der Parser erkennen kann. Die Value Codecs 
werden über die Binärzeichen \x01 - max \x1F aufgerufen (in der 
reihenfolge in der sie in PARSE_CODEC definiert wurden).


Zum Demo :

Das Demo ist für einen ATMega32 (lag gerade so langweilig herum :-). Man 
benötigt nur eine RS232 und eine Systemfrequenz von 11.0592 MHz 
(ansonsten muß man anpassen, ist aber nicht viel) und man kann ein paar 
befehle per rs232 testen (inkl. help)

Diese Version des Parsers ist bestimmt noch nicht ganz fehlerfrei. Werde 
im Laufe der Zeit (hoffentlich nach Feedback :-) korrekturen und neue 
Versionen reinstellen.

Gruß
Rene

von TheMason (Gast)


Lesenswert?

Gibts ein Feedback ?

Läufts ? Zufrieden ?

sach doch mal einer "Watt" ...

(ich weiß ich nerve, bin aber halt nu mal neugürisch :-))

von TheMason (Gast)


Lesenswert?

hat das denn jemand mal ausprobiert ?
oder ist das code-schnipsel mal wieder total unbrauchbar ?

ich verzweifel langsam. weder ein : "total unnütz", noch ein "jo danke", 
noch ein "mmh. und was soll das jetzt".

gebt doch mal bitte ein statement dazu ab.

von Peter D. (peda)


Lesenswert?

TheMason wrote:
> gebt doch mal bitte ein statement dazu ab.

Naja, ist immer noch recht heftig groß und Ressourcen verbrauchend.


Ich hab ja meinen einfachen Kommandointerpreter:

http://www.mikrocontroller.net/attachment/26437/COMMAND.C

Ist schön klein und übersichtlich, einfach zu erweitern und verbraucht 
auch nur ganz wenig Flash.

Vielleicht sollte ich mal ne Anpasssung für die AVRs mit der 
Kommandotabelle im Flash machen.
Bin aber bisher mit dem SRAM ausgekommen, habs daher auf dem AVR auch so 
laufen.


Peter

von TheMason (Gast)


Lesenswert?

dein code ist in sachen größe ja auch nicht zu schlagen :-)))

wenn ich mir so den bootloader oder das 1-draht-rs-232-display-aufm-tiny 
angucke.
aber das deswegen keiner meinen code brauchen kann ?!
sollte es das wirklich sein ?

von AVRFan (Gast)


Lesenswert?

>aber das deswegen keiner meinen code brauchen kann ?!
>sollte es das wirklich sein?

Bei mir nicht.  Ich weiß einfach überhaupt nicht, WOZU man Deinen Code 
gebrauchen KÖNNTE.  Ein paar schlichte, leicht verständliche Worte 
darüber, worin der Sinn und Zweck der Chose besteht, lässt Dein Beitrag 
ja vermissen.  Vielleicht gehts zu vielen anderen ja genauso?

Aber nix für ungut... ist nur meine Meinung :-)

von AVRFan (Gast)


Lesenswert?

PS: Allerdings kenn ich den Vorgänger-Thread nicht, und Du hast leider 
auch keinen Link dahin gesetzt.

von TheMason (Gast)


Lesenswert?

>Ich weiß einfach überhaupt nicht, WOZU man Deinen Code
>gebrauchen KÖNNTE.

hätte vielleicht wirklich den link zum ursprungsthread (uShell - ein 
universeller Parser für uCs) setzen sollen. Sorry.

Also mal eine kurze erklärung :

Dieser Code stellt einen einfach zu konfigurierenden 
Kommando-Interpreter dar, indem über eine Konfigurationsdatei sämtliche 
Befehle sowie weitere Erweiterungen (sogenannte Value Codecs, welche der 
dekodierung von ASCII-Zeichenfolgen wie Hexadezimalwerte, 
Zeichenkettenfolgen wie Strings [ueber "..."] dienen) definiert werden 
können) vorgegeben sind.
Als aufzurufende Funktionen werden die im sogennanten PARSE_COMMAND 
Abschnitt definierten funktionen bei Eintreffen eines passenden 
Eingangsstrings aufgerufen.
Der Code ist für AVR (speziell die RAM/Flash Problematik) angepasst und 
sollte jedem der sich ein wenig in C-Code auskennt (hoffentlich) recht 
einfach verständlich sein.

Ich hoffe ich habe es geschafft diesen missing link (um es mal in 
dänglish) auszudrücken :-)) zu füllen.

Falls weitere Fragen bestehen einfach melden.

>Allerdings kenn ich den Vorgänger-Thread nicht, und Du hast leider
>auch keinen Link dahin gesetzt.

Hier der fehlende link zum Vorgänger Thread :

Beitrag "uShell - ein universeller Parser für uCs"

Hoffe hiermit den fehlenden Informationen Genüge zu leisten.

Gruß
Rene

von Mike R. (thesealion)


Lesenswert?

Moin,

ich bin gerade auf der Suche nach einem "neuen" Parser, der der bisher 
verwendete ziemlich langsam und aufwändig ist.
Jetzt frage ich mich, ob deiner für meine Zwecke passt. Ich habe mir 
zwar schon den Code angesehen, muß aber sagen das ich ihn bisher nicht 
komplett verstanden habe.

Erst einmal habe ich Eingaben wie
L=1
?L
?dst
usw

Also immer ein Schlüsselwort und entweder einer Abfrage "?" davor oder 
einen Setzbefehl mit einem Parameter. An Befehlen können da schon mal 
100 verschieden zusammenkommen.

In einer Erweiterung soll das ganze dann in Richtung XML gehen:
aus L=1 wird dann so etwas wie
< cmd="L" value="1" ID="52" />

wobei die genauen Angaben noch nicht feststehen. Es ist aber auf jeden 
Fall vorgesehen das ein Befehl dann aus mehreren Parametern bestehen 
kann.

Ist der Parser dafür geeignet und wenn ja würdest du bei fragen zur 
Anpassung helfen?

Als letztes noch: das Zielsystem ist kein AVR sondern ein 56F8367 von 
Freescale, also ein Hybridcontroller (DSP und µC) ohne die 
Speicherbesonderheiten vom AVR.

Gruß Mike

von Ulrich R. (radiguli) Benutzerseite


Lesenswert?

Hallo,

Irgendwie kommt mir der Kommandointerpreter bekannt vor ??
ETH_M32_EX

Gruß
Uli

von Mike R. (thesealion)


Lesenswert?

@Uli: Stammt der von dir, oder hast du den bei dir auch verwendet?

von Ulrich R. (radiguli) Benutzerseite


Lesenswert?

Hallo,

Ich habe einen eigenen Commandointerpreter bei meinem AVR Webserver 
verwendet. Dieser scheint aber vom Aufbau fast identisch. Natürlich alle 
Variablen und Defines vom Namen anders/umbenannt, aber die gleiche 
Grundstruktur.

Gruß
Uli

von TheMason (Gast)


Lesenswert?

Hallo Uli,

hatte mir deinen Parser noch nicht angeschaut.
Mein Grundgerüst hatte ich anfang/mitte Dezember geschrieben. Ist 
eigentlich für einen Assembler (unter DOS/Windows) gewesen, habe den 
aber abgespeckt für AVR, nachdem ich das Feature mit den value codecs 
über die Steuerzeichen 1-31 eingebaut habe.

von TheMason (Gast)


Lesenswert?

@mike

prinzipiell müsste sich der parser so konfigurieren lassen das du solche 
eingaben machen kannst.
der ursprüngliche parser war (wie oben schon geschrieben) für einen 
assembler gedacht. da hatte ich auch einen codec für programmiert mit 
dem man ausdrücke (z.b. 10+20*40+b*(c+5*(a+b)) ) eingeben konnte.
allerdings ist diese variante etwas groß für den avr da dort rekursive 
aufrufe oft verwendet werden.

du kannst über die value-codecs (das können namen, strings, zahlen oder 
eben auch ausdrücke) dir die befehle beliebig zusammenstellen.
z.b.
"? \x01" würde bei ? xxx dir eine von dir angegebene funktion aufrufen 
und als parameter "xxx" liefern.
oder mit
"\x01 = \x02" würde dir die aufgerufene funktion einmal den parameter 
"x" und den parameter "5" liefern.

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.