Forum: Mikrocontroller und Digitale Elektronik Wie benutze ich uLua auf einem AVR?


von Holger K. (holgerkraehe)


Lesenswert?

Hallo zusammen

Ich würde gerne meinem bestehenden Projekt zusätzliche Funktionalitäten 
durch kleine Scripts geben.

Dazu würde ich gerne Lua verwenden.

Ich habe folgendes Projekt im Netz gefunden:
https://github.com/deemess/uLua

Grundsätzlich genau dass, wonach ich gesucht habe.
Leider ist es mir nicht ganz klar, wie ich dies nun benutzen soll.

Ich möchte das Script auf einer SD-Karte ablegen.
Die SD-Karten Anbindung läuft problemlos. Ich kann auf Dateien Zugreifen 
etc.

Nun die frage an euch, wird später die Datei xyz.lua oder die Datei 
xyz.luc verarbeitet auf dem uC?

Kennt jemand das Projekt und kann mir tipps für dessen verwendung geben?

Ich möchte dem Benutzer zudem die möglichkeit geben, auf Firmware 
interne funktionen wie z.b. create_xy zuzugreifen.

Danke schonmal

von asdfasd (Gast)


Lesenswert?

> https://github.com/deemess/uLua
>[...]
> Leider ist es mir nicht ganz klar, wie ich dies nun benutzen soll.

Gar nicht - das ist eine Baustelle, noch nicht fertig.  Und nachdem im 
letzten halben Jahr nichts mehr passiert ist, schätze ich, dass der 
Autor aufgegeben hat.  Ist auch nicht verwunderlich - Lua ist für den 
typischen Mikrocontroller (ein paar Dutzend KB Flash, ein paar KB RAM) 
nicht geeignet - frag mal die NodeMCU-Leute ;-)

von Planlos (Gast)


Lesenswert?

asdfasd schrieb:
> Lua ist für den
> typischen Mikrocontroller (ein paar Dutzend KB Flash, ein paar KB RAM)
> nicht geeignet - frag mal die NodeMCU-Leute

Wobei bei NodeMCU der Compiler mit auf dem µC läuft, das ist schon eine 
ganze Größenordnung mehr Aufwand.
Für den AVR/µLUA ist der Compiler auf den PC ausgelagert, auf dem AVR 
läuft rein die VM, die vorgekauten Bytecode vorgesetzt kriegt.

von Planlos (Gast)


Lesenswert?

Holger K. schrieb:
> Nun die frage an euch, wird später die Datei xyz.lua oder die Datei
> xyz.luc verarbeitet auf dem uC?

Nachtrag, um konstruktiv zu bleiben:
Die .luc.

Wenn LUA nicht in Stein gemeisselt ist:
Forth ist evtl. kleiner und eher µC-Tauglich.

von Dauergast (Gast)


Lesenswert?

Planlos schrieb:
> Wobei bei NodeMCU der Compiler mit auf dem µC läuft, das ist schon
> eine ganze Größenordnung mehr Aufwand.

Das Problem bei NodeMCU ist das RAM (<30k) während der Laufzeit der 
Lua-Scripte. Dabei ist fast egal, ob Lua direkt oder als Bytecode 
ausgeführt wird.

> Für den AVR/µLUA ist der Compiler auf den PC ausgelagert, auf dem AVR
> läuft rein die VM, die vorgekauten Bytecode vorgesetzt kriegt.

Spiel wie gesagt kaum eine Rolle. Die Lua-Tabellen brauchen sehr viel 
RAM und lassen sich nur massiven Einschränkungen spürbar verkleinern. 
Wenn der ESP da mit eLua schon massive Probleme hat, würde ich mal 
vermuten, daß selbst ein 1284p mit seinen 16k RAM mit uLua für nicht 
viel mehr als ein blink.luc taugt.

Aber wozu auch, es gibt des ESP für unter 3 Euro, mit mehr Ports für 5, 
und Tiva-Boards in ähnlichen Bereichen, alle DEUTLICH leistungsfähiger 
als ein teurerer 1284p.

von Serge (Gast)


Lesenswert?

> Das Problem bei NodeMCU ist das RAM (<30k) während der Laufzeit der
> Lua-Scripte. Dabei ist fast egal, ob Lua direkt oder als Bytecode
> ausgeführt wird.

Aktuell sind es bei mir 34 KBytes. Trotz HTTP-Server, NTP-Client, I2C ( 
Temperatur-, Feuchte-, Helligkeits-, Luftdrucksensor) und kleineren 
Funktionen (ls, cat, etc.) sind noch ca. 14 KBytes frei.

Das eigentliche Problem ist nicht LUA* oder die Implementierung. Das 
Problem ist der ESP8266, der ohne Datenblatt kommt und für den der 
Hersteller seit einem Jahr Informationen nur häppchenweise herausrückt.

Der Bytecode (*.lc) ist Dank eines Strippers für den Quellcode sehr 
schlank.

von Holger K. (holgerkraehe)


Lesenswert?

Ich würde den code mit einem stm32 mit 64k ram verwenden.

von Dauergast (Gast)


Lesenswert?

> Das eigentliche Problem ist nicht LUA* oder die Implementierung.

Nein, das RAM :)
Mit ~14k frei* bin ich auch unterwegs, mit einigen Tricks (viele 
Funktionen in dofile() ausgelagert) läuft auch alles stabil, solange 
keine Probleme auftreten, z.B. WLAN-Störungen, amoklaufender Browser 
versucht dutzendfach gleichzeitig favicon.ico zu holen - dann ist es 
wieder da, das RAM-Problem, und man verbringt schnell mal 90% der 
Entwicklungszeit mit Workarounds.

> Das Problem ist der ESP8266

Der ist eigentlich recht gutmütig, wenn man ihn mit C/C++ bespaßt, was 
zum Beispiel mit der Arduino-IDE plus ESP8266-Plugin auch ohne jegliches 
Gefummel und sehr schnell möglich ist. Von kleineren 
Konfigurations-#ifdefs abgesehen ist das Zeug dann auch sourcekompatibel 
z.B. mit dem TM4C1294XL plus Energia.

Sage ich als Ex-Arduino-Hasser und immer-noch-Lua-Fan ....

*mit dem neusten NodeMCU Dev 4k mehr, dafür ist das Connection-Handling 
kaputt :(

von Dauergast (Gast)


Lesenswert?

Holger K. schrieb:
> Ich würde den code mit einem stm32 mit 64k ram verwenden.

Das liegt sogar schon im brauchbaren Bereich für eLua.
Das ist "fertiger" und vollständiger als uLua.

http://wiki.eluaproject.net/Boards

von Holger K. (holgerkraehe)


Lesenswert?

Vielen Dank für eure Antworten

Bei eLua sehe ich hauptsächlich fertige HEX-Files. bzw habe ich das 
gefühl, das eLua als Standalone gedacht ist.

Ich möchte dem Benutzer einfach die möglichkeit geben, von mir in der 
Firmware geschriebene Funktionen mit einfachsten Mitteln selbst 
verwenden zu können und ein kleineres Programm zu schreiben.

Dabei muss meine Firmware im Hintergrund jedoch weiterhin laufen.
Ist eLua für sowas geeignet?

Also quasi als Add-On?

Meine idee war, dass nach dem Start der Controller auf der SD-Karte zb. 
nach main.luc sucht und diese wenn gefunden ausführt.

Wenn der Benutzer in Lua dann z.B. eine Funktion wie xyz()... aufruft,
soll im hintergund in meiner Firmware die Funktion xyz() aufgerufen 
werden.

Is sowas überhaupt machbar mit eLua?

Alternativ müsste ich wohl einen eigenen Interpreter schreiben.
Das möchte ich jedoch wenns irgendwie geht vermeiden.
Denn ich möchte nicht nur funktionen sondern auch schleifen, variablen 
etc. ermöglichen.

von Tobias (Gast)


Lesenswert?

Holger K. schrieb:
> Ich möchte dem Benutzer einfach die möglichkeit geben, von mir in der
> Firmware geschriebene Funktionen mit einfachsten Mitteln selbst
> verwenden zu können und ein kleineres Programm zu schreiben.
>
> Dabei muss meine Firmware im Hintergrund jedoch weiterhin laufen.
> Ist eLua für sowas geeignet?

Genau mit der Frage habe ich mich die letzten Tage beschäftigt. Lua an 
sich ist dafür geeignet.

eLua ist wohl wie du schon sagst eher als standlone Lösung auf dem uC 
gedacht. Den Quelltext kann man runterladen. Im eLua Verzeichnis 
elua-master\src\lua befindet sich eine nicht mehr ganz aktuelle 
Lua-version (ich glaube 5.1.4) die mit dem "LTR-Patch" und einigen 
anderen Änderungen versehen ist.
Siehe auch http://www.eluaproject.net/doc/v0.9/en_arch_overview.html.
Der LTR-Patch reduziert den Mindest-RAM-Verbrauch von etwa 17K auf etwa 
6K. Außerdem sind verschiedene Funktionen zur dynamischen 
Speicherverwaltung (alloc) hinzugefügt worden und Code der das 
Crosscompilieren der Lua-Skripte ermöglicht (PC <-> uC).

Um eLua sinnvoll nutzen zu können, sollte man angeblich 32-64 KB RAM 
haben.

Holger K. schrieb:
> Meine idee war, dass nach dem Start der Controller auf der SD-Karte zb.
> nach main.luc sucht und diese wenn gefunden ausführt.

So wird das bei eLua gemacht.

Holger K. schrieb:
> Wenn der Benutzer in Lua dann z.B. eine Funktion wie xyz()... aufruft,
> soll im hintergund in meiner Firmware die Funktion xyz() aufgerufen
> werden.

Das ist die Stärke von Lua an sich. "Lua is a powerful, fast, 
lightweight, embeddable scripting language."

Mit "embeddable" ist gemeint, dass sich Lua in C-Programme einbetten 
lässt. Um embedded devices geht es primär nicht. Lua erwartet eine 
dynamische Speicherverwaltung und ein Dateisystem.
Das mit dem "fast" (schnell) bezieht sich auf "scripting language". 
Gegenüber C ist Lua sehr sehr langsam.

Jedenfalls ist mir in dem eLua Paket zu viel drin was ich gar nicht 
haben will, z.B. das Dateisystem. Heute ist es mir gelungen, den 
regulären Lua-Quellecode (www.lua.org) in meine Firmware zu integrieren. 
Der Mikrocontroller ist ein STM32F407 und die IDE ist EmBlocks mit 
gcc-none-eabi. Mit luaL_dostring() kann ich nun kleine Skripte 
ausführen. Große Skripte habe ich noch nicht getestet.

Mir ist auch noch nicht ganz klar warum das so einfach funktioniert. Die 
notwendigen Funktionen zur Verwaltung des heap memory im RAM, nämlich 
realloc() und sbrk() sind anscheinend in der <stdlib.h> vom compiler 
enthalten. Hier hatte ich größere Probleme erwartet.

Ansonsten musste ich nur fwrite() von stdout auf die serielle 
Schnittstelle umbiegen und die lib-math via Linker-Option "-lm" fest 
einbinden.

Hat hier im Forum noch jemand Erfahrung mit "normalem" Lua direkt auf 
dem Mikrocontroller?

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.