Funktionsprogrammierung mit MCU (s)


12

Mit funktionalen Sprachen wie Haskell, LISP oder Scheme kann ein Programmierer schnell mit dem Paradigma der funktionalen Programmierung arbeiten . Sie haben ihre Ineffizienzen , aber meine Anwendung legt mehr Wert auf die Effizienz des Programmierers als auf die Effizienz des Programms.

Ich möchte die funktionale Programmierung eines Mikrocontrollers für die Maschinensteuerung usw. verwenden.

Welche Einschränkungen gibt es, z. B. minimale Systemressourcen?
Welche Beispielimplementierungen dieser Sprachen sind verfügbar?


1
Wenn Ihre Frage lautet: "Lohnt es sich nicht, eine Maschine mit der leistungsfähigsten Programmiersprache zu programmieren, die Sie in die Finger bekommen können?", Sollten Sie die Fragen zu C ++ und Java lesen (über OOP und nicht über funktionale Programmierung).
Kevin Vermeer

1
Ihr erster Absatz wirkt argumentativ, was Ihnen einige knappe Stimmen eingebracht hat. Erwägen Sie eine Umformulierung in etwas Passiveres ("Ich bin daran interessiert, funktionale Programmierung für die Maschinensteuerung zu verwenden, welche Beispiele für Haskell / LISP / Scheme-Implementierungen für eingebettete Systeme gibt es") oder entfernen Sie sie vollständig.
Kevin Vermeer

2
Ich kaufe nicht Ihre "ineffiziente" Aussage. Sie scheinen extreme Vorurteile gegenüber Hobbyisten / Prototypen zu zeigen - geringe Lautstärke (aka: 1). C / C ++ / asm führt zu kleinerem, schnellerem Code, der tausend- oder millionenfach verstärkt wird, wenn Sie Prozessoren mit gerade genügend Geschwindigkeit und Platz verwenden können. Embedded ist eingebettet. Sie programmieren nicht auf einem Allzweckbetriebssystem.
Nick T

4
@Nick T - "C / C ++ / asm führt zu kleinerem, schnellerem Code, der tausend- oder millionenfach verstärkt wird, wenn Sie Prozessoren mit gerade genügend Geschwindigkeit und Platz verwenden können." - Was ist mit Wartung? Eine funktionale Sprache kann häufig in einer einzigen Zeile das tun, was ein C-Programm für 10 Sekunden benötigt, was weniger Platz für Fehler bedeutet. Außerdem können sie eingehalten werden (z. B. Haskell) und auf dem Ziel ausgeführt werden, was schneller als Dolmetscher ist. Ich wollte dieses Thema ein wenig untersuchen, weil eine kompilierte Haskell zwar genauso schnell ist, sich aber schneller entwickeln lässt, als eine C-App. Wollte den Status quo ein bisschen hinterfragen.
J. Polfer

1
@ Sheepsimulator Leider führen Kommentare wie der letzte zu solchen argumentativen Fragen.
Kellenjb

Antworten:


11

ARMPIT SCHEME ist ein Interpreter für die Scheme-Sprache (lexikalischer Dialekt von Lisp), der auf RISC-Mikrocontrollern mit ARM-Kern ausgeführt wird. Es basiert auf der Beschreibung im überarbeiteten Bericht zum Algorithmic Language Scheme (r5rs) mit einigen Erweiterungen (für E / A) und einigen Auslassungen (um in den MCU-Speicher zu passen). Es wurde ferner entwickelt, um Multitasking und Multiprocessing zu unterstützen. Es wird erwartet, dass das Achselhöhlenschema gut für Bildungseinrichtungen geeignet ist, einschließlich Schülerprojekten in Kursen zu Steuerung und Instrumentierung oder in Kursen zur Grundsteinlegung, in denen Mikrocontroller benötigt werden. Es soll das Spektrum der für MCUs verfügbaren interpretierten Sprachen (z. B. BASIC und FORTH) erweitern und kann eine Alternative zu MCU-basierten Bytecode-Interpretern (z. B. für Scheme oder Java) und kompilierten Sprachen (z. B. C) sein.

http://armpit.sourceforge.net/

Du sagst:

Die Verwendung von C, C ++, Assembly usw. ist im Vergleich zu Sprachen wie Haskell, LISP oder Scheme recht ineffizient

Die Verwendung von Hochsprachen ist eine effizientere Verwendung der Programmiererzeit, kann jedoch häufig eine weniger effiziente Verwendung der Rechenressourcen sein. Bei eingebetteten Systemen, die in großen Stückzahlen hergestellt werden, haben Kosten und Leistung oft eine höhere Priorität als der Entwicklungsaufwand.



5

C, C ++ und Assembly kommen der Maschinensprache sehr nahe. Durch die Verwendung einer höheren Sprache fügen Sie zusätzlichen Overhead hinzu, um eine schnellere / einfachere / etc-Entwicklung zu erzielen.


3
-1: Ich stimme dieser Antwort nicht wirklich zu. Obwohl Sie Recht haben, dass Assembly der Maschinensprache nahe kommt, sind C und C ++ sehr unterschiedliche Hochsprachen.
BG100

1
@ BG100, ich würde die "High Level / Low Level" -Linie eigentlich irgendwo in C zeichnen, anstatt sie einfach als Hochsprache zu bezeichnen. Bei der Ausführung von Arithmetik-, Zeiger- (Zeichenfolgen-) Operationen und anderen allgemeinen Grundaufgaben manipuliert die CPU die Daten in der Regel ohne Abstraktionsebenen.
Nick T

@Nick T: Ich verstehe Ihren Standpunkt, aber bedenken Sie Folgendes: Wenn Sie eine Interruptroutine schreiben, die im Allgemeinen so schnell wie möglich ausgeführt werden muss, hätten Sie in C keine Ahnung, wie lange die Ausführung dauern würde, aber in Assembler können Sie dies Zählen Sie einfach die Anweisungen. Ich denke, ein niedriges Level ist das Wissen, dass GENAU in Ihrem Programm vor sich geht. Sie wissen dies nicht genau, wenn Sie C.
BG100 am

@ BG100: Die Ausführung desselben Assembler-Befehls kann abhängig von den Operanden und ihren Adressierungsmodi eine unterschiedliche Anzahl von Zyklen erfordern. In C erhalten Sie jedoch nach dem Kompilieren statischen Code, der sich nicht ändern kann. Es stimmt, dies ist ein etwas dürftiges Argument, aber wenn wir uns über die Minutien streiten wollen, um zu versuchen, eine große rote Linie zu ziehen ...
Nick T

3

Ich habe kürzlich ein ARM-Board in Python programmiert und finde es großartig. Es ist nicht gut für die Echtzeitsteuerung, aber ich mache mehr webbezogene Dinge, was in einer höheren Sprache weitaus angenehmer ist als in C.


3

Die Mehrheit der Mikrocontroller sind immer noch 8- und 16-Bit-Geräte (obwohl sich dies langsam ändert). Die beiden in anderen Antworten erwähnten Instanzen übergeordneter Sprachen (Schema und Python) werden beide auf 32-Bit-ARM-Kernen ausgeführt. Die kleineren 8- und 16-Bit-Geräte (die möglicherweise nur ein paar Dollar kosten) verfügen nicht über genügend RAM, um die genannten Sprachen zu unterstützen. In der Regel verfügen sie nur über ein paar KB RAM.

Diese höheren Sprachen sind auch nicht zum Schreiben von Interrupt-Handlern und dergleichen mit niedriger Latenzzeit ausgelegt. Es ist nicht ungewöhnlich, dass ein Mikrocontroller-Interrupt-Handler hunderte oder tausende Male pro Sekunde aufgerufen wird und jedes Mal benötigt wird, um seine Aufgabe in Dutzenden von Mikrosekunden oder weniger auszuführen.


1
Das Schema wurde Mitte der späten 70er und Anfang der 80er Jahre entwickelt. Scheme benötigt in keinem Fall einen 32-Bit-Prozessor oder Megabyte Speicher. Das Schema war Mitte der 80er Jahre für PCs der AT-Klasse erhältlich. Neuere Implementierungen sind möglicherweise für ressourcenreichere Umgebungen optimiert, es gibt jedoch eindeutige Beispiele für Schemata, die auf heutigen "winzigen" Computerplattformen ausgeführt werden.
Das Photon

@ThePhoton ich stehe korrigiert. Obwohl mir das BIT-Projekt bekannt war, das auf Prozessoren mit zehn KB Arbeitsspeicher abzielt (mehr als auf den meisten kleinen Mikrocontrollern verfügbar), habe ich gerade PICBIT entdeckt , das von einigen Studenten der Université de Montréal und der Université Laval entwickelt wurde. Damit können echte Scheme-Programme auf PIC-Prozessoren mit nur 2 KB RAM ausgeführt werden. Ziemlich erstaunlich.
Tcrosley

3

Mit der Sprache Lua können Sie einige Funktionen programmieren. Tatsächlich ist Lua eine Sprache mit mehreren Paradigmen. Wikipedia behauptet, dass es sich um eine "scripting, imperative, funktionale, objektorientierte, prototypbasierte" Sprache handelt. Die Sprache erzwingt kein einziges Paradigma, sondern ist flexibel genug, um es dem Programmierer zu ermöglichen, jedes Paradigma zu implementieren, das auf die Situation anwendbar ist. Es wurde von Schema beeinflusst.

Zu den Merkmalen von Lua gehören erstklassige Funktionen , lexikalisches Scoping und Verschlüsse sowie Coroutinen , die für die funktionale Programmierung nützlich sind. Sie können sehen, wie diese Funktionen im Lua-Benutzer-Wiki verwendet werden, das eine Seite enthält, die der funktionalen Programmierung gewidmet ist . Ich bin auch auf dieses Google Code-Projekt gestoßen , habe es aber nicht verwendet (es wird angeblich von Haskell beeinflusst, einer anderen Sprache, die Sie erwähnt haben).

eLua ist eine Implementierung, die für eine Reihe von Entwicklungsplatinen für die Architekturen ARM7TMDI, Cortex-M3, ARM966E-S und AVR32 konfiguriert ist. Sie ist Open Source, sodass Sie sie für Ihre eigene Plattform konfigurieren können. Lua ist in ANSI C implementiert und die gesamte Quelle wiegt weniger als 200 kB. Daher sollten Sie in der Lage sein, es für die meisten Plattformen mit einem C-Compiler zu erstellen. Mindestens 128 KB Flash und 32 KB RAM werden empfohlen. Ich arbeite im Moment an einem PIC32-Port dafür (der sich noch in der Phase "PIC32-Karte holen" befindet).

Das Tolle an Lua ist, dass es als Klebesprache konzipiert wurde, so dass es sehr einfach ist, C-Erweiterungen für die Dinge zu schreiben, die schnell sein müssen (wie Interrupts usw.), und die dynamischen, interpretierten Funktionen der Sprache zu verwenden, um schnell zu arbeiten Entwicklung in der Programmlogik.

Lua ist keine rein funktionale Sprache, aber Sie können eine Menge funktionale Programme darin ausführen , es ist schnell und klein (im Vergleich zu anderen Skriptsprachen ) und Sie müssen Ihr Gerät nicht neu flashen, um ein Programm auszuprobieren. Es gibt sogar einen interaktiven Dolmetscher!


1

"Gibt es Möglichkeiten, funktionale Programmierung mit einer funktionalen Sprache auf einer MCU durchzuführen, um schwierige Probleme zu lösen?"

Ja, es gibt Wege. Der Nachteil ist jedoch, dass Sie einen 32-Bit-Prozessor, eine MMU, 128 MB RAM, eine SSD, ein RTOS und $$$ benötigen.

Mikrocontroller unterscheiden sich von Mikroprozessoren. Der Mikrocontroller ist möglicherweise nur eine 8-Bit-CPU, 1 KB RAM, 8 KB ROM, hat jedoch einen eingebauten UART, PWM, ADC usw. und kostet nur 1,30 USD.

Sie könnten also all diese Hochsprachen laufen lassen, aber die Herstellung kostet viel mehr.


2
Ich denke, Sie müssen Ihre Definition des Mikrocontrollers überdenken. Viele Mikrocontroller verfügen jetzt über mindestens 128 KB Flash und mindestens 64 KB RAM. Dies ist ausreichend Platz, um einen Interpreter für einige kleinere Sprachen auszuführen. Anscheinend geben Sie Spezifikationen für ein eingebettetes Linux-Gerät an. Ich glaube, die OP hat nach einem dedizierten Hafen gefragt.
Kevin Vermeer

1
Wenn Sie 1,30 US-Dollar für eine 8-Bit-MCU bezahlen, sind mehrere 32-Bit-MCUs günstiger. Berücksichtigen Sie auch, dass die meisten 8-Bit-MCUs auf dem Markt fürchterlich ineffiziente Architekturen sind, deren Design aus den frühen 80er Jahren stammt.
Lundin

0

Dieses Buch bietet eine Möglichkeit, mit einem leichten Gefühl von FP zu programmieren. http://www.state-machine.com/psicc2/

Für echte FP muss es jedoch möglich sein, Funktionen zur Laufzeit zu erstellen und sie über Ihr Programm zu übertragen. Hier haben wir ein Problem: Wie können wir diese konstruierte Funktion darstellen? und wie können wir diese funktion effektiv ausführen? Auf einem großen System können wir eine dynamische Kompilierung verwenden, die in einer ersten Funktionsanwendung echten Maschinencode generiert. Auf der MCU haben wir nur RAM, um sehr primitive Compiler wie den Forth-Sprachkern zu implementieren.

Die einzige Möglichkeit, FP oder OOP zu verwenden, ist die Metaprogrammierung : Schreiben Sie komplexe Funktions- / OOP- Programme, die Programme für MCU generieren (z. B. C-Quellcode oder LLVM IL). In dieser Variante sind Sie nicht an die Komplexität des Paradigmas oder der Programmiermethoden gebunden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.