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
Gibts ein Feedback ? Läufts ? Zufrieden ? sach doch mal einer "Watt" ... (ich weiß ich nerve, bin aber halt nu mal neugürisch :-))
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.
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
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 ?
>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 :-)
PS: Allerdings kenn ich den Vorgänger-Thread nicht, und Du hast leider auch keinen Link dahin gesetzt.
>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
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
Hallo, Irgendwie kommt mir der Kommandointerpreter bekannt vor ?? ETH_M32_EX Gruß Uli
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
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.