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
jsonmodule to estdlib, compatible with Erlang/OTPjsonAPI - Added
Keyword.put_new/3to exavmlib - Added
JSONmodule to exavmlib (Elixir wrapper for estdlibjson) - Added
erlang:node/1BIF - Added
erts_internal:cmp_term/2 - Added
shortoption toerlang:float_to_binary/2anderlang:float_to_list/2 - Added generic unix support for uart using POSIX nifs
- Added RISC-V 64-bit (RV64IMAC) JIT backend
- Added arm32 JIT backend
- Added DWARF debug information support for JIT-compiled code
- Added I2C and SPI APIs to rp2 platform
- Added
code:get_object_code/1 - Added
erlang:display_string/1anderlang:display_string/2 - Added Thumb-2 support to armv6m JIT backend, optimizing code for ARMv7-M and later cores
- Added support for
binary:split/2,3list patterns andtrim/trim_alloptions - Added
timer:send_after/2,timer:send_after/3andtimer:apply_after/4
- ~10% binary size reduction by rewriting module loading logic
erlang:float_to_binary/2anderlang:float_to_list/2now accept{decimals, 0..253}and{scientific, 0..249}erlang:binary_to_float/1anderlang:list_to_float/1now use locale-independent parsing and strict format validation- ESP32: the
boot.avmpartition for Erlang-only images has been increased from 256KB to 512KB, matching the Elixir partition layout. Themain.avmoffset is now0x250000for all images (previously0x210000for Erlang-only).
- Fixed
erlang:cancel_timer/1return type spec and documentation to match OTP - Fixed map type ordering in term comparison to match OTP specification (maps should order between tuples and nil)
- Fixed a bug in
bs_matchget_taillogic that occurred with OTP26-compiled beams - Fixed locale-dependent decimal separator in
erlang:float_to_binaryanderlang:float_to_list - Fixed
erlang:binary_to_float/1anderlang:list_to_float/1returninginffor overflow instead of raisingbadarg - Fixed
erlang:raise/3with a built stacktrace causing an assertion failure when the re-raised exception passes through a non-matching catch clause
- Removed old
json_encodermodule (now standard Erlang/OTPjsonmodule is available)
- Added a limited implementation of the OTP
etsinterface - Added
code:all_loaded/0andcode:all_available/0 - Added
erlang:loaded/0 - Added
erlang:split_binary/2 - Added
inet:getaddr/2 - Added support for external pids and encoded pids in external terms
- Added support for external refs and encoded refs in external terms
- Introduce ports to represent native processes and added support for external ports and encoded ports in external terms
- Added
atomvm:get_creation/0, equivalent toerts_internal:get_creation/0 - Added menuconfig option for enabling USE_USB_SERIAL, eg. serial over USB for certain ESP32-S2 boards etc.
- Partial support for
erlang:fun_info/2anderlang:fun_info/1 - Added support for
registered_nameinerlang:process_info/2andProcess.info/2 - Added
net:gethostname/0on platforms with gethostname(3). - Added
socket:getopt/2 - Added
supervisor:terminate_child/2,supervisor:restart_child/2andsupervisor:delete_child/2 - Added support for 'erlang:--/2'.
- Added
esp:partition_read/3, and documentation foresp:partition_erase_range/2/3andesp:partition_write/3 - Added support for list insertion in 'ets:insert/2'.
- Support to OTP-28
- Added
atomvm:subprocess/4to perform pipe/fork/execve on POSIX platforms - Added
erl_epmdclient implementation to epmd usingsocketmodule - Added support for socket asynchronous API for
recv,recvfromandaccept. - Added support for UDP multicast with socket API.
- Added support for
ets:update_counter/3andets:update_counter/4. - Added
erlang:+/1 - Added
lists:append/1andlists:append/2 - Added
erlang:spawn_monitor/1,erlang:spawn_monitor/3 - Added
lists:dropwhile/2. - Support for
float/1BIF. - Added
erlang:get/0anderlang:erase/0. - Added
erlang:unique_integer/0anderlang:unique_integer/1 - Added support for 'ets:delete/1'.
- Added
lists:flatmap/2 - Added
io:fwrite/1,2,3andio:format/3as well as few io functions required by remote shell - Added
code:is_loaded/1andcode:which/1 - Added several
io_libfunctions includingio_lib:fwrite/2andio_lib:write_atom/1 - Added
init:get_argument/1,init:get_plain_arguments/0andinit:notify_when_started/1 - Added
application:get_env/2 - Added CodeQL analysis to esp32, stm32, pico, and wasm workflows
- Added Function.ex and Protocol.ex improving Elixir 1.18 support
- Added WiFi support for ESP32P4 via esp-wifi-external for build with ESP-IDF v5.4 and later
- Added Process.link/1 and unlink/1 to Elixir Process.ex
- Added
erlang:module_loaded/1 - Added
binary:longest_common_prefix/1 - Added
binary:replace/3,binary:replace/4 - Added
binary:match/2andbinary:match/3 - Added
supervisor:which_children/1andsupervisor:count_children/1 - Added
monitored_byinprocess_info/2 - Added mock implementation for
current_stacktraceinprocess_info - Added
erlang:list_to_bitstring - Reimplemented
lists:keyfind,lists:keymemberandlists:memberas NIFs - Added
AVM_PRINT_PROCESS_CRASH_DUMPSoption - Added
lists:ukeysort/2 - Added support for big integers up to 256-bit (sign + 256-bit magnitude)
- Added support for big integers in
binary_to_term/1andterm_to_binary/1,2 - Added
proc_lib - Added gen_server support for timeout tuples in callback return actions introduced in OTP-28.
- Added
sys - Added
esp:timer_get_time/0 - Added
esp_dacmodule, exposing DAC oneshot mode on ESPs that support it - Added support for resource managed binaries (
enif_make_resource_binary) - Added initial support for ESP32C5 and ESP32C61
- Added
Range:size/1 - Added missing
ledcfunctions for esp32 platform - Added support for Elixir GenServer and Supervisor.
- Added support for 10 new STM32 families by switching to STM32 official SDK
- Added
network:sta_connect/0,1andnetwork:sta_disconnect/0to ESP32 network driver. - Added option to set a custom callback for esp32 network driver
disconnectedevents - Added
network:sta_status/0to get the current connection state of the sta interface. - Added ESP32
-DATOMVM_ELIXIR_SUPPORT=onconfiguration option - Added support for ESP32 development builds to include NVS partition data at build time
- Added missing
inetfunctions:ntoa/1,parse_address/1,parse_ipv4_address/1,parse_ipv4strict_address/1 - Added support for new
is_integer/3BIF, introduced with OTP-29 - Support for OTP-29
- Added
base64:encode/2andbase64:decode/2functions, that take in addition also a map with encoding/decoding options, also Elixir(url_)encode64/(url_)decode64have been added toBase. - Added
nanosecondandnativetime unit support toerlang:system_time/1,erlang:monotonic_time/1, andcalendar:system_time_to_universal_time/2 - Added
erlang:system_time/0,erlang:monotonic_time/0, andos:system_time/0,1NIFs - Added
filename:join/1andfilename:split/1 - Added
crypto:generate_key/2,crypto:compute_key/4,crypto:sign/4andcrypto:verify/5 - Added
crypto:hash_init/1,crypto:hash_update/2andcrypto:hash_final/1 - Added
crypto:crypto_init/3,crypto:crypto_init/4,crypto:crypto_update/2andcrypto:crypto_final/1 - Added
crypto:crypto_one_time_aead/6andcrypto:crypto_one_time_aead/7 - Added
crypto:pbkdf2_hmac/5andcrypto:hash_equals/2 - Added
crypto:mac/4,crypto:mac_init/3,crypto:mac_update/2,crypto:mac_final/1andcrypto:mac_finalN/2 - Added
crypto:info_lib/0 - Added
erlang:crc32/1,erlang:crc32/2anderlang:crc32_combine/3 - Added support for Ed25519 curve when libsodium support is enabled at build time
(
AVM_USE_LIBSODIUM=ON) - Added support for
bagandduplicate_bagtable types inets - Added
ets:insert_new/2,ets:member/2,ets:lookup_element/4,ets:delete_object/2,ets:take/2,ets:update_element/3andets:update_element/4 - Added POSIX file functions:
atomvm:posix_seek/3,atomvm:posix_pread/3,atomvm:posix_pwrite/3,atomvm:posix_fsync/1,atomvm:posix_ftruncate/2,atomvm:posix_rename/2,atomvm:posix_stat/1,atomvm:posix_fstat/1 - Added POSIX directory functions:
atomvm:posix_mkdir/1,atomvm:posix_rmdir/1,
- Release images for ESP32 chips are built with ESP-IDF v5.5
- Only support ESP32P4 on ESP-IDF v5.5.2, v5.4.4 and later.
- ESP32: SPI peripheral defaults to
"spi2"instead of deprecatedhspi - Added
zlib:compress/1 - Entry point now is
init:boot/1if it exists. It starts the kernel application and callsstart/0from the identified startup module. Users who started kernel application (typically for distribution) must no longer do it. Startintnet_kernelis still required. - All arithmetic operations (
+,-,*,div,rem,abs, etc.) now support integers up to 256-bit - All bitwise operations (
band,bor,bxor,bnot,bsl,bsr) now support integers up to 256-bit - Float conversion functions now support converting to/from big integers
bslnow properly checks for overflowbinary_to_integer/1no longer accepts binaries such as<<"0xFF">>or<<" 123">>binary_to_integerandlist_to_integerdo not raise anymoreoverflowerror, they raise insteadbadarg.- Resources are now references instead of empty binaries.
- Badarg error return from calling crypto:crypto_one_time with invalid arguments now matches OTP24+.
- When function head doesn't match, function arguments are now in stacktrace
- Function arguments are added to stacktrace also for some NIFs, when one of the arguments is badarg
- Using a custom callback for STA disconnected events in esp32 network driver will stop automatic re-connect, allowing applications to use scan results or other means to decide when and where to connect.
- ESP32 cmake build options are now also exposed in
idf.py menuconfig. - ESP32 Elixir support is determined automatically from the offset of
boot.avmin the partition table. - ESP32 ports now flash a complete working image using the
idf.py flashtask. - ESP32 platform now uses reproducible builds.
- C API:
externaltermmodule was renamed toexternal_termand it has a completely new API
- Removed support for OTP versions < 26
- ESP32: improved sntp sync speed from a cold boot.
- Fixed
gen_serverinternal messages to match OTP so it works across erlang distribution - Utilize reserved
phy_initpartition on ESP32 to store wifi calibration for faster connections. - Support for zero count in
lists:duplicate/2. - packbeam: fix memory leak preventing building with address sanitizer
- Fixed a bug where empty atom could not be created on some platforms, thus breaking receiving a message for a registered process from an OTP node.
- Fix a memory leak in distribution when a BEAM node would monitor a process by name.
- Fix
list_to_integer, it was likely buggy with integers close to INT64_MAX - Added missing support for supervisor
one_for_allstrategy. - Supervisor now honors period and intensity options.
- Fix supervisor crash if a
one_for_onechild fails to restart. - Fix collision in references created with
make_ref/0on 32 bits platforms. - Fixed a bug in
OP_BS_CREATE_BIN - Fix re-raise behavior by implementing
erlang:raise/33rd argument support
- Removed deprecated
network_fsm
- Added
lists:keysort/2 - Added
lists:merge/2,3 - [ESP32] Added support to light sleep (
esp:light_sleep/0) and to GPIO and timer wakeup from light sleep.
- Fixed a bug where binary matching could fail due to a missing preservation of the matched binary.
- Fixed a bug where
lists:seq/2wouldn't return the empty list in valid cases. - bnot operator wasn't supporting boxed integers (integers bigger than 28-bit on 32-bit CPUs, and bigger than 60-bit on 64-bit CPUs).
- lists sort function now use a stable merge sort implementation instead of quick sort
- Added the ability to run beams from the CLI for Generic Unix platform (it was already possible with nodejs and emscripten)
- Added preliminary support for ESP32P4 (no networking support yet).
- Added memory info in
out_of_memorycrash logs to help developers fix memory issues. - Added documentation and function specs for uart driver
- Added
uart:read/2with a timeout parameter. - Missing
erlang:is_function/2BIF - Added
erlang:is_record/2 - Added ability to set per-interface
dhcp_hostnameon Pico W if present in config.
- Fixed specifications of nifs from
esp_adcmodule - ESP32: fix
gpio:init/1on GPIO >= 32 - Adding missing check, passing a non numeric argument to a function expecting a floating point might lead to a crash in certain situations.
- Fixed several bugs in
http_server(#1366) - Fixed generic_unix
socket_driverto return{gen_tcp, closed}when socket is closed on Linux instead of{gen_tcp, {recv, 104}} - Fixed a memory leak where modules were not properly destroyed when the global context is destroyd
- alisp: fix support to variables that are not binaries or integers.
- Fixed destruction of ssl-related resources
- Fixed corruption when dealing with specific situations that involve more than 16 x registers when certain VM instructions are used.
- Fixed ESP32 GPIO interrupt trigger
none - Fixed an issue where a timeout would occur immediately in a race condition
- Fixed SPI close command
- Added missing lock on socket structure
- Fixed a race condition affecting multi-core MCUs where a timeout would not be properly cleared
- Fixed a double free when esp32 uart driver was closed, yielding an assert abort
- Fixed compilation with latest debian gcc-arm-none-eabi
- Fixed
network:stop/0on ESP32 so the network can be started again - Fixed a memory corruption caused by
binary:split/2,3 - Fixed deadlock in socket code
- Fixed bug in opcode implementation (
select_val): when selecting a value among many others a shallow comparison was performed, so it was working just for plain values such as atoms and small integers - Fixed support for setting esp32 boot_path in NVS.
- Fixed race conditions in network:start/stop.
- Fixed crash calling network:sta_rssi(), when network not up.
- Fixed error handling when calling
minandmaxwith code compiled before OTP-26: there was a bug when handling errors from BIFs used as NIFs (when called withCALL_EXTand similar opcodes) - Fixed matching of binaries on unaligned boundaries for code compiled with older versions of OTP
- Added missing out of memory handling in binary_to_atom
- Fixed call to funs such as fun erlang:'not'/1, that make use of BIFs
- Fixed potential crashes or memory leaks caused by a mistake in calculation of reference counts and a race condition in otp_socket code
- Fixed an out of memory issue by forcing GC to copy data from message fragments
- Fixed a bug where calling repeatedly
process_infoon a stopped process could cause an out of memory error - Fixed possible concurrency problems in ESP32 UART driver
- Fixed concurrency and memory leak related to links and monitors
- Fixed issues with parsing of line references for stack traces
- Fixed memory corruption issue with
erlang:make_tuple/2 - Fix potential use after free with code generated from OTP <= 24
- Fix
is_function/2guard - Fixed segfault when calling
lists:reverse/1(#1600) - Fixed nif_atomvm_posix_read GC bug
- Fixed
erlang:is_number/1function, now returns true also for floats - Fixed unlink protocol and add support for
link/1on ports - Do not abort when an out of memory happens while loading a literal value
- Fixed potential memory corruption when handling integer immediates that are stored as boxed integer (this never happens with integers < 28 bits)
- Correctly set Pico-W unique dhcp hostname when using the default, previously all rp2040 devices used the same "PicoW" dhcp hostname, causing collisions when multiple rp2040 are on the same network. (See issue #1094)
- Fixed possible memory corruption when doing binary matching.
- Fixed an issue related to binary matching and more precisely endianness of bit skipping with OTP 25 and lower
- Fixed an issue with
bs_private_appendthat shouldn't gc, affecting code compiled with OTP<25 - Fixed a bug where
erlang:setnode/2would not work with large creation passed by OTP28 epmd on 32bits platforms
- ESP32 UART driver no longer aborts because of badargs in configuration, instead raising an error
- ESP32:
v0.6.6uses esp-idf v5.4.1 for pre-built images andv5.4.xis the suggested release also for custom builds
- ESP32: add a new Elixir release "flavor" with a bigger boot.avm partition that has room for Elixir standard library modules
- ESP32:
--bootoption to mkimage.sh tool - Add
erlang:atom_to_binary/1that is equivalent toerlang:atom_to_binary(Atom, utf8) - Support for Elixir
String.Charsprotocol, now functions such asEnum.joinare able to take also non string parameters (e.g.Enum.join([1, 2], ",") - Support for Elixir
Enum.at/3 - Add support for
is_bitstring/1construct which is used in Elixir protocols runtime. - Add support to Elixir
Enumerableprotocol also forEnum.all?,Enum.any?,Enum.each,Enum.filter,Enum.flat_map,Enum.reject,Enum.chunk_byandEnum.chunk_while - Support for
maps:merge_with/3 - Support for
lists:last/1andlists:mapfoldl/3 - Add support to Elixir for
Process.send/2Process.send_after/3/4andProcess.cancel_timer/1 - Add support for
handle_continuecallback ingen_server - Support for Elixir
List.Charsprotocol - Support for
gen_server:start_monitor/3,4 - Support for
code:ensure_loaded/1 - Support for
io_lib:latin1_char_list/1 - Add support to Elixir for
Keyword.split/2 - Support for
binary:split/3andstring:find/2,3 - Support for large tuples (more than 255 elements) in external terms.
- Support for
io:put_chars/2 - Support for
lists:nthtail/2 - Support for Elixir
IO.chardata_to_string/1 - Support for Elixir
List.duplicate/2 - Support for
binary:copy/1,2 - Support for directory listing using POSIX APIs: (
atomvm:posix_opendir/1,atomvm:posix_readdir/1,atomvm:posix_closedir/1). - ESP32: add support for
esp_adcADC driver, with Erlang and Elixir examples - Add handler for ESP32 network driver STA mode
beacon_timeout(event: 21), see issue #1100 - Support for mounting/unmounting storage on ESP32 (such as SD or internal flash) using
esp:mount/4andesp:umount/1 - Support for
binary_to_integer/2 - Support for
binary:decode_hex/1andbinary:encode_hex/1,2 - Support for Elixir
Base.decode16/2andBase.encode16/2 - Make external term serialize functions available without using
externalterm_to_binaryso terms can be written directly to a buffer. - Support for
erlang:list_to_integer/2 - Add
externalterm_to_term_copythat can be safely used from NIFs taking temporary buffers
- ESP32: Elixir library is not shipped anymore with
esp32boot.avm. Useelixir_esp32boot.avminstead Enum.find_indexandEnum.find_valuesupport Enumerable and not just lists- Install AtomVM libraries source code and binaries for better dialyzer integration
- Made the
device_configproperties list inspi:open/1optional (defaults to[]), so you can use the function with only abus_config
- ESP32: content of
boot.avmpartition is not truncated anymore - ESP32:
Fixed gpio:set_intto accept any pin, not only pin 2 - Fix memory corruption in
unicode:characters_to_binary - Fix handling of large literal indexes and large extended literal indexes
unicode:characters_to_list: fixed bogus out_of_memory error on some platforms such as ESP32- Fix crash in Elixir library when doing
inspect(:atom) - General inspect() compliance with Elixir behavior (but there are still some minor differences)
- Fix several uses of free on prevously released memory on ESP32, under certain error condition using
network:start/1, that would lead to a hard crash of the VM. - Fix a bug in ESP32 network driver where the low level driver was not being stopped and resoureces were not freed
when
network:stop/0was used, see issue #643 uart:open/1,2now works with uppercase peripheral names
- Implement
gpio:init/1on esp32 to initialize pins for GPIO usage, which some pins require depending on default function and bootloader code - Implement missing opcode 161 (raw_raise), that looks more likely to be generated with Elixir code
- Support for Elixir
Map.replace/3andMap.replace!/3 - Support for Elixir
Kernel.structandKernel.struct! - Support for Elixir
IO.iodata_to_binary/1 - Support for Elixir exceptions:
Exceptionmodule and the other error related modules such asArgumentError,UndefinedFunctionError, etc... - Support for Elixir
EnumerableandCollectableprotocol - Support for Elixir
Enumfunctions:split_with,join,map_join,into,reverse,sliceandto_list - Support for Elixir
MapSetmodule - Support for Elixir
Rangemodule - Support for Elixir
Kernel.minandKernel.max - Support (as stub) for
erlang:error/3(that is required from Elixir code)
- Simple http client, that can be used for different use case such as downloading OTA updates
- Elixir support for
Keyword.mergeKeyword.takeKeyword.pop(!)Keyword.keyword?Keyword.has_key?functions. - Support for ESP32-H2
- lists:keytake/3 implemented.
- Support for setting channel used by network driver wifi access point.
- Support for
maps:iterator/2and~kpwithio_lib:format/2that were introduced with OTP26. - Support for
erlang:apply/2 - Support for
lists:keystore/4 - Support for
erlang:size/1bif - Support for USB serial output on ESP32 (needs to be manually enabled)
- Support for
lists:filtermap/2 - Support for standard library
queuemodule - Support for
maps:from_keys/2NIF - Support for standard library
setsmodule
- ESP32 network driver messages for event 40 (home channel change events) are now suppressed, but the details for the channel changes can be observed in the console log if "debug" level logging is enabled in ESP-IDF Kconfig options.
- Default size of ESP32 RTC slow memory from 4086 to 4096, except on ESP32-H2 where it's 3072
- Update
byte_size/1andbit_size/1to implement OTP27 match context reuse optimization OTP-18987.
- Fix bug (with code compiled with OTP-21) with binary pattern matching: the fix introduced with
02411048was not completely right, and it was converting match context to bogus binaries. - Fix creation of multiple links for the same process and not removing link at trapped exits. See issue #1193.
- Fix error that is raised when a function is undefined
- Fix a bug that could yield crashes when functions are sent in messages
- Fix bug where failing guards would corrupt x0 and x1
- Fix a memory leak when raising out of memory error while executing PUT_MAP_ASSOC instruction
- Support for DragonFly BSD (generic_unix platform).
- Added guards
is_evenandis_oddto theIntegermodule - Add a number of functions to proplists module, such as
delete/2,from/to_map/1, etc... - Add
esp:deep_sleep_enable_gpio_wakeup/2to allow wakeup from deep sleep for ESP32C3 and ESP32C6. - Obtain RSSI of the current connection with
network:sta_rssi/0on ESP32. - Pico-W support for
network:sta_rssi/0. - Add support to ESP32C2
- 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
binaryoption handling inssl:connect/3sobinarycan be used instead of{binary, true}. - Fix scheduling of trapped process that were wrongly immediately rescheduled before being signaled.
- Fix
gen_tcpandssltypes. - Fix documentation and specification of
esp:sleep_enable_ext0_wakeup/2andesp: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,activemust 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/1anderlang:display/1: the unique integer was truncated on some 32-bit architectures - Stop hardcoding
erl_evalas 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_initfor 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_OFFSETfor all current Esp32 models.- Added API to send messages from FreeRTOS tasks or pthreads, typically to easily support integration with Esp32 callbacks
BOOTLOADER_OFFSETwas 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/0andgpio:close/1that would cause the VM to crash.
- Support for utf8 encoding to
*_to_atomandatom_to_*functions binary_to_atom/1andatom_to_binary/1that default to utf8 (they were introduced with OTP23)- Added Pico cmake option
AVM_WAIT_BOOTSEL_ON_EXIT(defaultON) to allow tools to use automatedBOOTSELmode 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
cmakeconfiguration optionAVM_USB_WAIT_SECONDSadded 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_SENDthat would accept sending a message to any integer or term without raising an error. binary_to_termchecks atom encoding validity, and fix latin1 support (when non-ASCII chars are used)- ESP32: fixed bug in
gpio:set_pin_mode/2andgpio:set_direction/3that would accept any atom for the mode parameter without an error. - ESP32: GPIO driver fix bug that would accept invalid
pulldirection, and silently setpulldirection tofloatingwithout 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/2that would accept any parameter as a validpullmode. - 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/2validates utf8 strings*_to_atomandatom_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/0for retrieving the default MAC address on ESP32. - Added support for
picoandpocias an alternative tomosiandmisofor 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 just0and 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
misoormosidefault 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=onfor STM32 platform to enable use of single precision hardware FPU on F4/F7 devices. - Fixed a bug where emscripten
register_*_callback/1functions 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_millistosys_monotonic_time_u64,sys_monotonic_time_u64_to_msandsys_monotonic_time_ms_to_u64. - Implement
atomvm:random/0andatomvm:rand_bytes/1on top ofcrypto:strong_rand_bytes/1on generic_unix, ESP32 and RP2040 platforms. - Performance improvements
- Added support for the OTP
socketinterface. - Enhancd performance of STM32 by enabling flash cache and i-cache with branch prediction.
- Added cmake configuration option
AVM_CONFIG_REBOOT_ON_NOT_OKfor 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
sslinterface. - Added support for
crypto:one_time/4,5on Unix and Pico as well as forcrypto:hash/2on Pico - Added ability to configure STM32 Nucleo boards onboard UART->USB-COM using the
-DBOARD=nucleocmake option - Added STM32 cmake option
-DAVM_CFG_CONSOLE=to select a different uart peripheral for the system console - Added
crypto:strong_rand_bytes/1using 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>> = Binis not supported). - Added experimental backend to
get_tcpandget_udpbased on the newsocketinterface - 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,5on 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
-hand-vflags 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_binaryfunctions. - Fixed
monotonic_time/1andsystem_time/1functions 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/1function. - Added
AVM_VERBOSE_ABORTCMake 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/3andspi:write_read/3functions 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/2ingen_udpandgen_tcpmodules. - Added ability to get the atomvm version via
erlang:system_info. - Added
erlang:is_boolean/1Bif. - 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
mathmodule - Added support for
erlang:integer_to_list/2anderlang:integer_to_binary/2 - Added functions
esp:sleep_enable_ext0_wakeup/2andesp:sleep_enable_ext1_wakeup/2. - Added support for FP opcodes 94-102 thus removing the need for
AVM_DISABLE_FP=Onwith OTP-22+ - Added support for stacktraces
- Added support for
utf-8,utf-16, andutf-32bit syntax modifiers (put and match) - Added support for Erlang
gpio:close/1and ElixirGPIO.close/1for ESP32 - Added support for the Erlang
gen_eventmodule - Added
start_linksupport for thenetworkmodule - Added support for
erlang:monotonic_time/1 - Added
start_linksupport for thegen_statemmodule - Added support for serializing floats in erlang external term encoding
- Added support for the
SMALL_BIG_EXTerlang 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/0function - Added
esp:nvs_fetch_binary/2andnvs_put_binary/3functions (esp:nvs_set_binaryand functions that default to?ATOMVM_NVS_NSare deprecated now). - Added most format possibilities to
io:format/2andio_lib:format/2 - Added
unicodemodule withcharacters_to_list/1,2andcharacters_to_binary/1,2,3functions - 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
supervisormodule - 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/2not 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:startfunction to return the tuple{ok, Pid}on a successful call, instead of the bare atomok. Applications that usenetwork:startand check the return value will need to be modified. - The return type of
i2c:read_byteshas changed from returning just a binary to returning the tuple{ok, Binary}when successful. - The return type of many
i2coperations under error conditions has changed fromerrorto{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_DRIVERfor 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_COLLECTIONfor 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_statemprocess. - 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
startoption was handled frombs_restore2instruction: 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_appendinstruction) that was adding some extra zeroes at the end of built binaries. - Fixed a bug in
gen_tcpthat 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/1that 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_spaceprocess option.