Core libraries that we release regularly
There are several core libraries that we keep in lock step in terms of compatibility and board support. These libraries are:
- TaskManagerIO provides core event and task scheduling services to Arduino sketches.
- IoAbstraction provides user input, EEPROM and IO helper classes.
- tcMenu a fully fledged embedded menu framework with a designer UI and IoT capabilities
- SimpleCollections a simple binary searchable list and a thread/interrupt safe circular buffer that work on a very wide range of boards.
- LiquidCrystalIO a task manager friendly fork of the Arduino LCD library that works over many IO devices.
The above libraries support a wide range of hardware, including nearly every official Arduino board, most ESP boards, along with many mbed version 5 and 6 boards with or without an RTOS. We test with everything from Uno to ESP32 and large STM32F4 boards.
What boards do our libraries support?
|Processor||Platform||Libraries||Locking||DAC||Developer boards we test with|
|AVR||Arduino||Fully tested||Atomic||No||Uno - some features limited|
|AVR||Arduino||Fully tested||Atomic||No||MEGA 2560, WifiR2|
|SAMD||Seeed Arduino||Fully tested||Atomic||Yes||MG126 board|
|nrf52840||Arduino(mbed)||Fully tested||CAS||Yes||Nano 33 BLE devices|
|RPI Pico||Arduino(mbed)||Fully tested||CAS||No||Raspberry PI pico, TFT, encoder|
|RPI Pico||Arduino(EarlePH)||Fully tested||CAS||No||Raspberry PI pico, TFT, encoder|
|ESP8266||Arduino||Fully tested||Atomic||No||Node MCU, Heltek Wifi 8|
|ESP32||Arduino||Fully tested||CAS||Yes||Wifi32, AZ Dev Kit|
|ESP32S2||Arduino||Fully tested||CAS||Yes||ESP32S2 Saloma|
|ESP32S3||Arduino||Fully tested||CAS||No||ESP32S3 Tiny|
|STM32F4||Stm32Duino||Fully tested||Hybrid||Yes||Nucleo STM32F4x9ZI OLED|
|STM32F4||mbed||Fully tested||CAS||Yes||Nucleo/Disc1 STM32F4x9ZI LTDC/OLED|
|Particle||Photon||User tested||Atomic||No||Unknown, user tested|
|SAM||Arduino||Compilation||Atomic||Yes||Arduino Due compile test only|
Although we only test on some Arduino mbed boards, it should work on nearly all that we know of, you can take a look at the list of mbed boards we check for here, if another springs to light that we haven’t added please try adding it to that define statement, and if it works let us know.
- For both mbed direct and Arduino that’s based on mbed we rely on mbed inbuilt CAS locking. We’ve tested on a few different Arduino mbed and direct mbed boards.
- For ESP32 we use the underlying CAS capabilities to ensure cross core locking
- On ESP boards we call yield more often within the run loop to prevent watchdog resets.
- On Raspberry PI pico earlephilhower core, circular buffers and task manager use a critical section to synchronize data.
- On STM32Duino at the moment we are transitioning from using Arduino Atomic functions to using direct LDREX/STREX calls. Completed for CircularBuffer but not TaskManager.
How does platform determination work
Most of our libraries support adding a file locally in the root of your source called
zio_local_definitions.h, once added this will be included by the platform determination before doing anything else. This allows two ways of setting build level flags, firstly by providing them in the build options, secondly within this file. This means that you can easily define build options when using Arduino 1.x IDE.
Whenever you include
TaskManagerIO.h this pulls in
TaskPlatformDeps.h to work out what platform you’re building for, and to create suitable thread safety and CAS or Atomic based locking constructs for that platform. Again the thread safety is so that you can put events into task manager from any thread, or trigger events from interrupts. You should only ever call runLoop from a single thread, usually for the default
taskManager instance that would be the
loop() method on Arduino, or
main() on mbed.
Whenever you include
IoAbstraction.h or include
PlatformDetermination.h directly, then IoAbstraction need to work out how to provide all input output features that it supports. This allows the rest of IoAbstraction not to concern itself with platform differences. This goes right down to GPIO, the way I2C works, and even analog IO support. For ESP32 we provide analog input and output using IDF functions, allowing the analog support on ESP32 to support the inbuilt DAC, ADC and PWM (using LEDC).
Simple collections circular buffer is thread and interrupt safe, this is achieved by checking the board type we have compiled to providing a suitable atomic compare and update facility for that platform. On mbed it uses mbed atomic, on STM32Duino F4 it uses LDREX, on ESP32 it uses the RTOS contructs. On other boards it uses standard Arduino atomic functions. It should be safe on all the boards listed in the supported section, and probably more besides.
Java UIs and frameworks
In addition to this the Java UI framework which is heavily based on JavaFX is used for the designer, embedCONTROL UI and embedded java apps is tested on a wide range of hardware, we suggest using the excellent Liberica JDK as it has JavaFX built in, and a 32bit build for Raspberry PI available.
|Platform||Designer||embedCONTROL||Java Embedded||JDK Used|
|Windows 10/11||Fully tested||Fully tested||Fully tested||Liberica|
|MacOS||Fully tested||Fully tested||Fully tested||Liberica|
|Ubuntu desktop||Fully tested||Fully tested||Fully tested||Liberica|
|Raspberry PI||Fully tested||Fully tested||Fully tested||Liberica|
The webserver version of embedCONTROL is built in TypeScript, we target most modern browsers and test with desktop and mobile version of both Chrome and Safari. The generated website is highly standards compliant, based on React.JS, and therefore should work with a very wide range of browsers.
Are there differences between platforms
We have tried as hard as we can to avoid any user-level differences in core features between platforms. It should work close to identically on all platforms that we support. There are obviously a few extra features on some platforms that are available to use, but when using these it should be pretty clear they platform specific.
TcMenu is a modular, IoT ready multi level menu library for Raspberry PI, Arduino and mbed supporting many input, display and IoT / remote interfaces. It makes presenting configuration, status and operational information much easier. Start by building out your systems state represented by menu-items in the Designer UI. Then, run Code Generator which outputs code for the selected board. Finally, compile the code using your favourite IDE and test on your device.
This library provides abstractions that help you write event-driven Arduino and mbed applications. It contains a simple task management facility, device pin abstraction where IO expanders can be treated like pins, interrupt management, button de-bouncing and rotary encoder support. There are many examples packaged with the library that cover most use cases. For development, you can use any Arduino or mbed IDE. However, our recommendation is platformIO with Clion or VS Code.
TaskManagerIO - Summary TaskManagerIO provides scheduling, events and interrupt marshalling, all while remaining thread safe across a wide range of boards. By thread safe we mean that you can add tasks to task manager from another thread while it’s still running. However, the task manager itself will always run on one thread, making it easy for you to write code. This library contains the original scheduling support class TaskManager that was previously built into IoAbstraction.
SimpleCollections - Summary Simple collections provides a binary search based list and also a circular buffer that work over a wide range of devices, including Uno. This allows TcMenu and IoAbstraction to use this collection support even when running on an Uno board! Currently, most of the documentation is on GitHub and the reference docs are also linked below. Read the reference documentation Using btree list Using thread-safe circular buffers Go to the code repo on github Arduino library compatibility matrix
LiquidCrystalIO is a fork of the LiquidCrystal library for HD44780 devices that works on both Arduino and mbed devices, integrating with IoAbstraction library. Further, it also works either with device pins or any IO expansion device supported by IoAbstraction, including direct pins, PCF8574, PCF8575, MCP23017 and shift registers. Importantly, HD44780 displays are slow, very slow in fact, running at around 270Khz. This means that there are inevitable delays involved in programming the device, in this fork those delays give some time back to task manager so that other tasks can run while waiting.
We maintain a fork of Adafruit_GFX that provides OLED support on mbed RTOS, it’s based on the original work by both AdaFruit - Adafruit_GFX repo and the original SSD1306 library for mbed 2. We’ve got everything to compile on mbed RTOS 5 & 6, and we use it ourselves on our STM32F439 test board as one of our core tests. The repository is hosted on GitHub [https://github.com/davetcc/Adafruit-GFX-mbed-fork/] and is tested on STM32 hardware.
LED Display is a library that can manage multiple 7-segment displays using the multiplex technique.