All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
- Added a limited implementation of the OTP
ets
interface
- Support for DragonFly BSD (generic_unix platform).
- Added guards
is_even
andis_odd
to theInteger
module - Add a number of functions to proplists module, such as
delete/2
,from/to_map/1
, etc... - Add
esp:deep_sleep_enable_gpio_wakeup/2
to allow wakeup from deep sleep for ESP32C3 and ESP32C6. - Obtain RSSI of the current connection with
network:sta_rssi/0
on ESP32. - Pico-W support for
network:sta_rssi/0
.
- Fix invalid read after free in ssl code, see also issue #1115.
- Fix semantic of
ssl:recv(Socket, 0)
to return all available bytes, matching what OTP does. - Fix
binary
option handling inssl:connect/3
sobinary
can be used instead of{binary, true}
. - Fix scheduling of trapped process that were wrongly immediately rescheduled before being signaled.
- Fix
gen_tcp
andssl
types. - Fix documentation and specification of
esp:sleep_enable_ext0_wakeup/2
andesp:sleep_enable_ext1_wakeup/2
.
- Stacktraces are included by default on Pico devices.
- Changed ssl default from
{active, false}
to{active, true}
in order to have same behavior as OTP. Since active mode is not supported right now,active
must be explicitly set to false:ssl:connect(..., ..., [{active, false}, ...])
, otherwise it will crash.
- Added experimental optimized GC mode that makes use of C realloc instead of copying data around,
it can be enabled with
-DENABLE_REALLOC_GC=On
.
- Fix bug in
erlang:ref_to_list/1
anderlang:display/1
: the unique integer was truncated on some 32-bit architectures - Stop hardcoding
erl_eval
as module name in both display and fun_to_list - Correctly display and convert to list funs such as
fun m:f/a
- Fixed bug in STM32 cmake that could cause builds with multiple jobs to fail due to incorrect artifact dependency
- Fix crash on macOS due to missing call to
psa_crypto_init
for TLS 1.3 - Fix crypto test on rp2040
- Fix a bug that broke sockets on ESP32-C3 and other single core ESP32 devices, that may also cause other issues. The bug has been introduced with messages from tasks change between beta.1 and rc.0
- Fixed several issues related to Esp32 socket_driver that made it unreliable, especially with single core MCUs
BOOTLOADER_OFFSET
for all current Esp32 models.- Added API to send messages from FreeRTOS tasks or pthreads, typically to easily support integration with Esp32 callbacks
BOOTLOADER_OFFSET
was incorrect for Esp32-C6 and Esp32-S2.- Fixed a bug that would fail to set DHCP hostname in STA+AP mode on all ESP32 platforms.
- ESP32-S3: crash in network driver caused by a smaller stack size for scheduler threads, when
calling
esp_wifi_init()
. See also issue #1059. - Fixed Esp32 network driver on non-SMP builds
- ESP32: fixed bug in
gpio:stop/0
andgpio:close/1
that would cause the VM to crash.
- Support for utf8 encoding to
*_to_atom
andatom_to_*
functions binary_to_atom/1
andatom_to_binary/1
that default to utf8 (they were introduced with OTP23)- Added Pico cmake option
AVM_WAIT_BOOTSEL_ON_EXIT
(defaultON
) to allow tools to use automatedBOOTSEL
mode after main application exits - Use UTF-8 encoding for atoms when using
erlang:term_to_binary/1
, in conformance with OTP-26 - Pico: Wait for USB serial connection
cmake
configuration optionAVM_USB_WAIT_SECONDS
added with 20 second default. - Support for code that makes use of more than 16 live registers, such as functions with > 16 parameters and complex pattern matchings.
- ESP32: fix i2c_driver_acquire and i2c_driver_release functions, that were working only once.
- Sending messages to registered processes using the
!
operator now works. - Fixed bug in
OP_SEND
that would accept sending a message to any integer or term without raising an error. binary_to_term
checks atom encoding validity, and fix latin1 support (when non-ASCII chars are used)- ESP32: fixed bug in
gpio:set_pin_mode/2
andgpio:set_direction/3
that would accept any atom for the mode parameter without an error. - ESP32: GPIO driver fix bug that would accept invalid
pull
direction, and silently setpull
direction tofloating
without issuing an error. - ESP32: fixed bug in gpio driver that would accept invalid pin numbers (either negative, or too large)
- RP2040: fixed bug in
gpio:set_pin_pull/2
that would accept any parameter as a validpull
mode. - Support to function with 10 or more parameters
- Very unlikely but possible corruption caused by generated code that uses 16 live registers
binary_to_atom/2
validates utf8 strings*_to_atom
andatom_to_*
properly convert latin1 (not just ASCII) to utf8 and viceversa- ESP32: use esp-idf v5.1.3 for building release binaries
- Added
esp:get_default_mac/0
for retrieving the default MAC address on ESP32. - Added support for
pico
andpoci
as an alternative tomosi
andmiso
for SPI - ESP32: Added support to SPI peripherals other than hspi and vspi
- Added
gpio:set_int/4
, with the 4th parameter being the pid() or registered name of the process to receive interrupt messages - Added support for
lists:split/2
- Added ESP32 API for allowing coexistence of native and Erlang I2C drivers
- Shorten SPI config options, such as
sclk_io_num
->sclk
- Shorten I2C config options, such as
scl_io_num
->scl
- Shorten UART config options, such as
tx_pin
->tx
- Introduced support to non-integer peripheral names,
"i2c0"
,"uart1"
(instead of just0
and 1
, which now they are deprecated)- New atom table, which uses less memory, has improved performances and better code.
- SPI: when gpio number is not provided for
miso
ormosi
default to disabled - Change port call tuple format to the same format as gen_server, so casts can be supported too
- Fix several missing memory allocation checks in libAtomVM.
- Fixed a possible memory leak in libAtomVM/module.c
module_destroy
. - Fix possibile bug in random number generator on ESP32 and RPi2040
- Fixed interpretation of live for opcodes, thus altering GC semantics for nifs. See also UPDATING.
- Fixed a bug where guards would raise exceptions instead of just being false
- Fixed support for big endian CPUs (such as some MIPS CPUs).
- Fixed STM32 not aborting when
AVM_ABORT()
is used - Fixed a bug that would leave the STM32 trapped in a loop on hard faults, rather than aborting
- Fixed a bug that would make the VM to loop and failing to process selected fds on Linux
- Fixed classes of exceptions in estdlib.
- Fixed STM32 code that was hard coded to the default target device, now configured based on the
cmake -DDEVICE=
parameter - Fixed hard fault on STM32 durung malloc on boards with more than one bank of sram
- Fixed invalid src_clk error on ESP-IDF >= 5.0
- Fixed changed default to
AVM_USE_32BIT_FLOAT=on
for STM32 platform to enable use of single precision hardware FPU on F4/F7 devices. - Fixed a bug where emscripten
register_*_callback/1
functions would use x[1] as second argument - Fixed precision of integers used with timers which could yield to halts and wait times smaller than expected
- Add support for ESP32-C6
- Crypto functions on generic_unix platform now rely on MbedTLS instead of OpenSSL
- Platform function providing time used by timers was changed from
sys_monotonic_millis
tosys_monotonic_time_u64
,sys_monotonic_time_u64_to_ms
andsys_monotonic_time_ms_to_u64
. - Implement
atomvm:random/0
andatomvm:rand_bytes/1
on top ofcrypto:strong_rand_bytes/1
on generic_unix, ESP32 and RP2040 platforms. - Performance improvements
- Added support for the OTP
socket
interface. - Enhancd performance of STM32 by enabling flash cache and i-cache with branch prediction.
- Added cmake configuration option
AVM_CONFIG_REBOOT_ON_NOT_OK
for STM32 - New gpio driver for STM32 with nif and port support for read and write functions.
- Added support for interrupts to STM32 GPIO port driver.
- Added suppoprt for PicoW extra gpio pins (led) to the gpio driver.
- Added support for
net:getaddrinfo/1,2
- Added minimal support for the OTP
ssl
interface. - Added support for
crypto:one_time/4,5
on Unix and Pico as well as forcrypto:hash/2
on Pico - Added ability to configure STM32 Nucleo boards onboard UART->USB-COM using the
-DBOARD=nucleo
cmake option - Added STM32 cmake option
-DAVM_CFG_CONSOLE=
to select a different uart peripheral for the system console - Added
crypto:strong_rand_bytes/1
using Mbed-TLS (only on generic_unix, ESP32 and RP2040 platforms) - Added support for setting the default receive buffer size for sockets via
socket:setopt/3
- Added support for pattern matching binaries containing 32 and 64 bit floating point values, but
only when aligned to byte boundaries (e.g.
<<0:4, F:32/float>> = Bin
is not supported). - Added experimental backend to
get_tcp
andget_udp
based on the newsocket
interface - Added API for managing ESP32 watchdog (only on
esp-idf
>= v5.x)
- OpenSSL support, Mbed-TLS is required instead.
- Added erlang:spawn_link/1,3
- Added erlang:exit/2
- Added links to process_info/2
- Added lists:usort/1,2
- Added missing documentation and specifications for available nifs
- Added configurable logging macros to stm32 platform
- Added support for ULP wakeup on ESP32
- Added heap growth strategies as a fine-tuning option to
spawn_opt/2,4
- Added
crypto:crypto_one_time/4,5
on ESP32 - Improved nif and port support on STM32
- Added support for
atomvm:posix_clock_settime/2
- Added support for creations of binaries with unaligned strings
- Added
-h
and-v
flags to generic_unix AtomVM command - Removed support to ESP32 NVS from network module in order to make it generic. See also UPDATING.
- Added initial support for Pico-W: on-board LED, Wifi (STA and AP modes).
- Changed offset of atomvmlib and of program on Pico. See also UPDATING.
- Fixed incorrect exit reason for exceptions of class exit
- Fixed several incorrect type specifications
- Fixed
esp:nvs_set_binary
functions. - Fixed
monotonic_time/1
andsystem_time/1
functions for Raspberry Pi Pico - Fixed race conditions in atoms table.
- Fixed a bug in the STM32 port that caused the final result to never be returned.
- Fix bug when building a binary using a 64-bit integer on a 32-bit CPU.
- Fix (using 'auto' option) SPI on ESP32 models other than ESP32, such as ESP32S2, ESP32C3, ...
- Added the ability to specify the HSPI or VSPI ESP32 hardware interfaces when initializing the SPI Bus.
- Added support for the
spi:close/1
function. - Added
AVM_VERBOSE_ABORT
CMake define, which when set to on, will print the C module and line number when a VM abort occurs. This define is off by default. - Added
spi:write/3
andspi:write_read/3
functions to support generalized SPI transactions and arbitrary-length reads and writes from SPI devices. - Added support for building ESP32 port with all currently supported versions of Espressif ESP-IDF, version 4.1.x through 4.4.x.
- Added support for
controlling_process/2
ingen_udp
andgen_tcp
modules. - Added ability to get the atomvm version via
erlang:system_info
. - Added
erlang:is_boolean/1
Bif. - Added support for
esp:partition_erase_range/2
- Added support for
i2c:close/1
- Added support for
erlang:unregister/1
- Added Elixir ESP32 LEDC driver and example
- Added support for
uart:close/1
- Added Bitwise support for Elixir
- Added support for esp32-s2, esp32-s3, and esp32-c3 chips.
- Added Elixir I2C driver and example
- Added the ability to specify the I2C port
- Added support for the OTP
math
module - Added support for
erlang:integer_to_list/2
anderlang:integer_to_binary/2
- Added functions
esp:sleep_enable_ext0_wakeup/2
andesp:sleep_enable_ext1_wakeup/2.
- Added support for FP opcodes 94-102 thus removing the need for
AVM_DISABLE_FP=On
with OTP-22+ - Added support for stacktraces
- Added support for
utf-8
,utf-16
, andutf-32
bit syntax modifiers (put and match) - Added support for Erlang
gpio:close/1
and ElixirGPIO.close/1
for ESP32 - Added support for the Erlang
gen_event
module - Added
start_link
support for thenetwork
module - Added support for
erlang:monotonic_time/1
- Added
start_link
support for thegen_statem
module - Added support for serializing floats in erlang external term encoding
- Added support for the
SMALL_BIG_EXT
erlang external term encoding - Added support for
erlang:memory(binary)
- Added support for callbacks on SNTP updates
- Multithreading support (SMP)
- Added support for code:load_abs/1, code:load_binary/3
- Added support for loading / closing AVMPacks at runtime
- Added support for ESP-IDF v5.x
- Added support for
calendar:system_time_to_universal_time/2
- Added support for
calendar:datetime_to_gregorian_seconds/1
- Added support for Raspberry Pi Pico
- Added support for nodejs with Wasm
- Added support for a subset of the OTP logger interface
- Added
esp:partition_list/0
function - Added
esp:nvs_fetch_binary/2
andnvs_put_binary/3
functions (esp:nvs_set_binary
and functions that default to?ATOMVM_NVS_NS
are deprecated now). - Added most format possibilities to
io:format/2
andio_lib:format/2
- Added
unicode
module withcharacters_to_list/1,2
andcharacters_to_binary/1,2,3
functions - Added support for
crypto:hash/2
(ESP32 and generic_unix with openssl)
- Fixed issue with formatting integers with io:format() on STM32 platform
- Fixed a bug in the order of child initialization in the
supervisor
module - Fixed a bug in the evaluation of
receive ... after infinity -> ...
expressions - Fixed a bug in when putting integers in bit syntax with integer field sizes
- Fixed numerous bugs in memory allocations that could crash the VM
- Fixed SNTP support that had been broken in IDF 4.x builds
- Fixed
erlang:send/2
not sending to registered name
IMPORTANT: These changes are incompatible with previous releases of AtomVM.
- Changed the configuration model of the SPI driver, in order to allow for multiple "follower" devices to be attached to the same SPI Bus.
- Changed the return value from
erlang:system_info(esp32_chip_info)
from a tuple to a map, with additional information. - Changed the return type of the
network:start
function to return the tuple{ok, Pid}
on a successful call, instead of the bare atomok
. Applications that usenetwork:start
and check the return value will need to be modified. - The return type of
i2c:read_bytes
has changed from returning just a binary to returning the tuple{ok, Binary}
when successful. - The return type of many
i2c
operations under error conditions has changed fromerror
to{error, Reason}
, for improved diagnostics. - The eavmlib logger interface has been removed
- ESP-IDF v3.x support.
- New function for atom comparison, useful when writing 3rd party components.
- New function for translating an atom term to an int value, according to a given translation table. This function can be used for translating an atom term to an enum const before doing a switch.
- New no-op
ATOM_STR(...)
macro for avoiding issues with clang-format. - [ESP32]
REGISTER_PORT_DRIVER
for registering additional port drivers without editing any source file. This allows adding new components by just copying them to the components directory. - [ESP32]
REGISTER_NIF_COLLECTION
for registering additional NIFs sets without editing any source file. This allows adding new NIFs by just copying them to the components directory. - New function for getting a map or proplist value using an atom string without poluting the atom table.
- Fix
gen_statem
: Cancel outstanding timers during state transitions in order to prevent spurious timeout messages from being sent togen_statem
process. - Fix missing Elixir libraries: examvlib was not packed into atomvmlib.avm
- Fix
bs_context_to_binary
: match offset wasn't used, leading in certain situations to infinite loops while matching binaries. - Fix how
start
option was handled frombs_restore2
instruction: last saved match offset was used instead of match starting offset, causing some bytes being skipped. - Fix another potential bug when doing pattern matching using code compiled with OTP 21.
- [ESP32] [UART]: Allow using different pins for rx, tx, cts and rts.
- [ESP32] [UART]: Replace custom UART handling with esp-idf UART event queues, hence other UARTs than UART0 are supported, with better performances and stability.
- Fix binaries concat (
bs_append
instruction) that was adding some extra zeroes at the end of built binaries. - Fixed a bug in
gen_tcp
that prevents an accepting socket from inheriting settings on the listening socket. - Fixed a bug in packing and unpacking integers into and from binaries when the bit length is not a multiple of 8.
- Fixed
esp:deep_sleep/1
that did not accept values above 31 minutes. - Fixed a bug that could cause processes to hang indefinitely when calling ports that have terminated.
- Fixed potential VM crash when parsing external terms.
- Fixed the enforcement of
min_free_space
process option.