mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Empfangenen asci string als c-code ausführen


Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist ne interessante Frage:

Ist es möglich, den Controller dazu zu bewegen, dass er einen via UART 
empfangenen String, (z.B. die Daten \n terminiert) als C-Code ausführt?

Wie realisiere ich dies?

BSP: ich bek. vom Terminal oder 2. µC in den rxbuf: "period = 100;\n\r"
wie kann ich den µC zwingen, als C-Code period = 100; auszuführen, 
vorrausgesetzt es besteht eine Variable period?

Hoffe ich bekomme Antworten dazu.

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> Hoffe ich bekomme Antworten dazu.

Dazu bräuchten wir Infos über den verwendeten uC.
Die AVRs z.B. können keinen Code aus dem Ram ausführen, sie können 
höchstens die Befehle interpretieren.

Autor: xxxxxxxxxxxxxx (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
AVR&co?

Geht nicht, probiers mit assembler

Autor: grr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unmöglich (es sei denn man portiert den gcc...).

Einen Parser schreiben um irgendwelche Werte im Programm zu ändern ist 
hingegen gut möglich.

Was hast du vor?

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum geht es nicht?

ich habe eben vor, wie es das beispiel zeigt, Konfigurationen 
vorzunehmen. Wenn ich meinetwegen mitteilen will, dass eine zeitliche 
Periode verändert wird, meinetwegen jetzt 100ms betragen soll, dann will 
ich dem µC das seriell mitteilen. (ATMEGA32)

Wenn ich dann umständlich einen String formatiert schicken muss, dann 
wieder umständlich diesen string zerlegen und in integerwerte umwandeln 
muss, um variablen zu verändern, ist das doof. Deshalb dachte ich es 
wäre möglich, via UART eine Zeile zu empfangen, die ich ausführe.

Gibt es nicht einen Umweg über ein Makro als define oder sowas? Nach dem 
Motto

#define EXECUTE_CODE char * rxbuf (ka wie ich hier an den Inhalt komme)

und dann im code einfach

LED_PORT &= ~(1<<RX_LED);
EXECUTE_CODE
LED_PORT |= (1<<YELLOW_LED);

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Timo P schrieb:
> Gibt es nicht einen Umweg über ein Makro als define oder sowas? Nach dem
> Motto

ich glaube du solltest dich erstmal mit den Grundlagen eines compiler 
beschäftigen. Der komplette C code wird in die Maschienensprache 
übersetzt. Danach gibt es keine Variabeln, Makros oder Funktionen mehr. 
Es gibt nur noch Sprünge und Adressen. Schau doch mal in die 
compilierten Dateien rein, hast du dort mal ein Namen einer Variable 
gesehen? Damit sollte klar sein das sotwas nicht geht. (zumindest nicht 
mit C, du könntest ein Basic interpreter verwenden)

Autor: Kommandointerpreter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Terminal mit Kommandointerpreter
Beitrag "Einfacher Interpreter für Komandozeilen/Befehlszeilen"
Linksammlung:
# Shells für Arduino:

    * ARSH
    * AVRSH
    * BITLASH
    * FRUITSHELL
    * BREAKFAST

Autor: Timo P (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kann ich also davon ausgehen, dass ich es nicht schaffe? den via uart 
übergebenen string als code auszuführen?

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wenn ich dann umständlich einen String formatiert schicken muss, dann
> wieder umständlich diesen string zerlegen und in integerwerte umwandeln
> muss, um variablen zu verändern, ist das doof.

ROFL. Sorry.

> Deshalb dachte ich es wäre möglich, via UART eine Zeile zu empfangen, die
> ich ausführe.

Kein Problem. Steck die empfangene Zeile in Deinen Interpreter, der 
erledigt den Rest. Falls Du die paar Zeilen für einen ebensolchen nicht 
selber schreiben willst, dann nimm einen Compiler-Compiler zur Hand, 
z.B. sowas wie den yacc [1]. Bisschen Overkill aber was solls ;-)

Aber im Ernst: Werd Dir darüber klar, was ∗genau∗ Du ändern können 
willst, schreib die paar Fälle in eine hypsche Tabelle, setzt ein paar 
sscanf()s drauf an und gut iss.

HTH und nix für ungut.

[1] http://de.wikipedia.org/wiki/Yacc

Autor: Mark .. (mork)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein C-Interpreter wäre für diesen Fall IMHO doch völlig übertrieben. 
Wenn Du nur Wertzuweisungen brauchst, dann zerleg den empfangenen String 
in zwei Teile, also die Seite vor dem '=' und die Seite nach dem '='.

Dann kannst Du den Inhalt der linken Seite nach bekannten Variablennamen 
durchprüfen und ihnen ggf. den Wert der rechten Seite zuweisen. Also 
etwas so
char *left, *right;
parseInput(&left, &right);

if(strcmp_P(left, PSTR("period")) == 0)
    period = atoi(right);
else if(strcmp_P(left, PSTR("andereVariable")) == 0)
    andereVariable = atoi(right);
else
    uart_puts("Fehler: Variable nicht vorhanden!\n");

Wenn alle Variablen den gleichen Typ, also z.b. int haben, könnte man 
auch im Flash eine Map anlegen, die die Variablennamen den Adressen 
zuordnet. Dann bräuchte man nur in dieser Tabelle die Adresse der 
Variable nachzuschauen und den Wert an dieser Stelle entsprechend zu 
setzen.

MfG Mark

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.