Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork22
Arduino Core based on Zephyr+llext
License
arduino/ArduinoCore-zephyr
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Important
This core is inBETA. 🧪
Features may change, and bugs may be present. Use for testing only and provide feedback to help us improve.
This repository contains the official implementation ofArduino Core for Zephyr RTOS based board.
Zephyr RTOS is an open-source, real-time operating system designed for low-power, resource-constrained devices. It's modular, scalable, and supports multiple architectures.
Install the core and its toolchains via Board Manager:
- Download and install the latestArduino IDE (only versions
2.x.x
are supported). - Open the'Settings / Preferences' window.
- Open the'Boards Manager' from the side menu and search for'Zephyr'.
- If it doesn’t appear, add the following URL to the'Additional Boards Manager URLs' field:
https://downloads.arduino.cc/packages/package_zephyr_index.json
(if you have multiple URLs, separate them with a comma).
- If it doesn’t appear, add the following URL to the'Additional Boards Manager URLs' field:
- Install the
Arduino Zephyr Boards
platform.
Alternatively, to install the core using the command line, run the following command with the Arduino CLI:
arduino-cli core install arduino:zephyr --additional-urls https://downloads.arduino.cc/packages/package_zephyr_index.json
To get started with your board:
- Put the board in bootloader mode by double-clicking the RESET button.
- Run the
Burn Bootloader
option from the IDE/CLI.- Note that due to limitations in the Arduino IDE, you may need to select any programmer from the
Programmers
menu.
- Note that due to limitations in the Arduino IDE, you may need to select any programmer from the
- Once the bootloader is installed, you can load your first sketch by placing the board into bootloader mode again.
Note
After the initial setup, future sketches will be loaded automatically without needing to reset the board.
A: Connect a USB-to-UART adapter to the default UART (eg. TX0/RX0 on Giga, TX/RX on Nano) and read the error message (with the sketch compiled inDefault
mode). If you don't own a USB-to-UART adapter, compile the sketch inDebug
mode; this will force the shell to wait until you open the Serial Monitor. Then, runsketch
command andprobably you'll be able to read the error (if generated byllext
). For OS crashes, the USB-to-UART adapter is the only way to collect the crash.
A: This means you are trying to use a Zephyr function which has not yet been exported. Openllext_exports.c
, add the function you need and recompile/upload the loader.
A: Open the.conf
file for your board, add the requiredCONFIG_
, recompile/upload the loader.
A: This is usually due to a buffer overflow or coding error in the user's own code. However, since the project is still in beta 🧪, agood bug report could help identify any issues in our code.
A: Since collecting bug reports is very important at this time, we are keeping Zephyr's shell enabled to allow loading a full sketch (which requires a large stack). Adjust your board's.conf
file to reduce the stack size if your platform doesn't have enough RAM.
- ArduinoBLE: This library is enabled only for the Arduino Nano 33 BLE. Please usethis branch to test it.
Unlike traditional Arduino implementations, where the final output is a standalone binary loaded by a bootloader, this core generates a freestandingelf
file. This file is dynamically loaded by a precompiled Zephyr firmware, referred to as theloader
.
Theloader
is responsible for managing the interaction between your sketches and the underlying Zephyr system. After the initial bootloader installation, theloader
takes over the sketch loading process automatically.
To ensure flexibility, theloader
project is designed to be generic. Any necessary modifications for specific boards should be made in the correspondingDTS overlay
or a specialfixup
file, using appropriate guards to maintain stability.
The behavior of theloader
can be adjusted through theMode
menu:
Standard
: The sketch is loaded automatically.Debug
: The user must typesketch
in Zephyr's shell, which is accessible via the default Serial.
The most important components of this project are:
- Zephyr based loader
- LLEXT
- Actual core withvariants and the usual
{platform,boards}.txt
- ArduinoCore-API
- post_build_tool
In this section, we’ll guide you through setting up your environment to work with the core.
Shell scripts are available to simplify the installation process (Windows is not supported at the moment 😔).
mkdir my_new_zephyr_folder&&cd my_new_zephyr_foldergit clone https://github.com/arduino/ArduinoCore-zephyr
Before running the installation script, ensure that Python,pip
andvenv
are installed on your system. The script will automatically installwest
and manage the necessary dependencies.
On Ubuntu or similarapt
-based distros, make sure to run the following command:
sudo apt install python3-pip python3-setuptools python3-venv build-essential git cmake ninja-build zstd jq
cd ArduinoCore-zephyr./extra/bootstrap.sh
Download and install the Zephyr SDK for your OS fromhere.
Note
This core is validated for version v0.16.8. Compatibility with later versions has not been tested yet.
To build the loader, run the following commands:
export ZEPHYR_SDK_INSTALL_DIR=$folder_where_you_installed_the_sdk./extra/build.sh$zephyr_board_name$arduino_variant_board_name
Replace$zephyr_board_name
and$arduino_variant_board_name
with the appropriate names for your board.
Example for Arduino Portenta H7:
./extra/build.sh arduino_portenta_h7//m7 arduino_portenta_h7
The firmwares will be copied tofirmwares folder.
If the board is fully supported by Zephyr, you can flash the firmware directly onto the board using the following command:
west flash
After running thebootstrap
script, you can symlink the core to$sketchbook/hardware/arduino-git/zephyr
. Once linked, it will appear in the IDE/CLI, and the board's Fully Qualified Board Name (FQBN) will be formatted asarduino-git:zephyr:name_from_boards_txt
.
To add a new board that is already supported by mainline Zephyr, follow these steps:
- Create the
DTS overlay
and.conf
files in theloader directory.The overlay must include:- A flash partition called
user_sketch
, tipically located near the end of the flash. - A
zephyr,user
section containing the description for GPIOs, Analog, UART, SPI and I2C devices. Feel free to leave some fields empty in case Zephyr support is missing. This will result in some APIs not being available at runtime (eg.analogWrite
if PWM section is empty).
- A flash partition called
- Build the Loader: run
./extra.build.sh $your_board $your_board
and start debugging the errors. 😁 - Update the
boards.txt
: add an entry for your board, manually filling the required fields. - Implement touch support: if your board supports the
1200bps touch
method, implement_on_1200_bps
in a file located inside thevariant/your_board
folder. - ⏳ Temporary steps
- Create
includes.txt
based onllext-edk/Makefile.cflags
, taking inspiration for other variants. - Amend
your_board.compiler.zephyr.*
with information fromllext-edk/Makefile.cflags
.
- Create
To report a bug, open theissues and follow the instructions. Any issue opened without the needed information will be discarded.
Contributions are always welcome. The preferred way to receive code contribution is by submitting aPull request.
Warning
At this stage of development, we only accept Pull requests for bug fixes and features. We donot accept support for new targets.
- Unify overlay inloader with the one provided invariant for interoperability with GSoC project
- Autogenerate
defines.txt
,includes.txt
,cflags.txt
fromllext-edk
output - Network: support UDP and TLS
- USB: switch to USB_DEVICE_STACK_NEXT to support PluggableUSB
- Relocate RODATA in flash to accomodate sketches with large assets
- Provide better error reporting for failed llext operations
- Replacellext_exports.c with proper symbols generation (via includes)
- Provide better usability for
Debug
builds (eg. shell over USB) - Fix corner cases with
std::
includes (like<iterator>
) - Get rid of all warnings
This effort would have been very hard without theGSoC project and the Zephyr community.
About
Arduino Core based on Zephyr+llext
Resources
License
Code of conduct
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Sponsor this project
Uh oh!
There was an error while loading.Please reload this page.
Packages0
Languages
- C++58.7%
- C22.7%
- Shell6.6%
- Go3.5%
- Linker Script3.4%
- CMake3.0%
- Other2.1%