AtomVM: hogyan lehet az Elixir kódot futtatni egy 3 dolláros mikrovezérlőn

Az AtomVM egy apró hordozható virtuális gép, amely lehetővé teszi a BEAM kód futtatását olyan mikrokontrollereknél, amelyek kevesebb, mint 500KB RAM-ot tartalmaznak, mint például az ESP32.

Jogi nyilatkozat: Az AtomVM még nem áll készen a termeléshez, mert tüzet okozhat a házában.

Mit jelent ez? Néhány szóban felvillanhat az AtomVM egy ESP32-en, és futtathatja az Elixir / Erlang kódot.

Miért

Teljes munkaidőben dolgozom az Astarte-n, amely egy nyílt forrású IoT platform, Elixir-ben írva, és több beágyazott táblát is használok munka és szórakozás céljából, így miközben egy ESP32 fórumon dolgoztam, rájöttem, hogy érdekes lehet néhány az Elixir rejtett koncepciói a beágyazott hardverekkel kapcsolatban, ezért elindítottam az AtomVM-et.

Tehát egy pillanatra összpontosítsunk az ESP32 specifikációkra:

  • Csatlakoztathatóság: beépített Ethernet, BLE és WiFi (802.11 b / g / n) + több fejlesztőlap további LoRa chipekkel
  • CPU: kétmagos, akár 240 MHz-ig
  • Memória: 520 KiB SRAM (beépített)
  • Vaku: általában 4 MiB
  • Teljesítmény: 5 µA mély alvási áram

Az Erlang és az Elixir nagyon jól képesek kezelni a hálózati csomagokat (az ESP32 hálózati csatlakozással rendelkezik), egyidejű folyamatokat futtatni (az ESP32 kétmagos), hibákat kezelni (a beágyazott szoftvernek megbízhatónak kell lennie), tesztelhető szoftverek írásával (a korai tesztelés, míg a fejlesztés sokkal jobb) mint a valódi hardver hibakeresése), lehetővé téve a gyors fejlesztést (ami egy Arduino értékesítési pont), de az OTP-t nem úgy tervezték, hogy alacsony végfelhasználású eszközökön futtasson.

Például már két nagyszerű projekt lehetővé teszi az Elixir kód futtatását olyan beágyazott eszközökön, amelyek Nerves és GRiSP. A futtatáshoz azonban szükségük van egy Linux alapú beágyazott táblára, például egy Raspberry Pi-re (Nerves) vagy egy egyéni alaplapra, 64 MB RAM-mal (GRiSP).

Az AtomVM megpróbálja leküzdeni ezeket a korlátozásokat a tervezés révén, és ez lehetővé teszi az Elixir fejlesztését olyan alacsony szintű eszközök számára, mint az ESP32.

Hogyan

Néhány trükknek köszönhetően az AtomVM megpróbálja a lehető legkisebb memóriamennyiséget felhasználni a tervezés során, például végrehajtja az összes kódot a helyén a flash memórián (amely általában memórialeképezésű).

Egyes funkciókat nem valósítottak meg, míg másoknak opcionálisak lennének, például a lebegőpontos támogatásra egyes felhasználási esetekben lehet, hogy nincs szükség, például esetleg nincs szükség önkényes pontosságú egész számokra ezen eszközökön.

Végül, de nem utolsósorban, a szabványos könyvtárat is lecserélik, hogy megtakarítsák az értékes flash memóriát.

Hogyan pisloghat egy led az Elixir-rel

A LED villogása a fizikai számítástechnika „hello world” programja, tehát ezzel kezdjük:

… De várjon egy percet, mielőtt elindítaná, győződjön meg arról, hogy az összes szükséges összetevő rendelkezik:

Hardver:

  • ESP32 dev tábla LED-del rajta (10 eurónál kevesebbet lehet megvásárolni)
  • Ha az ESP32 kártyán nincs fedélzeti LED: egy LED, néhány kábel és kenyérlemez

Szoftver:

  • Erlang / OTP 20 (az OTP 21-nek is finomnak kell lennie)
  • Elixir fordító (az 1,6 / 1,7-nek finomnak kell lennie)
  • esp-idf (v3.1)
  • CEllenõrizze
  • zlib fejlesztõ fájlok
  • gperf

Az AtomVM fordítása és villogása az ESP32 fórumon

Csak csatlakoztassa a kártyát, és ellenőrizze, hogy a $ IDF_PATH az esp-idf könyvtárra mutat-e, és az esp-idf SDK már konfigurálva van. A macOS használata esetén Fred Dushin kiváló blogpostát készített.

~ $ git klón https://github.com/bettio/AtomVM.git
~ $ cd AtomVM
~ / AtomVM $ cd src / platformok / esp32
~ / AtomVM / src / platformok / esp32 $ villogni kezd
~ / AtomVM / src / platformok / esp32 $ cd ../../ ..

Az Elixir kód összeállítása és villogása

A Blink.ex az elixirc használatával fordítható:

$ elixirc Blink.ex

A fordítás után rendelkeznie kell az Elixir.Blink.beam-rel, amely a ténylegesen összeállított modul.

Az Elixir.Blink.beam azonban nem elegendő, a szükséges modulokkal együtt .avm fájlba kell csomagolni.

~ / 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 eszközök / packbeam
~ / AtomVM / eszközök / packbeam $ make
~ / AtomVM / eszközök / packbeam $ cd ../ ..
~ / AtomVM $ tools / packbeam / PackBEAM blink.avm elérési út / az / Elixir.Blink.beam libs / estdlib / *. Gerenda libs / exavmlib / *.
~ / AtomVM $ $ IDF_PATH / components / esptool_py / esptool / esptool.py --chip esp32 --port / dev / ttyUSB0 --baud 115200 --forefore default_reset - after hard_reset write_flash -u --flash_mode dio --flash_freq 40m --flash_size detektálni 0x110000 blink.avm

Az egyértelműség kedvéért nem forrásból származó forrást készítettünk, de Önnek kellene.

Hordozhatóság és támogatott hardver

Jelenleg csak a * nix rendszerek és az ESP32 táblák támogatottak, azonban az AtomVM-et úgy tervezték, hogy könnyen hordozható legyen: az összes platformspecifikus kódot egy könyvtárban tartják, tehát az AtomVM-et egy új operációs rendszerre vagy új hardverre kell hordozni. Maga az AtomVM mag könyvtárként van felépítve, így beágyazható egy nagyobb projektbe.

Az AtomVM-nek is nagyon kevés függősége van, ehhez ~ 40 libc függvény és opcionális zlib könyvtár szükséges.

További platformok támogatása várható, beleértve az STM32-et is.

hozzájárulás

A hozzájárulások szívesen láthatók, csak villázzuk fel a githubon, és küldjünk húzási kérelmet. A „jó első kiadás” kiadások jó kiindulási pontot jelentenek, vannak olyan „segítséget igénylő” kérdések is a képzett fejlesztők számára (ezek egyike a Windows port).

Az új kiadványok is szívesen láthatók, nyugodtan nyissa meg őket, ha hibát talál, vagy hiányzik valamelyik szolgáltatás.

A jövő

A közeljövőben további funkciók érkeznek, például szórakoztatók, térképek, jobb hibakezelés, többmagos támogatás és teljes szemétgyűjtő átírás.

További fejlesztéseket terveznek és a jövőben is bevezetnek, például távoli shell támogatást, forró kód cserét, klaszterezést stb.

... és természetesen hamarosan további történeteket is közzéteszek az AtomVM-ről, szóval maradj velünk :)