modm: a barebone embedded library generator¶
modm (pronounced like dial-up "modem") is a toolbox for building custom C++20 libraries tailored to your embedded device. modm generates startup code, HALs and their implementations, communication protocols, drivers for external devices, BSPs, etc… in a modular, customizable process that you can fine-tune to your needs.
- Install the toolchain and explore our examples.
- You can discover the modm library in more detail.
- Easily start your own completely custom project.
- Our CI checks every contribution for regressions.
- We care about testing modm.
- API reference is available here.
- We do quarterly releases with a curated changelog.
This project also has a technical blog to document larger design concepts.
- You found a bug? Open up an issue, we don't bite.
- You want to contribute? Read the contribution guidelines and open a pull request.
modm is optimized for the harsh requirements of the Eurobot competition, where our robots need to run reliably and completely autonomously for the game's 100 second duration. Our robots contain a lot of different microcontrollers, some without a lot of resources, so modm needs to fulfill a diverse set of objectives, like small code size with small memory consumption, predictable program flow, extreme portability.
The library source code is licensed as MPLv2 with any external source code under compatible licenses (BSD, Apache2, MIT). So feel free to fork this project and adapt it to your needs. The only thing we ask of you is to contribute your changes back so everyone can benefit.
Please clone modm recursively, you need all the submodules:
git clone --recurse-submodules --jobs 8 https://github.com/modm-io/modm.git
- Efficient and fast object-oriented C++20 API.
- Support for hundreds of AVR and ARM Cortex-M microcontrollers from Atmel and ST.
- Build system agnostic: Choose SCons, CMake, Makefile or use your own.
- Data-driven, target-specific HAL generation using the lbuild engine.
- No memory allocations in HAL with very low overall RAM consumption.
- Highly configurable modules with sensible defaults and lots of documentation.
- Cross-platform peripheral interfaces incl. bit banging:
- GPIO, External Interrupt and IO expanders.
- ADC, DAC and Comparators.
- UART, I2C, SPI, CAN and Ethernet.
- Interfaces and drivers for many external I2C and SPI sensors and devices.
- Debug/logging system with IOStream and printf interface.
- Lightweight, stackless threads and resumable functions using cooperative multitasking.
- Functional (partial) libstdc++ implementation for AVRs.
- Useful filter, interpolation and geometric algorithms.
- Lightweight unit testing system (suitable for AVRs).
- Hundreds of tests to ensure correct functionality.
- Integration of useful third-party software:
modm can create a HAL for 3175 devices of these vendors:
- STMicroelectronics STM32: 2621 devices.
- Microchip SAM: 166 devices.
- Microchip AVR: 388 devices.
Here is a table with all device families and the peripheral drivers they support:
- ✅ Implemented as a software driver in modm.
- ○ Available in hardware but missing a software driver in modm.
- ✗ Unavailable in hardware or device with that peripheral not supported by modm.
Note that this is a summary overview and your specific device may not have all the peripherals in this table. Please discover modm's peripheral drivers for your specific device.
We are only a small team of developers and are limited in the amount of devices we can support and test in hardware. Open an issue to ask if your specific device is supported out-of-the-box and what you can do if it is not.
We have out-of-box support for many development boards including documentation.
We also have a number of completely target-independent drivers for external devices connected via I2C, SPI, UART, BitBang, etc. Most of these also give you access to the entire device so you can easily configure them for you specific needs.
We have a huge number of examples which are always up-to-date and compilable as enforced by our CI.