AtomVM: Com executar el codi Elixir en un microcontrolador de 3 dòlars

AtomVM és una minúscula màquina virtual portàtil que pot executar codi BEAM en microcontroladors amb menys de 500 KB de RAM, com ara l’ESP32.

Renúncia: AtomVM encara no està a punt per a la producció, podria incendiar la seva casa.

Què vol dir això? En poques paraules, podeu fer servir AtomVM en un ESP32 i executar-hi el codi Elixir / Erlang.

Per què

Treballo a temps complet a Astarte, una plataforma IoT de codi obert escrita a Elixir, i també faig servir diversos taulers incrustats per a la feina i la diversió. Mentre treballava amb una placa ESP32, em vaig adonar que potser seria interessant utilitzar alguns d’ells Els conceptes fantàstics que hi ha darrere d’Elixir en maquinari incrustat, així que vaig començar a AtomVM.

Centrem-nos en un moment en les especificacions ESP32:

  • Connectivitat: Ethernet integrat, BLE i WiFi (802.11 b / g / n) + diverses targetes de desenvolupament amb xip LoRa addicional
  • CPU: Dual core, fins a 240 MHz
  • Memòria: SRAM 520 KiB (integrada)
  • Flaix: generalment de 4 MiB
  • Potència: 5 µA de corrent de son profund

Erlang i Elixir poden processar molt bé els paquets de xarxa (ESP32 té connectivitat de xarxa), executar processos concurrents (ESP32 és un sistema de doble nucli), arreglar errors (el programari incrustat ha de ser fiable) i escriure programes testables (cal fer proves primeres durant el desenvolupament. molt millor que depurar amb maquinari real), que permet un desenvolupament ràpid (que és un punt de venda d’Arduino), però OTP no està dissenyat per funcionar en dispositius de gamma baixa.

Per exemple, ja hi ha dos grans projectes que poden executar codi Elixir en dispositius incrustats com Nerves i GRiSP. Per funcionar, però, necessiteu una placa integrada basada en Linux com ara un Raspberry Pi (nervis) o un tauler personalitzat amb 64 ​​MB de memòria RAM (GRiSP).

AtomVM intenta superar aquestes limitacions mitjançant el disseny i permet desenvolupar Elixir per a dispositius de gamma baixa com l’ESP32.

Com

AtomVM tracta d’utilitzar la menor capacitat d’emmagatzematge possible a causa d’alguns trucs, per exemple. Si executem tot el codi de la memòria flash (que normalment es mapeja).

Algunes funcions no s’implementen, mentre que d’altres han de ser opcionals Per exemple, en alguns casos d'ús, és possible que no es requereixi un suport en punt flotant, p. Per exemple, pot ser que aquests dispositius no siguin necessaris sencers amb precisió arbitrària.

Per últim, però no per això menys important, la biblioteca estàndard també es redueix per estalviar valuosa memòria flash.

Com parpellejar un LED amb Elixir

El parpelleig d'un LED és el programa "Hello World" per a informàtica física. Comencem per tant:

... però espereu un segon abans de començar, assegureu-vos de tenir tots els components necessaris:

Maquinari:

  • Una placa de desenvolupament ESP32 amb LED (és possible comprar-ne una per menys de 10 €)
  • Si la vostra placa ESP32 no té un LED integrat: un LED, alguns cables i un panell

Programari:

  • Erlang / OTP 20 (OTP 21 també ha d'estar bé)
  • Compilador Elixir (1,6 / 1,7 ha d’estar bé)
  • esp-idf (v3.1)
  • CMake
  • fitxers zvel devel
  • gperf

Compila i flaix AtomVM a la targeta ESP32

Simplement connecteu el vostre tauler i assegureu-vos que $ IDF_PATH apunta al directori esp-idf i el vostre SDK esp-idf ja està configurat. Si utilitzeu MacOS, Fred Dushin ha creat una publicació excel·lent al bloc.

~ $ git clone https://github.com/bettio/AtomVM.git ~ $ cd AtomVM ~ / AtomVM $ cd src / platform / esp32 ~ / AtomVM / src / platform / esp32 $ make Flash ~ / AtomVM / src / platform / esp32 $ cd ../../ ..

Compilar i flaixar codi Elixir

Blink.ex es pot compilar amb elixirc:

$ elixirc Blink.ex

Després de la compilació, haureu de tenir Elixir.Blink.beam, que és el mòdul actualment compilat.

Tanmateix, Elixir.Blink.beam no és suficient, sinó que s'ha d'embalar en un fitxer AVM junt amb tots els mòduls necessaris.

~ / 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 eines / packbeam ~ / AtomVM / tools / packbeam $ make ~ / AtomVM / tools / packbeam $ cd ../ ..
~ / AtomVM $ eines / packbeam / PackBEAM ruta blink.avm / a / Elixir.Blink.beam libs / estdlib / *. Llum de faig / exavmlib / *. Faig
~ / AtomVM $ $ IDF_PATH / components / esptool_py / esptool / esptool.py --chip esp32 --port / dev / ttyUSB0 --baud 115200 - abans de default_reset - després hard_reset write_flash -u --flash_mode dio --flash_freq 40m --flash_size reconèixer 0x110000 blink.avm

Per obtenir més claredat, no vam fer una creació fora de font, però hauríeu de fer-ho.

Portabilitat i maquinari suportat

Actualment només s’admeten els sistemes * nix i les targetes ESP32, però AtomVM està dissenyat per a ser portàtil: tot el codi específic de la plataforma s’emmagatzema a una biblioteca, facilitant el port AtomVM a un nou sistema operatiu o maquinari. hauria de ser. El nucli AtomVM en si es construeix com a biblioteca perquè es pugui incrustar en un projecte més gran.

AtomVM també té poques dependències, necessita ~ 40 funcions de libc i una biblioteca zlib opcional.

S’admeten plataformes addicionals, inclosa STM32.

Participa

Les aportacions són benvingudes, només cal publicar-lo a Github i enviar una sol·licitud de petició. Els bons problemes de primera edició són un bon lloc per començar, i també hi ha problemes "desitjats per ajudar" per a desenvolupadors experimentats (un dels quals és el port de Windows).

Les noves edicions també són benvingudes. Si trobeu un error o us perdeu una funció, podeu obrir-lo en qualsevol moment.

El futur

En un futur proper s’afegiran funcions addicionals, p. B. Diversió, mapes, millor maneig d’errors, suport multicentre i una reescriptura completa del col·lector d’escombraries.

Es preveuen nous desenvolupaments i s’implementaran en el futur, com ara suport remot de shell, intercanvi de codis calents, agrupacions, etc.

... I per descomptat publicaré més històries sobre AtomVM aviat, així que estigueu atents :)