AtomVM: Erlang on Microcontrollers
github.com
github.com
- Am I going to get a network stack with this, and will it be as battle-tested as lwIP? What about support for USB, CANopen, etc? Will the USB stack look like it's working on a quick test but then have weird intermittent failures in the field? (hello stdperiph)
- Am I going to have a sane story for bootloading and in-system programming with this platform?
- What is debugging/logging going to look like with this platform? Will I be able to use tools like Tracealyzer without doing a ton of integration work myself? Is something that looks like GDB/OpenOCD with a standard JTAG dongle going to more or less just work?
- Quite apart from barriers in learning the new language itself, will it be a pain to get the tools set up for other developers on my team? Will people be building stuff from source and/or will I have to do packaging work?
Admittedly, some of these don't have great answers in the gnuarm world either, but to the extent that I've hacked around them already, it's a sunk cost. Anyway, I say all this not to be a downer, but to open a discussion about these kinds of issues and whether others have been impacted-by or have overcome them.
There is an interesting gap: the C code for the HAL/stdlib of a device is typically machine generated from the VHDL and register descriptions. If you could get at that machine description, or e.g. use clang to parse the headers, you could make some good inroads into this.
As it is I typically avoid microcontrollers because of all the pointless plumbing I am required to do.
svd2rust [1] is an project that generates a (very low level) Rust API for a specific micro from this file.
Generally the file generated from this is known as the header files (as it is just C headers to access the registers directly) and the HAL is an abstraction layer on top, and is actually written manually by the microcontroller designer as it contains higher level functions (e.g. a function to calculate the clock settings to get a specific UART baudrate).
The STDLib is often supplied by the compiler vendor instead, or is an open source project like picolibc [2]
The Rust project is a step in the right direction.
There is a middle ground developing in the GRiSP[1] project as well. It uses the RTEMS RTOS to provide basic POSIX compatibility that allows the full BEAM VM to operate on lower powered hardware[2]. Work on GRiSP 2 seems to be progressing slowly, but it's a cool project and definitely worth a look if you find projects like AtomVM interesting.
But I am not surprised it gets a lot of language support. 160Mhz for a µC... My first PC I got was ancient when I got it and it had 166Mhz. Single core of course. At least it had 4x the RAM. And all that now cost < 10$...
The ESP32 is much better than most 16bit home computers, it just misses a companion blitter and sound chip.
Might be of use to those of you interested in this.
Nerves stacks the BEAM on top of a small Buildroot Linux setup. The general rule I hear from the Nerves team is "if it runs Linux, it can run Nerves" which is mostly true.
I was considering whether Nerves could run on something like the ZSA Moonlander keyboard and then we run into a limitation of the BEAM apparently. Frank Hunleth of Nerves said the BEAM requires a device with an MMU. This is above my paygrade so I'll take his word for it ;)
Maybe my reasoning is faulty and I don't have data to back it up, but my expectation is that it will have better performance (code size, run speed, memory usage) than the Atom approach.
If AtomVM supports hotloading, that's always nice.
Frank do a good overview of "known" projects in the second part of this talk https://youtu.be/bkLABs04k5o?t=1173
These systems have no real OS to rely on and developers have to handle almost everything manually
Nerves requires a system who can at least run Linux and the real BEAM, like a Raspberry PI which is many times more powerful than an ESP32 board
If you look at the supported targets, they're Raspberry Pi (or similar) computers, not microcontrollers.
https://hexdocs.pm/nerves/targets.html#supported-targets-and...