Forum: PC-Programmierung Interesse an Alternative zu BASCOM?


von Adrian (Gast)


Lesenswert?

Hallo!

Wollte mal vorsichtig was anfragen.
BASCOM ist ja in aller Munde. Natürlich auch die Beschränkung bzw. die 
Kosten. Die Syntax finde ich nicht gerade konform und auch die 
Objektorientiertheit fehlt.
Gäbe es Interessenten und Mitwirkende an einer Alternative mit einer 
besseren Basic Syntax und Objektorientierung?

Unter der Haube sollte der Basic-Code dann nach Assembler übersetzt 
werden.

Hochsprachen beherrsche ich, Assembler bin ich zur Zeit noch am 
einlernen.

Was sagen die Assembler-Spezialisten dazu?

Gruß Adrian

von Max D. (Firma: No RISC, no fun.) (metalfan)


Lesenswert?

Ich bin zwar kein Spezialist, aber ich finds ne schöne Idee. Mit was 
soll das geproggt werden?

von Silvan K. (silvan) Benutzerseite


Lesenswert?

Da er scheinbar Objektorientierung und Hochsprache liebt: C++???

von Chris _. (_chris_)


Lesenswert?

Schreib ein paar libs, oder adaptier die libs, die Procyon AVRlib
ist ein Anfang, aber Lizenz beachten.
Basic->C converter (BXC oder BACON als Beispiel), GCC und das Resultat
ist assembler/Hex File das mittels Bootloader nehme ich an runtergeladen
werden kann. Ich habe so ähnlich bestehende PBasic programme auf AVR/ARM 
portiert, ohne was neuzuschreiben. Ich hatte da noch ein Programm vor
dem basic->c converter um ein bisschen die Basic-Syntax zu convertieren,
das ändert aber nichts am Konzept.

von Karl H. (kbuchegg)


Lesenswert?

Der Charme von BASCOM besteht weniger in der Sprache an sich, sondern 
dass es für die meisten realen Situationen fertige Codebausteine 
mitbringt.

Willst du BASCOM ersetzen, dann bleibt dir nichts anderes übrig, dafür 
einen Ersatz zu schaffen. Und das ist eine Menge Arbeit, wenn das für 
alle möglichen Porzessoren und alle in BASCOM vorhandenen fertigen 
Module gemacht werden soll (und vor allen Dingen richtig gemacht und 
auch dann eine Aktion, wenn der IC die Funktionalität gar nicht kann).

Da du diese Module aber sowieso implementieren musst um BASCOM zu 
verdrängen, kannst du dir auch gleich C-Bibliotheken dafür überlegen(*). 
Wenn die tatsächlich den kompletten Modul-Funktionsumfang von BASCOM 
abdecken, dann könnte es schon sein, dass die dir hier aus der Hand 
gerissen wird und dir dein Gewicht in Gold aufgewogen wird.

Aber: Dazu brauchst du keinen BASIC Compiler entwickeln. Das als C-Lib 
mit allen Schikanen ist völlig ausreichend.

(*)
Noch besser wäre ein Sammlung von C++ Objekten.

von Nummernschalter (Gast)


Lesenswert?

Versuche es!

Das hat sicher eine Menge Aha-Effekte und enormen Wissenszuwachs zur 
Folge.

Trotzdem. BASCOM AVR kostet in der Anschaffung zur Zeit etwa 90 Euro. 
Was Du beim "Selbermachen" sparst, wirst Du potenziert an Zeit 
"verheizen". Ob es sich lohnt, mußt Du selber wissen.

von Adrian (Gast)


Lesenswert?

Danke erstmal für das viele Feedback! :-)

Silvan König:
Es wird eine Basic-Alternative.... daher kein C++. Ich finde, dass die 
GCC werkzeuge schon recht gut sind.
Die Syntax wird VB bzw VBA. Ich hab da schon spontan ganz viele Ideen.


Chris:
Ich will keinen Umweg über C gehen. Basic nach Assembler, also ein 
Codegenerator.
Sollte anschließend kein Problem sein das Assemblerfile bzw Hex-File zu 
kompillieren und dann über ein anderes Programm in den Flash laden.

Karl heinz Buchegger:
Die Codebausteine müssen natürlich auch erstellt werden. Alles jedoch 
nach und nach.
Geplant ist das die Assemblerschnipsel je nach Plattform und Prozessor 
immer passend erstellt werden.
Die Definitionen werden offen als XML verfügbar sein und durch Helfer 
erweitert werden.
Und ich will BASCOM nicht verdrängen :-)

Nummernschalter (Gast):
Klar ist es interessant so ein Projekt zu realisieren.
Ich würde die 90 Euro auch investieren wenn ich regelmäßig flashen würde 
und ich jetzt ein Lösung bräuchte.
Darum geht es abern nicht. Ich mache es für die Community.

von Christopher (Gast)


Lesenswert?

In welcher Sprache willst du Entwickeln??
Bei der richtigen wäre ich dabei;)


MFG

von Silvan K. (silvan) Benutzerseite


Lesenswert?

Max D. schrieb:
> Ich bin zwar kein Spezialist, aber ich finds ne schöne Idee. Mit was
> soll das geproggt werden?

Christopher schrieb:
> In welcher Sprache willst du Entwickeln??
> Bei der richtigen wäre ich dabei;)


Ist das nicht ein und dieselbe Frage? Darauf war nämlich meine Antwort 
bezogen:

Silvan König schrieb:
> Da er scheinbar Objektorientierung und Hochsprache liebt: C++???

von Nummernschalter (Gast)


Lesenswert?

Auch ich habe bisher nur wenige Projekte in BASCOM AVR realisiert, aber 
es ging alles ziemlich flott. Und dafür haben sich die paar Öcken auf 
jeden Fall gelohnt. Mittlerweile benutze ich vorwiegend Linux und bin 
damit "gezwungen", avr-gcc zu nutzen. Funktioniert auch, ... 
weitestgehend (abhängig von der eingesetzten Distribution).

Leider sehen sich die Jungs aus Holland nicht in Lage, eine Lösung für 
Linux "nachzuschieben". Ich wäre bereit bis zu 100 Euro dafür zu zahlen. 
Und ich denke, das geht den meisten Linux-Nutzern mit 
"AVR/8051-Ambitionen" so.

Also mach' Dich ran ;-)

von Max (Gast)


Lesenswert?

bascom mag angeblich wine (ich hab ermangels linux-pc keine 
praxiserfahrung, aber elektor hat des ma geschrieben)

von Nummernschalter (Gast)


Lesenswert?

Windows-Programme unter Linux laufen zu lassen ist (meiner Meinung nach) 
"Mist"!

Ein großer Vordenker aus Dresden (UZ) äußert sich sinngemäß: "Emulatoren 
zu benutzen ist wie Porsche im Simulator fahren". Und damit hat er 
vollkommen recht. Auch wenn sich diese Aussage auf einen anderen Kontext 
bezog.

von Adrian (Gast)


Lesenswert?

Nabend

Ich würde es in VB realisieren. Ist meine Muttersprache.
Die kompletten definitionen wären jedoch extern in XML-Dateien. Mein 
Prog würde sie interpretieren und als Objekte anbieten.


Gruß Adrian

von Yalu X. (yalu) (Moderator)


Lesenswert?

Adrian schrieb:
> Ich würde es in VB realisieren.

Viele Compiler werden in der eigenen Sprache geschrieben, also
C-Compiler in C, Lisp-Compiler in Lisp, Haskell-Compiler in Haskell usw.
Das ist ja auch nachvollziehbar, weil das Ziel des Compiler-Entwicklers
ist, den besten Compiler für die beste Programmiersprache zu schreiben.
Warum sich also bei der Entwicklung des Compilers selbst mit weniger
zufriedengeben?

Wenn das neue Basic VB-ähnlich sein soll, ist es also richtig, VB für
die Entwicklung zu verwenden. Sobald der Compiler fertig ist, sollte er
in der Lage sein (ggf. nach entsprechenden Anpassungen), sich selbst zu
übersetzen, vorausgesetzt natürlich, es gibt auch einen Codegenerator
für PC-Prozessoren.

Viel Erfolg damit!

Edit:

Falls kein Codegenerator für PC-Prozessoren vorgehen ist: Was spricht
dagegen, den Compiler auf einem AVR laufen zu lassen? Cool wäre doch ein
Dongle mit einem AVR und einem FTDI drauf, der über USB den Quellcode
empfängt und ihn compiliert wieder zurückschickt. Man erspart sich
dadurch die Installation einer Entwicklungsumgebung auf dem PC und kann
auf jedem Rechner mit USB unabhängig vom Betriebssystem AVR-Software
entwickeln.

Nur mal so dahergesponnen :)

von Andreas F. (aferber)


Lesenswert?

Yalu X. schrieb:
> Cool wäre doch ein
> Dongle mit einem AVR und einem FTDI drauf, der über USB den Quellcode
> empfängt und ihn compiliert wieder zurückschickt.

Warum zurückschicken? Direkt den Ziel-AVR am anderen Ende dranhängen und 
flashen ;-)

Andreas

von Egon (Gast)


Lesenswert?

Oje oje oje oje oje!

Schwachsinnige Idee hoch zehn! Kann ja garnix werden, und selbst wenn es 
nach hunderten Stunden Arbeit tatsächlich mal funktionieren würde, gäb 
es kein einzigen Anwender der es nutzen würde außer dir selbst.

Dein Plan ist absolut unnötig, hoffentlich finden sich nicht auch noch 
Leute denen du Zeit klaust. Sinnlos triffs vielleicht auch.

Gruß
Egon

von Yalu X. (yalu) (Moderator)


Lesenswert?

Andreas Ferber schrieb:
> Yalu X. schrieb:
>> Cool wäre doch ein
>> Dongle mit einem AVR und einem FTDI drauf, der über USB den Quellcode
>> empfängt und ihn compiliert wieder zurückschickt.
>
> Warum zurückschicken? Direkt den Ziel-AVR am anderen Ende dranhängen und
> flashen ;-)

Auch das ist natürlich eine interessante Möglichkeit, aber oft will man
eben auch einen anderen AVR, der zu tiny für den Compiler ist, oder
einen bereits in einer Schaltung verbauten AVR damit programmieren.

Aber jetzt, wo du das ansprichst: Man könnte natürlich gleich den
Programmieradapter mit auf den Dongle packen. Es fehlt ja nur noch der
Steckverbinder und die Software. Statt Toolchain installieren, Compiler
und Programmiertool aufrufen, bräuchte man also nur noch

  cat quellcode.bas >/dev/ttyUSB0

bzw.

  type quellcode.bas >com8:

eingeben oder im Explorer "Senden an" im Kontextmenü der Quelldatei
anklicken und der AVR ist programmiert, entweder der im Dongle oder der
über ISP damit verbundene :)


Egon schrieb:
> Dein Plan ist absolut unnötig, hoffentlich finden sich nicht auch noch
> Leute denen du Zeit klaust. Sinnlos triffs vielleicht auch.

Klar, Hobbys sind unnötig und sinnlos :)

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ein ganz großes AHA! würde das Projekt verdienen, wenn es konsequent 
plattformunabhängig programmiert werden könnte. Also für Windows, Linux 
und Mac!
Dann müsste man das in Java, Javascript oder RealBasic machen ... ich 
glaube nicht, dass Geschwindigkeit ein besonders wichtiges Kriterium bei 
einem Compiler für AVR ist.

Frank

von Detlev T. (detlevt)


Lesenswert?

Naja, so teuer ist BASCOM nun auch wieder nicht.

Was mir im Freeware-Bereich eher fehlt ist eine grafische 
Programmierumgebung a'la Labview, wenn es schon OOP sein soll. 
Tendenziell wohl eher "nur" ein grafischer Editor, der am Ende 
C++-Quelltext für den gcc-Compiler ausspuckt.

von Mega (Gast)


Lesenswert?

Die Graphische Sache ist da echt interessant!

Ein netter Ansatz ist z.b. MircoSPS von CadSoft 
http://www.cadsoft.de/microsps/index.htm

Jedoch ist das auch nicht wirklcih umfangreich, und auch nicht das 
allerschnellste.

Ne feine Sache wär einfache Regelungen graphisch entwerfen zu können 
(wie in Simulink) und daraus Code zu generieren.

Speziell denk ich dabei an Regelsysteme mit einer gewissen Anzahl 
analoger Eingänge und einem analogen Ausgang. Damit könnte man 
wunderschön Zustandsregler oder klassische PID Regler etc. erstellen 
ohne groß sich mit der Software rumzuärgern die ja eigetnlich nur die 
Regelung die man eh schon entworfen hat implemenentiert!

Oder gibts da schon irgendwas? Also irgendwas für das man nicht 1000e 
für ne DSP Umgebung hinblättern muss.

von Adrian (Gast)


Lesenswert?

Also es sollte ein Codegenerator werden. Das hat ziemlich garnichts mit 
einem Compiler zu tun. Und es ist wohl völlig egal mit welcher Software 
im Prinzip eine Textdatei generiert wird. VB ist meine Muttersprache und 
grafische Oberflächen sind blitz schnell erstellt. Die meisten die es 
für langsam halten wissen nicht mal wovon sie sprechen.

Naja Egon, ich glaube die meisten hier auf mc.net machen das alles 
hobbymäßig. Du anscheinend nicht.

Zusätzlich als Schaltplan die Steuerung zu erstellen ist natürlich auch 
ne gute Idee!

Wäre schön mal zur Abwechslung was Konstruktives zu hören als von jedem 
seine persönliche Meinung über dies und das!


Und nochmal zum merken:
==================================================================
ES WIRD KEIN COMPILER SONDERN EIN CODEGENERATOR (VB -> ASSEMBLER)!
==================================================================

von Karl H. (kbuchegg)


Lesenswert?

Darf ich was fragen?

Wieviel Erfahrung hast du denn in diesem Bereich?

Wenn ich mir solche Dinge ansehe
> Und nochmal zum merken:
> ==================================================================
> ES WIRD KEIN COMPILER SONDERN EIN CODEGENERATOR (VB -> ASSEMBLER)!
> ==================================================================
dann zweifle ich doch sehr daran, dass du weißt was du tust.

Du schreibst einen Compiler! Ein Codegenerator ist Teil eines Compilers, 
der sich die im Compiler erzeugte Zwischenrepräsentierung hernimmt und 
daraus dann den echten Maschinencode erzeugt.
Und wenn du darauf spekulierst, dass du bei Visual Basics in die 
Internals reinkommst, so dass du von dort den Expression Tree bekommst: 
Träum weiter.

Oder verwechselt hier wieder mal jemand IDE und Compiler?

Vielleicht hab ich ja auch was übersehen. Also: wie genau stellst du dir 
deinen Codegenerator vor? Welche Schritte macht er? Wie ist seine 
Arbeitsweise?


Ich seh das wie Egon: Eine Totgeburt noch ehe es losgegangen ist.

(Und ehe du fragst: Ja, ich hab schon Sprachen entworfen und Compiler 
dafür geschrieben)

von sausix (Gast)


Lesenswert?

Moin!

Ich habe bereits eine Scriptsprache erstellt die wirklich alles Parst. 
Ohne Hilfsmittel wie andere es gerne nutzen.

Nagut, dann ist ein Codegeneratot eben ein Teil eines Compilers. Jedoch 
soll das Programm dann nicht die Binaries bzw. Hexfiles erstellen.

Was meinst du mit Internals von VB? Die Auflösung der Logik von 
Ausdrücken usw? Halt mich mal nicht für nen Anfänger. Ich kenne den 
Unterschied zwischen IDE und Compiler. VB mache ich seit 95. Sogar 
beruflich. Ich habe gutes technisches Wissen in den Bereichen die ich 
mache.
Daher ging dieser Thread auch mehr an die Assembler-Profis. Denn in 
Assembler lese ich mich zur Zeit noch ein.

von Sven P. (Gast)


Lesenswert?

Kurz und schmerzlos:

Interesse an sauberen, durchdachten und gut dokumentierten Bibliotheken: 
Ja, auf jeden Fall. Am liebsten in C.

Interesse an Basic: Nö.

von Martin (Gast)


Lesenswert?

Kauf dir das Drachenbuch (Compilerbau, Aho, Sethi, Ullman) in der 
deutschen Übersetzung (2 Teile), arbeite es vollständig durch (6 Monate, 
vielleicht länger), danach melde dich wieder.

von Karl H. (kbuchegg)


Lesenswert?

sausix schrieb:

> Ich habe bereits eine Scriptsprache erstellt die wirklich alles Parst.
> Ohne Hilfsmittel wie andere es gerne nutzen.

Schön. Dann hast du deine Zeit verplempert.

Den ersten Syntax Parser schreibt man selber um zu wissen wie das geht. 
Aber spätestens beim 5.ten ist es nur noch Zeitverschwendung den 
Syntaxparser mit der Hand zu schreiben. Das kann ein Tool genausogut.

> Was meinst du mit Internals von VB? Die Auflösung der Logik von
> Ausdrücken usw? Halt mich mal nicht für nen Anfänger. Ich kenne den
> Unterschied zwischen IDE und Compiler. VB mache ich seit 95. Sogar
> beruflich. Ich habe gutes technisches Wissen in den Bereichen die ich
> mache.


Was soll konkret aus deinem Machwerk hinten rauskommen und wie stellst 
du dir vor, dass du VB da mitbenutzen kannst?

Deine Scriptsprachen in allen Ehren, aber auch du wirst es nicht 
schaffen, die Scripting Runtim auf einem AVR zum laufen zu bekommen. 
Also muss dein Machwerk wohl oder übel Assembler erzeugen. Nur wie 
machst du das?

Wie erzeugt dein Kongolmerat aus einer Eingabedatei

  print ( 3 + 5 ) * 8

die entsprechenden Assembler Anweisungen. Und zwar ohne dass du einen 
kompletten Compiler schreibst.

Die Frage ist doch so schwer auch wieder nicht.

von John S. (linux_80)


Lesenswert?

Hallo,

man könnte zB. damit anfangen, eine Erweiterung für eclipse zu 
schreiben, um darin Bascom programmieren zu können, denn das schlimmste 
am Bascom ist diese IDE
:)

Dann wäre die erste hürde schon genommen, da ist der umstieg auf eine 
andere Sprache nicht mehr weit, und es läuft auf allen möglichen 
Betriebssystemen.

von Karl H. (kbuchegg)


Lesenswert?

Nur um nicht misverstanden zu werden.
Ich will dich keineswegs aufhalten.
Ich möchte nur eine realistische Einschätzung gewinnen können, ob dieses 
Projekt realisierbar ist.

Es sagt sich leicht: 90 Euro ist mir zuviel, na dann schreib ich mir das 
halt selber. Und ach ja, objektorientiert soll es auch noch sein.

In den meisten Fällen hat derjenige, der das sagt noch keine Vorstellung 
davon, was da auf ihn zukommt.

Und den Punkt hätte ich vorab gerne geklärt.

von DL2WRJ, Wolf (Gast)


Lesenswert?

Es gibt doch schon Arduino und Processing, wozu dann noch Basic?

von Detlev T. (detlevt)


Lesenswert?

Mega schrieb:
> Ein netter Ansatz ist z.b. MircoSPS von CadSoft

Dieses Konzept kannte ich schon. Überzeugt hat es mich aber nicht. Erst 
einmal ist der Umweg über EAGLE umständlich, aber damit könnte man wohl 
noch leben. Als Interpreter ist das aber eher langsam und da wird es 
schon eng. Inakzeptabel ist aber für mich, dass man das System nicht 
erweitern kann. Objekte, die der Interpreter nicht kennt, die kennt er 
halt nicht.

Meine Vorstellung (wenn auch leicht OT, weil es hier ja eher um 
Skriptsprachen geht):

Eine GUI erlaubt das Platzieren von Objekten und die Verbindung von Aus- 
zu Eingängen von Objekten. Daraus wird C++-Code generiert und 
(automatisch?) in avr-g++ eingespeist. Dieser Quellcode würde aus den 
Klassen der benutzten Objekten bestehen. main() erzeugt die benötigten 
Instanzen und "verbindet" die Datenleitungen, auf denen Datenobjekte 
laufen. Wahrscheinlich braucht man dann noch einen Scheduler mit einer 
Liste aller Objekte sowie eine Nachrichten-Queue.

Zur Erweiterung müsste man dann ein grafisches Sysmbol erstellen und 
eine neue Klasse programmieren. Von dem Ur-Objekt erbt es die 
Funktionen, die für den Betrieb nötig sind. Das wäre wohl vor allem der 
Empfang und das Senden von Datenobjekten und die Möglichkeit, vom 
Scheduler regelmäßig angestoßen zu werden. (Da stellt sich schon die 
Frage, ob avr-gcc überhaupt virtuelle Funktionen unterstützt)

Für alle Zwecke wäre das sicher nicht geeignet - und klein wäre so ein 
Projekt auch nicht. Ich will das gar nicht erst anfangen, deshalb kann 
ich auch nicht erwarten, dass es ein anderer tut. Ist nur eine Idee.

von Paul Baumann (Gast)


Lesenswert?

Krach, Knack, Knirsch, Ächts...
(Das war die Lanze, die ich gerade für BASCOM gebrochen habe)
;-)

Man muß sich auch vor Augen halten, daß der "Bascom-Mann" ja von seiner
Arbeit leben muß. Es ist schon aller Ehren wert, daß er eine Demoversion
anbietet, mit deren Codegröße viele Leute auskommen. Was die Bedienober-
fläche anbetrifft, so finde ich sie "handlicher" als die vom AVR-Studio.

Man kann die vorgefertigten Routinen benutzen, aber auch direkt
Assemblerbefehle in den Quelltext einfügen, wenn man meint, diese
Aufgabe selbst besser lösen zu können.

(Nein, ich kenne den Hersteler nicht persönlich und bekomme auch keine
Provision für diesen Text)

MfG Paul

von Karl H. (kbuchegg)


Lesenswert?

Detlev T. schrieb:

> Eine GUI erlaubt das Platzieren von Objekten und die Verbindung von Aus-
> zu Eingängen von Objekten.

[rest gesnippt]

Das wäre etwas, was mich auch interessieren würde.
Ich hab so etwas bisher auch nur als Interpreter realisiert, bei dem man 
das 'Programm' einem Standardinterpreter in Form von Beschreibungsdaten 
vorsetzt. Mit allen Nachteilen, die weiter oben schon angesprochen 
wurden.

> laufen. Wahrscheinlich braucht man dann noch einen Scheduler mit einer
> Liste aller Objekte sowie eine Nachrichten-Queue.

Und genau da fängt die Sache dann an interessant zu werden. Ist es 
möglich, aus der Verschaltung eine 'optimale' Abarbeitungsreihenfolge 
der Objekte zu generieren oder lebt man damit, einfach alle Objekte 
Round-Robin mässig durchzuhacheln, selbst wenn sich an den Eingängen 
dieser Objekte nichts verändert hat.

Wenn ich dich richtig verstanden habe, dann stellst du dir vor, dass ein 
Ausgang beim Schalten so etwas wie eine Nachricht in die Queue stellt, 
die nacheinander abgearbeitet wird. Ist eine Möglichkeit. Interessante 
Frage: Was bedeutet das für die Laufzeit?

Welche anderen Konzepte gibt es?

> Für alle Zwecke wäre das sicher nicht geeignet - und klein wäre so ein
> Projekt auch nicht. Ich will das gar nicht erst anfangen, deshalb kann
> ich auch nicht erwarten, dass es ein anderer tut. Ist nur eine Idee.

Ich hatte mal ein Spielsystem programmiert um damit Logik-Schaltungen zu 
simulieren.

Einzelne Objekte wurden mittels Kabel-Objekten miteinander verbunden. 
Das Kabel-Objekt stellte die Verbindung von Ausgang zum nächsten Eingang 
her. Änderte ein Objekt seinen Ausgang, dann benachrichtigte es das an 
diesem Ausgang hängende Kabel-Objekt, welches wiederrum den Eingang des 
nächsten Objektes von der Veränderung informierte. Änderungen an 
Eingängen wurden nicht gleich in die Objektlogik mit einbezogen, sondern 
es gab so etwas wie einen Eingangspuffer, der die Änderung 
zwischenspeicherte. Erst nachdem alle Objekte einen Durchgang komplett 
hinter sich gebracht haben, kam dann der große Sync-Puls und alle 
Objekte übernahmen die Eingangspuffer in ihre interne Logik.

Der Teufel steckte im Detail. Nach ein wenig spielen und experimentieren 
hab ich das aber wieder einschlafen lassen. Beruflich hatten sich andere 
Prioritäten ergeben.

(Allerdings sind wir jetzt schon weit Off-topic. Wir sollten dem TO 
nicht seinen Thread zerstören.)

von Yalu X. (yalu) (Moderator)


Lesenswert?

Martin schrieb:
> Kauf dir das Drachenbuch (Compilerbau, Aho, Sethi, Ullman) in der
> deutschen Übersetzung (2 Teile), arbeite es vollständig durch (6 Monate,
> vielleicht länger), danach melde dich wieder.

Wenn Time-to-Market ein Kriterium ist: Die englische Originalversion ist
einbändig und geht schon in 4 Monaten :)

von Martin (Gast)


Lesenswert?

... Wenn Time-to-Market ein Kriterium ist: Die englische Originalversion 
ist einbändig und geht schon in 4 Monaten :) ...


I find it hard to believe
That all the pain that we are feeling
Has some meaning in this world
It's so hard to believe
That everything you see is different
From the things that you've been told

[Eraserheads ]

von Karl H. (kbuchegg)


Lesenswert?

Yalu X. schrieb:
> Martin schrieb:
>> Kauf dir das Drachenbuch (Compilerbau, Aho, Sethi, Ullman) in der
>> deutschen Übersetzung (2 Teile), arbeite es vollständig durch (6 Monate,
>> vielleicht länger), danach melde dich wieder.
>
> Wenn Time-to-Market ein Kriterium ist: Die englische Originalversion ist
> einbändig und geht schon in 4 Monaten :)

Du meinst: die erste Lesung :-)

von Detlev T. (detlevt)


Lesenswert?

Karl heinz Buchegger schrieb:
> Und genau da fängt die Sache dann an interessant zu werden. Ist es
> möglich, aus der Verschaltung eine 'optimale' Abarbeitungsreihenfolge
> der Objekte zu generieren oder lebt man damit, einfach alle Objekte
> Round-Robin mässig durchzuhacheln, selbst wenn sich an den Eingängen
> dieser Objekte nichts verändert hat.

Vorbelastet bin ich mit HP-Vee (so eine Art primitives Labview) und der 
QT-Bibliothek. Daraus ziehe ich meine Ideen.

Die Nachrichten-Queue wäre ein FIFO, das heißt die ältesten Nachrichten 
werden als erstes abgearbeitet. Wenn ein Ausgang auf mehrere Eingänge 
geht, gibt es keine Vorgabe, in welcher Reihenfolge die Objekte 
aufgerufen werden. Zeitkritische Dinge müsste man in ISRs (und C) 
programmieren, auf dessen "volatile"-Daten dann ein entsprechendes 
Objekt zugreift.

Objekte würden erst einmal nur dann aufgerufen, wenn es eine Nachricht 
an sie gibt. Allerdings muss es auch Objekte geben, die eine solche 
Kette von Nachrichten initieren können, sonst passiert ja gar nichts. 
Also ein z.B. "Pin-Change-Objekt", das eine Nachricht erzeugt, wenn sich 
am Eingang etwas tut. Ein "RS232-Objekt", das eine Nachricht aussendet, 
wenn ein Zeichen empfangen wurde usw. Diese warten auf keine Nachricht 
eines anderen Objektes, müssten also auf andere Weise angestoßen werden. 
Ob der Scheduler "weiß", welche Objekte regelmäßig einen Tritt brauchen 
oder ob die entsprechende Methoden der anderen Objekte einfach leer 
sind, das müsste man noch überlegen.

Was Laufzeit, Speicherverbrauch etc. betrifft, wäre das verglichen mit 
handoptimierten C oder gar Assembler natürlich grottenschlecht. 
Echtzeitanwendungen kann man da getrost vergessen, soweit man das nicht 
in einer ISR erledigen kann. ABER viele Projekte sind ja gar nicht so 
kritisch.

Den Overhead durch C++ kann man vielleicht sogar noch stark reduzieren, 
weil ja schon der Code-Generator "weiß" welche Objekte es gibt und diese 
auch von Anfang an existieren. Dynamische Erzeugung mit "new" und 
"delete", was beim avr-gcc sowieso nicht geht, wird daher gar nicht 
gebraucht. Auch virtuelle Funktionen könnte man ggf. vermeiden. 
Eventuell kommt man sogar mit einer C-Erweiterung aus wie zu Urzeiten 
von C++ aus, indem man den Funktionen einen Zeiger "this" auf die 
eigenen Daten übergibt. Das weiß man aber erst, wenn man die 
Anforderungen genau formuliert hat.

Den so erzeugten Code darf man sich dann wohl nicht ansehen, wenn man 
gerade etwas gegessen hat - muss man ja aber auch nicht. ;)

von hp-freund (Gast)


Lesenswert?

Die Sache scheint nicht einfach zu sein.
Auf diese Seite schaue ich schon erwartungsvoll seit Anfang des Jahres:

http://www.avrtools.no/

Zumindest kann es als Anregung dienen.

von Karl H. (kbuchegg)


Lesenswert?

hp-freund schrieb:
> Die Sache scheint nicht einfach zu sein.
> Auf diese Seite schaue ich schon erwartungsvoll seit Anfang des Jahres:

Genau das meine ich:
Enthusiastisch losgelegt - und dann stellt sich alles als nicht ganz so 
einfach dar, wie ursprünglich angedacht.


> http://www.avrtools.no/
>
> Zumindest kann es als Anregung dienen.

Ob das ein Web-Fehler ist?
[quote]
Frequency counter Max 10 Hz
[/quote]

Da fehlen zb viele Dinge, die man mit Timer machen kann.

von Detlev T. (detlevt)


Lesenswert?

@hp-freund
Zu viel vorgenommen und daran gescheitert, schätze ich einmal. Das 
Bedürfnis nach dieser Art von Programmierung ist offenbar nicht nur bei 
mir da. Aber ein kommerzielles Projekt hat natürlich zwei große 
Probleme. Man muss erstens gleich am Anfang viel bieten und dann laufen 
einem zweitens die Kosten davon, weil man alles selbst machen muss.

Meine Vorstellung ist eher ein Framework, wo die Objektklassen erst nach 
und nach entstehen. Das kann man natürlich so nicht verkaufen. Da muss 
erst einmal eine Community entstehen, die diese Module frei tauscht. 
Vielleicht macht auch einer den Codegenerator und ein anderer 
programmiert die GUI-IDE dazu. Opensource macht vieles möglich, was 
kommerziell nicht geht. Und wenn erst einmal nur ein bestimmter 
Controller unterstützt wird? Who cares. Wäre doch zumindest ein Anfang.

von Karl H. (kbuchegg)


Lesenswert?

Karl heinz Buchegger schrieb:

> Genau das meine ich:
> Enthusiastisch losgelegt - und dann stellt sich alles als nicht ganz so
> einfach dar, wie ursprünglich angedacht.

Das ist bei Programmiersprachen auch nicht anders.
So eine Entwicklung steht und fällt damit, ob man BASCOM Paroli bieten 
kann oder nicht. Und dazu benötigt man wiederrum diese vorgefertigten 
Plug/Play Module.
Ansonsten sagt sich jeder: OK, noch ein BASIC; aber was hab ich für 
einen Mehrwert gegenüber zb. C? Das bischen andere Syntax beeindruckt 
mich nicht wirklich und mit WinAVR oder IAR gibt es genügend ausgereifte 
Pakete, die man auch industriell einsetzen kann ohne sich mit 
Kinderkrankheiten rumschlagen zu müssen.

Kein Mehrwert -> kaum praktischer Einsatz -> kaum Weiterentwicklung.

Ich hab einfach schon zu viele Projekte gesehen, die zwar als 
Labormuster toll ausgesehen haben, aber alle vor der praktischen 
Einsetzbarkeit eingeschlafen sind. Und da nehme ich durchaus meine 
eigenen Projekte nicht aus.

von Andreas (Gast)


Lesenswert?

Mega schrieb:
> Die Graphische Sache ist da echt interessant!
>
> Ein netter Ansatz ist z.b. MircoSPS von CadSoft
> http://www.cadsoft.de/microsps/index.htm

Von der MicroSPS gibt es auch eine Neuentwicklung.
http://www.microsps.net/

von Adrian (Gast)


Lesenswert?

Sven P.:
Wenn du eh kein Interesse an einer Alternative zu BASCOM hast dann spar 
dir die Kommentare. Hier geht es um eine Basic alternative.

>Karl heinz Buchegger:
>Den ersten Syntax Parser schreibt man selber um zu wissen wie das geht.
>Aber spätestens beim 5.ten ist es nur noch Zeitverschwendung den
>Syntaxparser mit der Hand zu schreiben. Das kann ein Tool genausogut.

Ich habe eben erst einen Syntaxparser geschrieben. Bin noch nicht beim 
fünften angelangt. Somit wird mein zweiter auch selbst gemacht.
Schön das es third-party-Produkte auch können.


>Karl heinz Buchegger:
>Was soll konkret aus deinem Machwerk hinten rauskommen und wie stellst
>du dir vor, dass du VB da mitbenutzen kannst?
>Deine Scriptsprachen in allen Ehren, aber auch du wirst es nicht
>schaffen, die Scripting Runtim auf einem AVR zum laufen zu bekommen.
>Also muss dein Machwerk wohl oder übel Assembler erzeugen. Nur wie
>machst du das?

Ganz einfach und zum 1000sten mal:
Ein VB-Programm generiert Assembler-Anweisungen.
Also verschone mich mit Unterstellungen ich wollte die Runtime in den 
AVR laden wollen!!!!

>print ( 3 + 5 ) * 8

Wenn meine Scriptsprache das von alleine parsen kann dann wird es auch 
ein Assembler-Proggi tun. Nur das man sich um mehr Gedanken machen muss.


>Es sagt sich leicht: 90 Euro ist mir zuviel, na dann schreib ich mir das
>halt selber. Und ach ja, objektorientiert soll es auch noch sein.

Wo habe ich behauptet das mir 90 € zu viel wären? Es geht immer noch um 
Hobby und die verbundene "Zeitverschwendung"



>Es gibt doch schon Arduino und Processing, wozu dann noch Basic?

Es gibt doch Mercedes. Wozu dann noch Opel?



Detlev T.:
Danke! Endlich mal Anregungen und Ideen. Wenn hier jedoch zu 90% kein 
Interesse besteht sondern nur Zweifel und fehlendes Verständnis lasse 
ich es doch sein. Ich hab noch mehr als genug andere Projekte für meine 
verschwendete Hobbyzeit.

von Klaus (Gast)


Lesenswert?

Hallo Adrian,

das, was du tun willst, ist schon ein richtiger Compiler - ein Compiler 
übersetzt eine Eingabesprache (z.B. Basic) in eine andere (z.B. 
Assembler).
Mir haben vor vielen Jahren mal die Crenshaw Texte 
(http://compilers.iecc.com/crenshaw/ ) geholfen, da da sehr wenig Wert 
auf theoretische Informatik gelegt wird. Das "Drachenbuch" von  Aho, 
Sethi, Ullman verlangt da deutlich mehr - mehr als ich damals als 
16-jähriger verstanden habe. Allerdings konnte ich den ab S. 31 der 
deutschen Ausgabe (Kapitel 2) beschriebenen Ein-Pass-Compiler verstehen 
und erweitern - ein bischen C sollte man aber schon können. Crenshaw 
verwendet dagegen Pascal als Syntax. Ein anderes, kleines, nettes 
Büchlein ist Nikolaus Wirths "Compilerbau". Dort ist ebenfalls mit wenig 
theoretischer Informatik ein kompletter Compiler beschrieben.
Alle Ansätze haben aber den Nachteil, das der entstehende 
Ein-Pass-Compiler nur einen sauschlechten Code generiert. Man kann dem 
mit etwas Mühe ein bischen Abhilfe schaffen, ist dann aber immer noch 
Lichtjahre von dem kompakten Code weg, den z.B. der gcc generiert. Dazu 
braucht man die ganze Prozedur, wie es. z.B. im Drachenbuch ab S. 
100/Kapitel 3 beschrieben wird. Da ist die Lernkurve dann wesentlich 
steiler und insg. arbeitsintensiver.

Einen kleinen Compiler selbst zu schreiben kann wirklich Spass machen. 
Ihn aber gut / konkurenzfähig hinzukriegen, ist ein hartes Stück Arbeit 
und macht irgendwann u.U. keinen Spass mehr. Das Problem ist nun, dass 
man grad für AVR einen kompakten Code braucht, da sonst der kleine 
Speicher zu schnell voll ist.

Also, lass dir nicht den Spass verderben und fang' an! Allerdings wird 
es wohl ein langer, steiniger Weg, bis du wirklich eine brauchbare 
Alternative zu bascom hast. Wenn das forschen / programmieren im 
Vordergrund steht, probiers. Wenn du nur auf das Ergebnis zielst - kauf 
dir lieber den bascom.

Just my two cents,

Klaus

von Detlev T. (detlevt)


Lesenswert?

Nach meinem Ausflug in die grafische Programmierung zurück zum 
ursprünglichen Thema.

Ich denke nicht, dass es unbedingt noch einen neuen Basic, C oder sonst 
was Compiler braucht. BASCOM hat aus meiner Sicht einige Mängel, 
insbesondere dass man nur eine Rechenoperation pro Zeile ausführen kann 
und fehlerträchtig mit Hilfsvariablen operieren muss, sowie das massive 
Vertrödeln von Rechenzeit. Offenbar ist das aber für viele nicht 
gravierend, sonst würden sie diesen Compiler ja nicht nutzen.

Vorschlag für einen anderen Ansatz: Abgesehen von Spezialanwendungen 
(Würfel, Lottozahlengenerator) soll das Verhalten eines Controllers 
nicht zufällig, causal und deterministisch sein. Auf deutsch: Der 
Zustand eines Ausgangs muss eine Funktion der Zustände aller Eingänge 
sein, die sie seit dem Einschalten hatten. Würde man also die Zustände 
aller Eingänge seit dem Einschalten mitloggen, könnte man den Zustand 
des Ausgangs aus diesen Daten berechnen.

Technisch ist der direkte Weg natürlich nicht zu realisieren, weil man 
dazu praktisch unendlich viel Speicher zur Verfügung haben müsste und 
die Auswertung auch praktisch unendlich lange dauern würde. Man muss 
also von vornherein wissen, was geloggt werden muss.

Ich komme auf die Idee der objektorientierten Programmierung zurück. 
Nehmen wir an, man definiert einen Strauß "Watcher". Das sind Objekte, 
die einen (oder mehrere) Eingänge beobachten und nur das, was 
"interessant" ist, protokollieren. Ein Watcher könnte zum Beispiel 
protokollieren, ob eine Signalflanke aufgetreten ist. Ein anderer, ob 
ein Impuls aufgetreten ist und seine zeitliche Länge protokollieren. Ein 
dritter protokolliert die letzten n Messungen eines ADC-Wandlers usw.

Die Steuerung der Ausgänge übernehmen andere Objekte, die dazu auf das 
"Wissen" der Watcher zurückgreifen, nennen wir sie "Worker". 
Wahrscheinlich wird man dazwischen noch andere Objekte schalten können 
müssen, die Daten verarbeiten können, damit die Zahl der Objekte nicht 
ins unendliche steigt. Nennen wir diese dritte Gruppe "Thinker".

Mit diesen "Bausteinen" beschreibt man dann seine Anwendung. Als erstes 
beschreibt man alle Objekte, die man nutzen will und gibt ihnen Namen. 
Dann beschreibt man die Nachrichten-"Ketten", das heißt zu jedem 
"Worker" gibt man an, welches andere Objekt er "fragen" muss um den 
gewünschten Zustand des Ausgangs zu berechnen. Das geht also faktisch 
den umgekehrten Weg wie in der oben beschriebenen grafischen Lösung, wo 
quasi die "Watcher" die Aktionen starten.

Beispiel Monoflop:
An PD7 soll ein 100µs langer Impuls erscheinen, wenn an PD1 (=INT0) eine 
FLanke detektiert wird.   Ich brauche: Einen Worker "Impuls" und einen 
Watcher "Flanke". Der Ausgangszustand (Impuls oder kein Impuls) hängt 
vom Wert des Watchers ab: Flanke seit der letzten Frage oder nicht. Das 
könnte vielleicht so aussehen:
1
worker_puls Impuls(PD7,100);
2
watcher_slope Flanke(PD1, negative);
3
4
Impuls <= Flanke;

Beispiel PID-Regler:
Ein PWM-Ausgang soll etwas steuern, Messwerte kommen über ADC0 herein. 
Jede 10ms soll gemessen werden und die letzten 8 Werte gespeichert 
werden. Die Parameter des Reglers soll durch Daten aus der 
RS232-Schnittstelle verändert werden können.
1
watcher_adc adc(ADC0, 10000, 8);
2
thinker_pid pid(23,7,4);
3
worker_pwm pwm(PWM0);
4
interface_rs232 control(UART0, 9600, 8, 1, N);
5
6
pwm<=pid;
7
pid<=(adc , control);
Der PID-Regler "fragt" also den ADC-Wandler nach neuen Werten und die 
RS232-Schnittstelle nach neuen Parametern.

Ich hoffe es wird klar, was mir da vorschwebt.

von Karl H. (kbuchegg)


Lesenswert?

Detlev T. schrieb:

> Ich hoffe es wird klar, was mir da vorschwebt.

Die Idee ist schon klar.
Du willst Standardbauelemente, die über Standardfunktionalität verfügen. 
Ähnlich wie eine mathematische Funktionen ein ganz bestimmtes Verhalten 
hat wenn man sie nach dem Funkionswert für eine Variablenbelegung 
befragt. Und ähnlich wie bei anderen Ansätzen, lautet für jedes Objekt 
die Frage: "Wie komme ich zu meinen Eingangswerten" und nicht wie im 
klassischen Ansatz "Ich hab da einen Wert was tu ich damit"

Der entscheidende Punkt ist für mich: Wieviel Funktionalität stopfst du 
in ein Objekt. Im Moment hast du extreme High-Level Objekte, die 
wahsinnig intelligent sind. Hinter

   pid<=(adc , control);

(mir gehts jetzt zb nur um die UART) steckt schon eine Menge Know How 
über UART Übertragung. Soll ein
   watcher_adc adc(ADC0, 10000, 8);
watcher_adc wirklich über eine Queue verfügen, oder war das nicht besser 
eine Sache für ein
   thinker_queue queue( 8 );
   queue <= adc;
   pid <= queue;

(wobei mir gerade der Gaedanke kommt, dass das ja keine Queue im 
klassischen Sinne ist, sonder ein äh 'last recently values' Objekt. 
Egal, du weißt was ich meine)

Aber alles in allem eine interessante Idee.

von Vlad T. (vlad_tepesch)


Lesenswert?

Adrian schrieb:
> Ganz einfach und zum 1000sten mal:
> Ein VB-Programm generiert Assembler-Anweisungen.

Klaus schrieb:
> Ein-Pass-Compiler nur einen sauschlechten Code generiert. Man kann dem
> mit etwas Mühe ein bischen Abhilfe schaffen, ist dann aber immer noch
> Lichtjahre von dem kompakten Code weg, den z.B. der gcc generiert.

genau aus dem grund würde ich an deiner Stelle einen VB->C compiler 
bauen.
Das hat den riesen Vorteil, dass du dich 'nur' um die Codegenerierung 
und die Objekte kümmern musst.
Die optimierung und größtenteils auch die Anpassung an verschiedenen 
AVRs kriegst du kostenlos von der avr-libc

von Karl H. (kbuchegg)


Lesenswert?

Adrian schrieb:

>>print ( 3 + 5 ) * 8
>
> Wenn meine Scriptsprache das von alleine parsen kann dann wird es auch
> ein Assembler-Proggi tun.

Siehst du.
Genau an dieser Stelle kommt bei mir schon wieder das Problem hoch, dass 
diese Antwort die Frage nicht beantwortet. Ein Assembler-Proggi parst 
diese Programmzeile nicht, sie implementiert sie. Das ist nichts mehr 
mit parsen. Das Parsen ist zu diesem Zeitpunkt schon längst erledigt, 
das geht das Assembler Programm nichts mehr an. Es sei denn du baust 
einen Interpreter. Dann reden wir aber von etwas ganz anderem, als dem 
wovon im Eröffnungsposting bzw. im ganzen Thread implizit die Rede war.


Auch deine Verwendung des Terminus "Skript" verwirrt micht. Ein Skript 
ist üblicherweise etwas was tatäschlich interpretierend abgearbeitet 
wird. Es gibt eine Runtime, die sich den Quellcode vornimmt, diesen 
parst und jede Anweisung sofort nach dem Parsen ausführt. Typische 
Anwendungen davon sind Command-Line Parser bzw. deren 
Programmiersprache. Bei einem Compiler ist die Sache aber völlig anders. 
Der muss sich mit Problemen rumschlagen, die ein Interpreter so 
normalerweise gar nicht hat, wie zb. Register-Allocation oder 
Life-span-Analysis. Dafür holt man aber mit einem Compiler den vollen 
Speed aus der CPU heraus, getoppt nur noch von einem guten 
Assembler-Programmierer. Warum? Weil ein Compiler ein Programm, 
zumindest aber eine Funktion, in seiner Gesamtheit betrachtet und sich 
nicht nur 1 Programmzeile nach der nächsten vornimmt.

Und genau an dieser Stelle widersprechen sich deine Aussagen immer 
wieder. Zeitweilig sieht es so aus, als ob du tatsächlich einen Compiler 
bauen willst, andere Aussagen hingegen gehen wieder mehr in Richtung 
Interpreter. Und genau aus diesem Grund hab ich konkret nachgefragt, wie 
genau du dir das Behandeln der Eingabe

   print ( 3 + 5 ) * 8

vorstellst (wobei ich besser eine der Konstanten durch eine Variable 
ersetzt hätte). Und deine ausweichende Antwort befriedigt mich ehrlich 
gesagt nicht wirklich. Ich weiß immer noch nicht: baust du jetzt einen 
Compiler, oder wird es doch ein Interpreter, oder vielleicht ein 
Mittelding ala P-Code mit einer virtuellen CPU?

Mir kommt auch vor du bist der Ansicht, du brauchst da nur einen Parser 
(den du anscheinen schon hast?) und dann hinten nach noch ein wenig 
Bytewurschteln und fertig ist die Sache. Für einen Compiler ist das aber 
völlig falsch. Das Syntaxparsen ist für einen Compiler der einfachste 
Teil der Übung, der auch noch am schnellsten und problemlosesten zu 
erledigen ist. Erst die Teile nach dem Syntaxparsen sind die 
aufwändigen, die interessanten und die anspruchsvollen. Vom Syntaxparsen 
bis zur Generierung des eigentlichen Assembler-Codes der dem 
Eingabeprogramm entspricht, ist es ein weiter Weg.

Vielleicht kannst du diesen Punkt vorab dann doch noch zufriedenstellend 
klären. Wenn du Mitstreiter für das Projekt suchst, wäre es IMHO schon 
ganz gut, wenn sie vorab schon wenigstens in groben Zügen wüssten wohin 
die Reise gehen soll und womit die Strecke zurückgelegt wird.

Ev. wäre es ganz gut, wenn du erst mal vorstellst, welche Teile du schon 
hast und wie man die weiterbenutzen könnte. Zwischen den Zeilen klingt 
immer wieder an, dass du einen Parser zur Verfügung hast. Also: Was 
kommt da hinten raus? Was macht der Parser? Wie könnte man den in deinem 
neuen Projekt einsetzen?

> Ein VB-Programm generiert Assembler-Anweisungen.

Ein Schachprogramm spielt Schach.
Weiß ich deswegen wie es das macht? Nein. Nach welchen Prinzipien macht 
es das? Fehlanzeige.
Man kann die Arbeitsweise eines Schachprogramms durchaus beschreiben, 
ohne sich gleich in Programmierdetails zu verlieren.

In deiner Aussage steckt mir einfach zuwenig konkret verwertbare 
Information. Das ist mir persönlich alles (noch) zu wischi-waschi als 
das ich sagen würde: paaaaast, ich könnte den und den Teil übernehmen.

Und es tut mir leid. Aber solche Aussagen ....

> Sollte anschließend kein Problem sein das Assemblerfile
> bzw Hex-File zu kompillieren und dann über ein anderes Programm
> in den Flash laden.

> Geplant ist das die Assemblerschnipsel je nach Plattform und
> Prozessor immer passend erstellt werden.

> Also es sollte ein Codegenerator werden. Das hat ziemlich gar
> nichts mit einem Compiler zu tun.

> Und nochmal zum merken:
> ==================================================================
> ES WIRD KEIN COMPILER SONDERN EIN CODEGENERATOR (VB -> ASSEMBLER)!
> ==================================================================

... in ihrer Gesamtheit gesehen stärken nun mal mitnichten mein 
Vertrauen darin, dass du weißt was da auf dich zukommt. Ein Programm von 
einer Hochsprache auf Assembler zu übersetzen ist ein klein wenig 
komplizierter als vorgefertigte Assembler-Codestückchen 
aneinanderzureihen.

von Detlev T. (detlevt)


Lesenswert?

Karl heinz Buchegger schrieb:
> Der entscheidende Punkt ist für mich: Wieviel Funktionalität stopfst du
> in ein Objekt. Im Moment hast du extreme High-Level Objekte, die
> wahsinnig intelligent sind.
Das ist Absicht. Kleinen Kindern gibt man große Bauklötze. Es ist nicht 
das Ziel, die eierlegende Wollmilchsau der Controller-Programmierung zu 
erfinden. Es wird immer wieder Aufgaben geben, die damit nicht 
realisierbar sind.

Karl heinz Buchegger schrieb:
> (mir gehts jetzt zb nur um die UART) steckt schon eine Menge Know How
> über UART Übertragung.
Das verstehe ich nicht ganz. Im Endeffekt muss der Host am anderen Ende 
der Leitung eine Nachricht schicken, die der Worker adc verstehen kann. 
Oder man schaltet einen Thinker "Extractor" dazwischen, der die 
Nachricht vom Host für den Worker adc verdaulich macht.

Wie schon oben bei der "grafischen" Lösung muss das System aber 
natürlich offen sein. Das heißt, der Nutzer muss eigene Objektklassen 
programmieren können, vielleicht in etwas, das wie C aussieht. ;) Könnte 
man z.B. aus irgendeinem Grund das Programm auf dem Host nicht ändern, 
müsste man ggf. eine neue Thinker-Klasse programmieren - Aber eben auch 
nur die.

Karl heinz Buchegger schrieb:
> Soll ein
>    watcher_adc adc(ADC0, 10000, 8);
> watcher_adc wirklich über eine Queue verfügen, oder war das nicht besser
> eine Sache für ein
>    thinker_queue queue( 8 );
>    queue <= adc;
>    pid <= queue;
Äh, nee, eher nicht. Erstens muss eine solcher "Thinker" (nennen wir ihn 
Collector) ja jede Form von Daten sammeln können, ggf auch Kollektionen 
von anderen Thinkern seiner Art. Das ist ineffizient und gibt sicher 
schnell Probleme.

Schwerwiegender ist aber der Bruch im Konzept. Ich denke ja von den 
Workern her. Ein Thinker wird nur dann "gefragt", wenn ein Worker etwas 
wissen will. Bei deiner Idee müsste der Thinker Collector von sich aus 
den adc regelmäßig abfragen. Mein Bauchgefühl sagt mir, dass das 
Nachteile hat.

Noch ein Programmbeispiel. Was macht es?
1
worker_pwm pwm(PWM0);
2
thinker_pid pid(23,7,4);
3
thinker_add add;
4
thinker_const offset(0.4);
5
watcher_adc adc(ADC0, 10000, 8);
6
watcher_rs232 control(UART0, 9600, 8, 1, N);
7
8
pwm <= add;
9
add <= (pid , offset);
10
pid <= (adc , control);
Und was mir noch einfällt: Wenn das Konzept so erst einmal funzen 
sollte, könnte man sich an eine GUI machen. :D

PS: Was mir gerade noch einfällt. Parameter der Objekte wären 
(teilweise) optional. "watcher_adc adc(ADC0);" wäre zum Beispiel ein 
Objekt, dass keine Daten sammelt und nur den aktuell gemessenen Wert 
zurückgibt. "watcher_adc adc(ADC0,10000);" würde auch nicht sammeln, 
aber automatisch alle 10ms messen usw.

von Karl H. (kbuchegg)


Lesenswert?

Detlev T. schrieb:
> Karl heinz Buchegger schrieb:
>> Der entscheidende Punkt ist für mich: Wieviel Funktionalität stopfst du
>> in ein Objekt. Im Moment hast du extreme High-Level Objekte, die
>> wahsinnig intelligent sind.
> Das ist Absicht. Kleinen Kindern gibt man große Bauklötze.

OK.
Mein Einwand geht dann auch mehr in die Richtung, die ich das 
Lego-Syndrom nennen möchte: Für jeden Sch... einen eigenen Baustein.
(Gemeint ist: Früher(tm) gab es von Lego eine Handvoll Grundbausteine, 
mit denen man das meiste erledigen konnte. Mach heute eine 
Lego-Schachtel auf und du findest da drinnen haufenweise Spezialteile, 
die nur bei diesem einen Modell einsetzbar sind. Die Einfachheit des 
Systems von früher wurde irgendwann aufgegeben)

Klar muss es Spezialitäten geben. Da wird man nicht drumherum kommen. 
Die Frage ist nur, wo hört man auf, die Objekte mit immer mehr 
Funktionalität vollzustopfen.

>> (mir gehts jetzt zb nur um die UART) steckt schon eine Menge Know How
>> über UART Übertragung.
> Das verstehe ich nicht ganz. Im Endeffekt muss der Host am anderen Ende
> der Leitung eine Nachricht schicken, die der Worker adc verstehen kann.

D.h. ich muss den Host an das ADC Objekt anpassen. Ich bin nicht mehr 
frei in meiner Entscheidung wie genau ich die Übertragung machen will.

> Oder man schaltet einen Thinker "Extractor" dazwischen, der die
> Nachricht vom Host für den Worker adc verdaulich macht.

Das klingt für mich schon besser.

> Wie schon oben bei der "grafischen" Lösung muss das System aber
> natürlich offen sein. Das heißt, der Nutzer muss eigene Objektklassen
> programmieren können, vielleicht in etwas, das wie C aussieht.

Davon geh ich sowieso aus

>> Soll ein
>>    watcher_adc adc(ADC0, 10000, 8);
>> watcher_adc wirklich über eine Queue verfügen, oder war das nicht besser
>> eine Sache für ein
>>    thinker_queue queue( 8 );
>>    queue <= adc;
>>    pid <= queue;
> Äh, nee, eher nicht. Erstens muss eine solcher "Thinker" (nennen wir ihn
> Collector) ja jede Form von Daten sammeln können, ggf auch Kollektionen
> von anderen Thinkern seiner Art. Das ist ineffizient und gibt sicher
> schnell Probleme.
>
> Schwerwiegender ist aber der Bruch im Konzept. Ich denke ja von den
> Workern her. Ein Thinker wird nur dann "gefragt", wenn ein Worker etwas
> wissen will. Bei deiner Idee müsste der Thinker Collector von sich aus
> den adc regelmäßig abfragen.

Hast du nicht denselben Bruch auch in einem PID Regler bzw. in allen 
Thinkern, die es sich nicht leisten können nur dann Arbeit zu 
verrichten, wenn sie von einem Worker nach Werten gefragt werden? Was 
ist mit dem Extractor Objekt von weiter oben, das du postuliert hast um 
eine Protokollschicht in die UART zu bekommen? Ist das nicht im Prinzip 
genau dasselbe Problem?
Vielleicht könnte eine Lösung darin bestehen, dass ein Watcher sich auch 
auf andere Watcher beziehen kann. Dann wäre das Queue Objekt oder der 
Extractor oder PID Regler auch nichts anderes als ein Watcher. Sie 
überwachen dann keine Hardware sondern eben andere Watcher. Das würde 
die Thinker-Schicht in dem Sinne von eigenständig notwendiger Arbeit 
freihalten wie dir das vorschwebt.

von Detlev T. (detlevt)


Lesenswert?

Karl heinz Buchegger schrieb:
> Hast du nicht denselben Bruch auch in einem PID Regler bzw. in allen
> Thinkern, die es sich nicht leisten können nur dann Arbeit zu
> verrichten, wenn sie von einem Worker nach Werten gefragt werden?

Ich denke, dass du Unrecht hast. Von der Definition her sind Thinker ja 
gerade Objekte, die nur etwas berechnen, wenn sie gefragt werden und 
sich die dafür notwendigen Daten verschaffen. Wenn ein Objekt 
eigenständig etwas tut, ist das nach meiner Philosophie ein "Watcher".

Du denkst meiner Ansicht auch noch in die falsche Richtung. Ein Regler 
ist für dich ein (aktives) Element, das regelt. Das stimmt in diesem 
Konzept aber nicht. Hier ist ein Regler ein Objekt, dass eine Stellwert 
aus Ist-Wert und Soll-Wert berechnet, also ein Thinker. Dabei muss man 
für eine PID-Regler auch die Ist-Werte der Vergangenheit kennen. (Nennt 
man die dann War-Werte? ;-) ) Die liefert der Watcher adc.

Ich merke auch gerade, dass ich bei PID-Regler den Sollwert vergessen 
habe. (Naja, Alpha-Version. ;) )

OK. 2. Versuch
1
worker_pwm pwm(PWM0);
2
thinker_pid pid();
3
thinker_textextractor p("P=",24);
4
thinker_textextractor i("I=",7);
5
thinker_textextractor d("D=",4);
6
thinker_textextractor soll("SOLL=",0);
7
watcher_rs232 interface(UART0, 9600, 8, 1, N);
8
watcher_adc(ADC0, 10000, 8);
9
10
pwm  <= pid;
11
pid  <= (adc, soll, p, i, d);
12
p    <= interface;
13
i    <= interface;
14
d    <= interface;
15
soll <= interface;
Und fertig ist der PID-Regler mit RS232-Schnittstelle. :D

von Karl H. (kbuchegg)


Lesenswert?

Detlev T. schrieb:

> Ich denke, dass du Unrecht hast. Von der Definition her sind Thinker ja
> gerade Objekte, die nur etwas berechnen, wenn sie gefragt werden und
> sich die dafür notwendigen Daten verschaffen. Wenn ein Objekt
> eigenständig etwas tut, ist das nach meiner Philosophie ein "Watcher".

Nein, nein. Das hab ich schon so verstanden.
Daher hab ich ja auch im vorhergehenden Posting noch den Vorschlag 
gemacht, dass Watcher sich auch auf andere Watcher beziehen könnten um 
sie auf Veränderungen zu 'überwachen'.

von Detlev T. (detlevt)


Lesenswert?

Karl heinz Buchegger schrieb:
> Daher hab ich ja auch im vorhergehenden Posting noch den Vorschlag
> gemacht, dass Watcher sich auch auf andere Watcher beziehen könnten um
> sie auf Veränderungen zu 'überwachen'.

Eigentlich sollte das ja der erste Watcher schon tun.

Das größte Problem bei meinem Konzept sehe ich bei bidirektionalen 
Elementen. Das geht bei der RS232 ja schon los. Empfang geht ja noch als 
"Watcher". Aber wie passt der Ausgang ins Konzept? Soll man das als 
Worker implementieren, der die anderen Objekte dauernd mit der Frage 
nervt, ob es etwas zu senden gibt?

Gut das ginge vielleicht auch noch. Hohe Performance steht ja nicht im 
Pflichtenheft. ;-) Mit der SPI-Schnittstelle wird es schon schwieriger. 
Das ist ja Ein- und Ausgabe gleichzeitig und das wird bei manchen ICs 
auch genutzt. Wahrscheinlich wird man die Kommunikation zwischen den 
Objekten auch bidirektional auslegen müssen. Also dass die "Antwort" 
auch von der "Frage" abhängen kann. Die Frage könnte dann auch sein 
"gibt es etwas Neues, und wenn ja, was?" womit dann wohl auch keine 
"Watcher für Watcher" nötig wären.

Vielleicht kommt am Ende sogar heraus, dass diese strenge 
Klassifizierung "Worker", "Thinker" und "Watcher" gar nicht 
durchzuhalten ist und man kommt am Ende wieder bei der "grafischen" 
Lösung heraus. Also einfach Objekte, die Datenobjekte senden und 
empfangen.

Aber auch das wäre ja nicht unbedingt schlecht. Wäre vielleicht ein 
Anfang, dem man später eine GUI überstülpen kann.

von Detlev T. (detlevt)


Lesenswert?

Ich hatte gerade noch so eine Idee.

Es gibt hier um Forum ein paar Threads, die sich mit einem 
Basic-Interpreter beschäftigen. Ich musste da an meine Anfangszeit mit 
Computern (Ich gehöre zur C64-Generation) denken. Der große Vorteil war 
da, dass man Dinge einfach und schnell ausprobieren konnte. Also 
Basic-Befehle einfach eingeben und gucken, was passiert. Danach konnte 
man die Befehle 1:1 auch in einem Programm verwenden. Die Rechenleistung 
dieser Interpreter war natürlich grottenschlecht, "Syntax-" und "Type 
Mismatch-" Fehler wurden erst zur Laufzeit entdeckt, aber die 
Einstiegsschwelle für Anfänger war sehr niedrig.

Danach kamen Basic-Compiler auf. Dort konnte man dann den zuvor 
erstellten Interpreter-"Sourcecode" direkt in ein lauffähiges Programm 
compilieren, das dann natürlich viel schneller ausgeführt wurde.

So etwas fehlt aus meiner Sicht noch bei den Mikrocontrollern. Nicht 
eine zweite, eierlegende Wollmilchsau wie BASCOM, womit man praktisch 
alle denkbaren Projekte mit erstellen könnte. Sondern ein interaktives 
Entwicklungssystem für zeitunkritische Applikationen und Einsteiger.

Vorstellen könnte ich mir da ein Entwicklungssystem auf Basis des 
ATMEGA1284p. Der hat 16kiB SRAM, die man für den Interpreter nutzen 
könnte. Angesteuert würd er über U(S)ART1 und ein Terminalprogramm auf 
dem PC. Dort speichert man auch die Programme im Klartext, Übertragung 
z.B. über YMODEM.

Das Zielsystem für das Compilat könnte dann aber auch ein "kleinerer" 
ATMEGA sein. Ports, Timer, USART0, ADC, SPI und TWI können die ja alle. 
(ATTINY würde ich weglassen) Eventuell könnte man den üppigen 
Flash-Speicher des MEGA1284 auch dazu nutzen, ein Basicprogramm 
abzuspeichern, das dann beim Start automatisch ins SRAM kopiert und 
ausgeführt wird. So wäre der Weg zu einer funktionierenden Applikation 
noch flacher als z.B. beim Arduino Projekt.

Die damit erstellten Programme wären natürlich bei weitem nicht so 
leistungsfähig als wenn man sie mit BASCOM erstellt hätte. Aber das wäre 
ja auch nicht das Ziel.

Nur einmal so als Idee.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Detlev T. schrieb:

> So etwas fehlt aus meiner Sicht noch bei den Mikrocontrollern. Nicht
> eine zweite, eierlegende Wollmilchsau wie BASCOM, womit man praktisch
> alle denkbaren Projekte mit erstellen könnte. Sondern ein interaktives
> Entwicklungssystem für zeitunkritische Applikationen und Einsteiger.

Gibt es IMHO. Nennt sich Shell. Für AVRs schau mal unter Betriebssysteme 
& Co.  im Artikel Linksammlung

von Detlev T. (detlevt)


Lesenswert?

Hallo Stefan,

ich habe mir die Sachen einmal angesehen. Die meisten sind offenbar 
wirklich nicht mehr als eine Shell, also eine Art Kommandozeile. 
Allenfalls Bitlash erlaubt ein bisschen Programmierung über die Makros. 
Das ist weniger, als an was ich gedacht habe. Und die Syntax ist beinahe 
so kryptisch wie Forth, wo es mit amforth wohl schon ein ganz 
brauchbares und leistungsfähigeres  System gibt.

Gruß, DetlevT

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.