AtomVM: πώς να εκτελέσετε κώδικα Elixir σε μικροελεγκτή 3 $

Το AtomVM είναι ένα μικροσκοπικό φορητό εικονικό μηχάνημα που επιτρέπει στον κώδικα BEAM να τρέχει σε μικροελεγκτές με λιγότερο από 500KB μνήμης RAM όπως το ESP32.

Αποποίηση ευθύνης: Το AtomVM δεν είναι ακόμη έτοιμο για παραγωγή, μπορεί να πυρπολήσει το σπίτι σας.

Τι σημαίνει αυτό; Με λίγα λόγια μπορείτε να αναβοσβήνετε το AtomVM σε ένα ESP32 και να τρέχετε σε αυτό τον κώδικα Elixir / Erlang.

Γιατί

Εργάζομαι με πλήρη απασχόληση στην Astarte, μια πλατφόρμα IoT με ανοιχτή πηγή, γραμμένη στο Elixir, και χρησιμοποιώ επίσης αρκετές ενσωματωμένες κάρτες για δουλειά και διασκέδαση, οπότε ενώ εργαζόμουν με ένα board ESP32, συνειδητοποίησα ότι θα ήταν ενδιαφέρον να χρησιμοποιήσω μερικές από τις τις δροσερές έννοιες πίσω από το Elixir για ενσωματωμένο υλικό, έτσι ξεκίνησα το AtomVM.

Ας επικεντρωθούμε λοιπόν στις προδιαγραφές ESP32 για μια στιγμή:

  • Συνδεσιμότητα: ενσωματωμένο Ethernet, BLE και WiFi (802.11 b / g / n) + αρκετές κάρτες dev με πρόσθετο chip LoRa
  • CPU: διπλού πυρήνα, μέχρι 240 MHz
  • Μνήμη: 520 KiB SRAM (ενσωματωμένο)
  • Φλας: συνήθως 4 MiB
  • Ισχύς: ρεύμα βαθιάς ύπνου 5 μΑ

Το Erlang και το Elixir είναι πολύ καλοί στο χειρισμό των πακέτων δικτύου (ESP32 έχει συνδεσιμότητα δικτύου), εκτελώντας ταυτόχρονες διαδικασίες (ESP32 είναι διπλού πυρήνα), αντιμετωπίζοντας ελαττώματα (ενσωματωμένο λογισμικό πρέπει να είναι αξιόπιστο), γράφοντας δοκιμασμένο λογισμικό από το debugging στο πραγματικό υλικό), επιτρέποντας την ταχεία ανάπτυξη (που είναι ένα σημείο πώλησης Arduino), αλλά το OTP δεν έχει σχεδιαστεί για να τρέχει σε συσκευές χαμηλού τέλους.

Για παράδειγμα, υπάρχουν ήδη δύο μεγάλα έργα που επιτρέπουν στον κώδικα Elixir να τρέχει σε ενσωματωμένες συσκευές που είναι Nerves και GRiSP. Ωστόσο, για να τρέξουν χρειάζονται μια ενσωματωμένη πλακέτα με Linux όπως το Raspberry Pi (Nerves) ή μια προσαρμοσμένη κάρτα με 64 MiB RAM (GRiSP).

Η AtomVM προσπαθεί να ξεπεράσει αυτούς τους περιορισμούς από το σχεδιασμό και επιτρέπει την ανάπτυξη του Elixir για τέτοιες συσκευές χαμηλού επιπέδου όπως το ESP32.

Πως

Το AtomVM προσπαθεί να χρησιμοποιήσει τη μικρότερη δυνατή μνήμη από το σχεδιασμό χάρη σε μερικά κόλπα, όπως η εκτέλεση όλων των κωδικών στη θέση τους στη μνήμη flash (η οποία είναι συνήθως μνήμη χαρτογραφημένη).

Ορισμένες λειτουργίες δεν έχουν υλοποιηθεί, ενώ κάποιες άλλες προγραμματίζονται να είναι προαιρετικές, για παράδειγμα, η υποστήριξη κινητής υποδιαστολής ενδέχεται να μην χρειαστεί σε κάποια περίπτωση χρήσης, όπως και οι ακέραιοι αριθμοί ακριβείας ακριβείας ενδέχεται να μην χρειάζονται σε αυτές τις συσκευές.

Τελευταίο αλλά όχι ασήμαντο, επίσης, η τυποποιημένη βιβλιοθήκη απογυμνώνεται για να εξοικονομήσει πολύτιμη μνήμη flash.

Πώς να αναβοσβήνει ένα led με Elixir

Αναβοσβήνοντας ένα LED είναι το πρόγραμμα "hello world" της φυσικής πληροφορικής, οπότε θα ξεκινήσουμε με αυτό:

... αλλά περιμένετε ένα δευτερόλεπτο, πριν ξεκινήσετε θα πρέπει να βεβαιωθείτε ότι έχετε όλα τα απαραίτητα στοιχεία:

Σκεύη, εξαρτήματα:

  • Ένα δελτίο ESP32 dev με LED (μπορεί να αγοράσει ένα για λιγότερο από 10 €)
  • Σε περίπτωση που η πλακέτα ESP32 δεν διαθέτει ενσωματωμένη λυχνία LED: LED, λίγα καλώδια και πινέλο

Λογισμικό:

  • Erlang / OTP 20 (OTP 21 θα πρέπει επίσης να είναι ωραία)
  • Συλλέκτης Elixir (1,6 / 1,7 θα πρέπει να είναι ωραία)
  • esp-idf (v3.1)
  • CMake
  • αρχεία zlib devel
  • gperf

Συγκέντρωση και αναβοσβήσιμο του AtomVM στην πλακέτα ESP32

Απλά συνδέστε το διοικητικό συμβούλιο και βεβαιωθείτε ότι το $ IDF_PATH δείχνει στον κατάλογο esp-idf και ότι το SDK esp-idf έχει ήδη ρυθμιστεί. Εάν χρησιμοποιείτε MacOS Fred Dushin έκανε μια εξαιρετική blogpost.

~ $ git clone https://github.com/bettio/AtomVM.git
~ $ cd AtomVM
~ / AtomVM $ cd src / platforms / esp32
~ / AtomVM / src / platforms / esp32 $ κάνουν φλας
~ / AtomVM / src / πλατφόρμες / esp32 $ cd ../../ ..

Σύνταξη και αναβοσβήσιμο κώδικα Elixir

Το Blink.ex μπορεί να συνταχθεί με χρήση του elixirc:

$ elixirc Blink.ex

Μόλις μεταγλωττιστεί θα πρέπει να έχετε Elixir.Blink.beam, το οποίο είναι το πραγματικό ενοποιημένο δομοστοιχείο.

Ωστόσο, το Elixir.Blink.beam δεν είναι αρκετό, πρέπει να συσκευάζεται μαζί με όλες τις απαραίτητες ενότητες σε αρχείο .avm.

~ / AtomVM $ cd libs / estdlib
~ / AtomVM / libs / estdlib $ erlc * .erl
~ / AtomVM / libs / estdlib $ cd ../exavmlib/
~ / AtomVM / libs / exavmlib $ elixirc GPIO.ex
~ / AtomVM / libs / exavmlib $ cd ../ ..
~ / AtomVM $ cmake.
~ / AtomVM $ cd εργαλεία / packbeam
~ / AtomVM / tools / packbeam $ make
~ / AtomVM / tools / packbeam $ cd ../ ..
~ / AtomVM $ tools / packbeam / PackBEAM Διαδρομή blink.avm / προς / Elixir.Blink.beam libs / estdlib / *. Beam / exavmlib / * beam
~ / AtomVM $ $ IDF_PATH / components / esptool_py / esptool / esptool.py -chip esp32 -port / dev / ttyUSB0 -baud 115200 - πριν από την προεπιλογή_επιβεβαιώστε -από hard_reset write_flash -u --flash_mode dio --flash_freq 40μ --flash_size ανίχνευση 0x110000 blink.avm

Για λόγους σαφήνειας δεν κάναμε μια κατασκευή εκτός πηγής, αλλά θα έπρεπε.

Φορητότητα και υποστηριζόμενο υλικό

Αυτή τη στιγμή υποστηρίζονται μόνο συστήματα * nix και πίνακες ESP32, ωστόσο το AtomVM έχει σχεδιαστεί για να είναι εύκολα φορητό: όλοι οι κωδικοί πρόσβασης για πλατφόρμες διατηρούνται σε μια βιβλιοθήκη, οπότε η μεταφορά του AtomVM σε ένα νέο λειτουργικό σύστημα ή νέο υλικό θα πρέπει να είναι αρκετά απλή. Ο ίδιος ο πυρήνας AtomVM είναι χτισμένος ως βιβλιοθήκη, ώστε να μπορεί να ενσωματωθεί σε ένα μεγαλύτερο έργο.

Το AtomVM έχει επίσης ελάχιστες εξαρτήσεις, απαιτεί λειτουργίες ~ 40 libc και μια προαιρετική βιβλιοθήκη zlib.

Υποστήριξη για περισσότερες πλατφόρμες, όπως το STM32.

Συνεισφορά

Οι συνεισφορές είναι ευπρόσδεκτες, απλά πιέστε το στο github και στείλτε ένα αίτημα έλξης. Τα θέματα "Καλή πρώτη έκδοση" είναι ένα καλό σημείο εκκίνησης, υπάρχουν επίσης ζητήματα βοήθειας που αναζητούνται για ειδικευμένους προγραμματιστές (ένα από αυτά είναι το λιμάνι των Windows).

Τα νέα ζητήματα είναι επίσης ευπρόσδεκτα, μην διστάσετε να τα ανοίξετε αν βρείτε κάποιο σφάλμα ή χάσετε κάποιο χαρακτηριστικό.

Το μέλλον

Περισσότερες λειτουργίες έρχονται στο εγγύς μέλλον, όπως διασκεδάσεις, χάρτες, καλύτερος χειρισμός σφαλμάτων, υποστήριξη πολλαπλών πυρήνων και πλήρης επανεγγραφή συλλογής σκουπιδιών.

Προβλέπονται περαιτέρω εξελίξεις και θα υλοποιηθούν στο μέλλον, όπως υποστήριξη απομακρυσμένου κελύφους, ανταλλαγή θερμών κωδικών, ομαδοποίηση κλπ ...

... και φυσικά θα δημοσιεύσω και άλλες ιστορίες για το AtomVM σύντομα, οπότε μείνετε συντονισμένοι :)