|
Embedded Template Library 1.0
|
Embedded Template Library (ETL)
C++ is a powerful language for embedded systems development, with templates offering a great deal of flexibility and type safety. While the C++ Standard Library provides a wealth of well-tested functionality, it’s often not well suited to environments with strict deterministic behavior and limited resources.
In many embedded applications, dynamic memory allocation is discouraged or outright prohibited, making standard STL containers and many other components impractical or unusable.
What’s needed is a template library specifically designed for embedded systems — one that allows developers to define fixed or maximum sizes for containers and other objects at compile time. Additionally, since many embedded toolchains still lack full support for standards beyond C++03, it's valuable to have access to a library that backports select features from later versions of the C++ Standard Library.
The Embedded Template Library (ETL) is not intended as a full replacement for the C++ Standard Template Library (STL), but rather as a complementary solution tailored specifically for embedded systems.
Its design goals include:
The ETL avoids dynamic memory allocation entirely; the heap is never used. All non-intrusive containers have a fixed capacity, allowing memory requirements to be fully determined at compile-time. This makes the ETL ideal for lower-resource embedded applications where predictability, performance, and memory control are essential.
The library is compatible with any compiler that supports C++03 or later.
Help on integrating the ETL with your project may be found here.
Any help porting the library to work under different platforms and compilers would be gratefully received. I am especially interested in people who are using Keil, IAR, Green Hills, TI Code Composer etc, bare metal or RTOS, and DSPs.
See (https://www.etlcpp.com) for up-to-date information.
You can find the setup steps here.
One way to use this library is to drop it somewhere in your project directory and then make the library available by using add_subdirectory
If ETL library is used as a Git submodule it may require additional configuration for proper ETL version resolution by allowing the lookup for Git folder outside of the library root directory.
If you want to install this library with CMake, you can perform the following steps. On Linux, super user rights might be required to install the library, so it might be necessary to add sudo before the last command:
After the library has been installed, you can use find_package to use the library. Replace <majorVersionRequirement> with your desired major version:
Alternatively you can use FetchContent, replacing <targetVersion> with the version to install based on a git tag:
When using ETL in a project, there is typically an etl_profile.h defined to adjust ETL to the project needs. ETL will automatically find etl_profile.h if it is available in the include path(s). If it's not available, ETL will work with default values.
Although ETL is generally a self-contained header-only library, some interfaces need to be implemented in every project or platform, at least if those interfaces are actually being used, due to project specifics:
| ETL header | Platform specific API to be implemented | Needed when using |
|---|---|---|
| chrono.h | etl_get_high_resolution_clock() | etl::high_resolution_clock::now() |
| etl_get_system_clock() | etl::system_clock::now() | |
| etl_get_steady_clock() | etl::steady_clock::now() | |
| print.h | etl_putchar() | etl::print() |
| etl::println() |
The following default values apply if the respective macros are not defined (e.g. in etl_profile.h):
| Macro | Default |
|---|---|
| ETL_CHRONO_SYSTEM_CLOCK_DURATION | etl::chrono::nanoseconds |
| ETL_CHRONO_SYSTEM_CLOCK_IS_STEADY | true |
| ETL_CHRONO_HIGH_RESOLUTION_CLOCK_DURATION | etl::chrono::nanoseconds |
| ETL_CHRONO_HIGH_RESOLUTION_CLOCK_IS_STEADY | true |
| ETL_CHRONO_STEADY_CLOCK_DURATION | etl::chrono::nanoseconds |
The content of this repo is available as a library in the Arduino IDE (search for the "Embedded Template Library" in the IDE library manager). The Arduino library repository is available at https://github.com/ETLCPP/etl-arduino, see there for more details.