mirror of
https://github.com/ETLCPP/etl.git
synced 2026-04-30 19:09:10 +08:00
* Added compare_message_id * Added new C++11 and up message routing code using a sorted type_list * Renamed compare_message)id to compare_message_id_less * Added documenation for compare_message_id_less Added static asserts for message type template parameters * Added optimisation for contiguous message IDs Added more Doxygen documentation * Added etl::type_list_all_of, etl::type_list_any_of, and etl::type_list_none_of * Added etl::type_list_is_unique * Added common definitions to all router types * Added static_asserts to check message types * Added etl::type_list to etl::nth_type * Added missing 'typename' to type_list nth_type * Added type_list_is_empty * indentation fix * Renamed type_list_prepend & type_list_append to type_list_push_front & type_list_push_back respectively * Added tests for make_index_sequence & make_index_sequence_with_offset * Add more features to etl::type_list (#1307) * Remove AppVeyor build status badge Removed AppVeyor build status badge from README. * Update README.md * Update CONTRIBUTING.md Updated the instructions for contributing. * Added etl::type_list to etl::observer * Added etl::type_list to etl::nth_type * Added missing 'typename' to type_list nth_type * Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" (#1277) * Reproduce data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Fix data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Added type_list definitions for nth_type and observer * Added etl::type_list to etl::variant * Updated comments * Addedetl::type~_list to message_router, observer, visitor # Conflicts: # include/etl/observer.h # test/vs2022/etl.vcxproj.filters * Added member type_list type to tuple * Work in progress * Copy changes from other source * Removed unused tests * Fix iter_swap namespace * Add type_list functionality to etl::variant using etl::variant_from_type_list * Add type_list functionality to etl::message_packet using etl::message_packet_from_type_list * Add type_list functionality to etl::message_router using etl::message_router_from_type_list * Add type_list functionality to etl::observer using etl::observer_from_type_list * Add type_list functionality to etl::tuple using etl::tuple_from_type_list * Allow etl::make_index_sequence to be created from an etl::type_list * Add type_list functionality to etl::visitor using etl::visitor_from_type_list * Fix iter_swap namespace * Allow creation of a message_packet with no message types * Allow creation of a message_router with no message types * Updated VS2022 project files * Added missing test files CMakeLists.txt * Fix C++03 compatibility Fixed unused aregument warnings * Synced message_packet generator to updated code * Synced message_router generator to updated code * Synced message_router generator to updated code # Conflicts: # include/etl/generators/message_router_generator.h # include/etl/message_router.h * Fixed missing zero message specialisation for <= C++14 * Fixed missing zero message specialisation for <= C++14 * Fix year_month arithmetic and correct chrono API behavior (#1257) * Fix & add more tests for year_month arithmetic * Minor addtions to previous commit * More missing values to be uninitialized * Update the default constructors to = default and correct default constructor tests accordingly * Fix & add more tests for year_month arithmetic * Minor addtions to previous commit * More missing values to be uninitialized * Update the default constructors to = default and correct default constructor tests accordingly * Restore default constructor behavior for chrono calender * Suppress warnings from std in optimized builds (#1259) When testing with ./run-tests.sh 23 3 10, some warnings from std surfaced which resulted in build errors. * Add template deduction guide for span from vector (#1264) * Create span from vector deduction * Use ivector for deduction. Add vector_ext to test * Add vector pointer to test * Finish tests * Initialize pdata_ext and others * Document how to implement platform specifics (#1262) Some interfaces need to be implemented in every project or platform using the ETL: * etl_get_high_resolution_clock * etl_get_system_clock * etl_get_steady_clock * etl_putchar Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> * Fix etl::as_bytes for etl::span<const T> (#1266) A missing 'const' in the etl::as_bytes implementation was causing a compile-time error when etl::as_bytes was called on a span of const values. Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> * Remove some UB in test_vector_non_trivial.cpp (#1268) Some of the tests' UB are detectable by Gcc15 and thus give a compile error due to warnings-as-error flag. Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> * Update C++26 deprecated constructs to ensure future standard compliance (#1267) * Update C++26 deprecated constructs to ensure future standard compliance I replaced std::is_trivial with a combination of std::is_trivially_default_constructible and std::is_trivially_copyable. Additionally, I added the required comma before the ellipsis in variadic functions to match updated language specifications. * Some additional is_trivial related changes not found directly when compiling tests in C++26 --------- Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> * Fix return value of get_token_list (#1271) Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> * Fix etl::tuple template signature error in pair assignment operator (#1265) * Fix etl::tuple template signature error in pair assignment operator * Remove AppVeyor build status badge Removed AppVeyor build status badge from README. * Update README.md * Update etl::tuple to explicitly use etl::pair or std::pair in assignment operator * Added tests for etl::tuple assignment from pair --------- Co-authored-by: Bryton Flecker <bflecker@swe.com> Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> * Remove advance() on static spans (#1281) * Remove AppVeyor build status badge Removed AppVeyor build status badge from README. * Update README.md * Update CONTRIBUTING.md Updated the instructions for contributing. * Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" (#1277) * Reproduce data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Fix data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Remove advance() on static spans Since the size of a static span is constant, we can't reasonably advance() on it. --------- Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> Co-authored-by: Sergei <sergej.shirokov@gmail.com> * Add missing includes (#1286) * Remove AppVeyor build status badge Removed AppVeyor build status badge from README. * Update README.md * Update CONTRIBUTING.md Updated the instructions for contributing. * Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" (#1277) * Reproduce data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Fix data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Add missing includes Before this change, the includes needed to be done explicitly by files using basic_string_stream.h, and be included first. This was error prone, especially if includes are reordered (e.g. via the currently defined clang-format rules). --------- Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> Co-authored-by: Sergei <sergej.shirokov@gmail.com> * Move comparison operators of etl::expected to namespace etl (#1287) * Remove AppVeyor build status badge Removed AppVeyor build status badge from README. * Update README.md * Update CONTRIBUTING.md Updated the instructions for contributing. * Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" (#1277) * Reproduce data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Fix data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Move comparison operators of etl::expected to namespace etl --------- Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> Co-authored-by: Sergei <sergej.shirokov@gmail.com> * Make typed_storage constructor constexpr (#1291) * Remove AppVeyor build status badge Removed AppVeyor build status badge from README. * Update README.md * Update CONTRIBUTING.md Updated the instructions for contributing. * Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" (#1277) * Reproduce data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Fix data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Make typed_storage constructor constexpr --------- Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> Co-authored-by: Sergei <sergej.shirokov@gmail.com> * Add basic_format_arg constructor for ibasic_string (#1288) * Allow string as format arg * Remove AppVeyor build status badge Removed AppVeyor build status badge from README. * Update README.md * Update CONTRIBUTING.md Updated the instructions for contributing. * Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" (#1277) * Reproduce data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Fix data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Added test string escaped * Add temporary string test --------- Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> Co-authored-by: Sergei <sergej.shirokov@gmail.com> * QR Code for Github * Added etl::visitor_from_type_list * accepts(id) for empty router passes on to a sucessor * Fixed incorrect comment from 'tuple' to 'message_router' * PR review changes * PR review changes * Fixed internal constexptr flag in message_packet * Fixed unused variable in unti test * Added new type_list features Added make_index_sequence_with_offset * Renamed type_list_select_from_sequence to type_list_select_from_index_sequence * Replaced type_list_size<TTypeList>::value with TTypeList::size internally for better clarity. * Added etl::type_list_remove, etl::type_list_remove_if, etl::type_list_unique, etl::type_list_pop_front, etl::type_list_pop_back * Add ref-qualifiers to basic_format_spec (#1292) * Remove AppVeyor build status badge Removed AppVeyor build status badge from README. * Update README.md * Update CONTRIBUTING.md Updated the instructions for contributing. * Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" (#1277) * Reproduce data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Fix data corruption bug in the `etl::bip_buffer_spsc_atomic`. * feat: use ref-qualifiers for basic_format_spec Converted the l-value methods to ref-qualified and also added r-value ref-qualified methods. --------- Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> Co-authored-by: Sergei <sergej.shirokov@gmail.com> * Add support for size_t and unsigned long to etl::format (#1290) * Remove AppVeyor build status badge Removed AppVeyor build status badge from README. * Update README.md * Update CONTRIBUTING.md Updated the instructions for contributing. * Fix for issue 1276 "Data corruption in the etl::bip_buffer_spsc_atomic" (#1277) * Reproduce data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Fix data corruption bug in the `etl::bip_buffer_spsc_atomic`. * Add support for size_t and unsigned long to etl::format * Document list of supported types in etl::supported_format_types * Add further types and tests for etl::format --------- Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> Co-authored-by: Sergei <sergej.shirokov@gmail.com> * Deduce underlying storage size when constructing string_ext from char[]. (#1269) * Deduce underlying storage size when constructing string_ext from char[]. This removes the need for passing sizeof(storage) to the constructor. * Add array constructors for the other string types. - u16string_ext - u32string_ext - u8string_ext - wstring_ext * Add additional constructors to match existing API. * Fix inconsistent test argument order. --------- Co-authored-by: John Wellbelove <jwellbelove@users.noreply.github.com> * Added etl::type_list_all_of, etl::type_list_any_of, and etl::type_list_none_of * Added etl::type_list_is_unique * Added type_list_is_empty * indentation fix * Fix merge error * Renamed type_list_prepend & type_list_append to type_list_push_front & type_list_push_back respectively * Added tests for make_index_sequence & make_index_sequence_with_offset * Resolve coderabbit review issues * Resolve coderabbit review issues * Resolve coderabbit review issues * Resolve coderabbit review issues * Added etl::type_list_indices_of_type which create an etl::index_sequence of all of the indexes of a specified type in an etl::type_list * Updated comments * Resolve coderabbit review issues Added index_sequence utility to support type_list utilities. Added additional index_sequence utilities for completeness * Added etl::index_sequence_cat, etl::index_sequence_pop_front, etl::index_sequence_pop_back, etl::index_sequence_at * Fix 'unused variable' error in index_sequence tests --------- Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.co.uk> Co-authored-by: Sergei <sergej.shirokov@gmail.com> Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com> Co-authored-by: Bo Rydberg <2945606+bolry@users.noreply.github.com> Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de> Co-authored-by: Mike Bloom <91038685+mike919192@users.noreply.github.com> Co-authored-by: taltenbach <92919739+taltenbach@users.noreply.github.com> Co-authored-by: Bryton Flecker <fleckerbr@gmail.com> Co-authored-by: Bryton Flecker <bflecker@swe.com> Co-authored-by: Drew Rife <drew.rife95@gmail.com> Co-authored-by: Marco Nilsson <marco@zyax.se> * Moved O(1)/O(logN) index search test to get_dispatch_index_from_message_id Updated message_router generator * Fixed C++03 compatibilty * Replaced is_base_of with is_message * Missing 'return' in chrono example * Fixed doxygen comments * Check message inherits from etl::message<> * Copilot & coderabbit review changes Check for no duplicated message IDs Added diagnostic disable Make Message_Id_Start an etl::message_id_t type * Synchronised message_router_generator.h * Modified the "All message IDs must be unique" static_assert to directly use the index_sequence of message IDs Added addition index_sequence utilities to support this change. * Changed Router1 definition to use unordered message ids to check message sorting in message_router * Added has_message_id and compare_message_id_less to message.h * Moved member type definitions to a traits class message_packet, message_types, sorted_message_types * Sync message_router_generator to changes * Fixed C++03 compatibility --------- Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.com> Co-authored-by: John Wellbelove <john.wellbelove@etlcpp.co.uk> Co-authored-by: Sergei <sergej.shirokov@gmail.com> Co-authored-by: Bo Rydberg <2945606+bolry@users.noreply.github.com> Co-authored-by: Roland Reichwein <Roland.Reichwein@bmw.de> Co-authored-by: Mike Bloom <91038685+mike919192@users.noreply.github.com> Co-authored-by: taltenbach <92919739+taltenbach@users.noreply.github.com> Co-authored-by: Bryton Flecker <fleckerbr@gmail.com> Co-authored-by: Bryton Flecker <bflecker@swe.com> Co-authored-by: Drew Rife <drew.rife95@gmail.com> Co-authored-by: Marco Nilsson <marco@zyax.se>
266 lines
12 KiB
Markdown
266 lines
12 KiB
Markdown
#  Embedded Template Library (ETL)
|
||
|
||

|
||
[](https://img.shields.io/github/release-date/jwellbelove/etl?color=%231182c3)
|
||
[](https://en.wikipedia.org/wiki/C%2B%2B#Standardization)
|
||
[](https://opensource.org/licenses/MIT)
|
||

|
||

|
||

|
||
|
||

|
||
|
||

|
||

|
||

|
||

|
||

|
||

|
||
|
||

|
||

|
||

|
||

|
||

|
||

|
||
|
||
[](https://www.codacy.com/manual/jwellbelove/etl?utm_source=github.com&utm_medium=referral&utm_content=ETLCPP/etl&utm_campaign=Badge_Grade)
|
||
|
||
[](https://www.etlcpp.com/sponsor.html)
|
||
|
||
[Project documentation](https://www.etlcpp.com/)
|
||
|
||
## Motivation
|
||
|
||
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.
|
||
|
||
## About the ETL
|
||
|
||
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:
|
||
|
||
- Providing a set of containers with fixed or maximum sizes defined at compile-time.
|
||
|
||
- Offering APIs that closely resemble those of the STL, enabling familiar and consistent usage.
|
||
|
||
- Maintaining compatibility with C++98 while implementing many features introduced in later standards
|
||
(C++11/14/17/20/23) where possible.
|
||
|
||
- Ensuring deterministic behavior, which is critical in real-time and resource-constrained environments.
|
||
|
||
- Introducing additional components and utilities useful in embedded contexts but absent from the STL.
|
||
|
||
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.
|
||
|
||
|
||
## Key features of the ETL
|
||
|
||
- Actively Maintained: Developed and maintained on GitHub since 2014.
|
||
|
||
- Open Source: MIT licensed.
|
||
|
||
- No STL Dependency: Designed to operate independently of the C++ Standard Template Library.
|
||
|
||
- No Dynamic Memory Allocation: All storage is allocated either at compile-time or on the stack; heap usage is entirely avoided.
|
||
|
||
- RTTI and Virtual Functions: No runtime type information (RTTI) is required. Virtual functions are used sparingly and only when strictly necessary.
|
||
|
||
- Header-Only Library: All functionality is provided via header files; No separate compilation needed.
|
||
|
||
- Fixed-Capacity Containers: Offers STL-like containers with fixed or maximum capacity, plus additional non-standard container types.
|
||
|
||
- Cache Efficiency: Containers use contiguous memory layouts for optimal cache performance.
|
||
|
||
- Compact Codebase: Shared base classes (based on type) help reduce overall container code size.
|
||
|
||
- Compile-Time Features:
|
||
- Templated compile-time constants
|
||
- Template-based design pattern base classes (e.g., Visitor, Observer)
|
||
- Type-safe smart enumerations
|
||
- Type-safe typedefs and constants
|
||
|
||
- Embedded System Frameworks:
|
||
- Message routing
|
||
- Finite state machines
|
||
- Task scheduling
|
||
|
||
- C++11 Backports: Implements many C++11 features (type traits, algorithms, containers) for use in C++03 environments.
|
||
|
||
- Utilities:
|
||
- CRC calculations (8, 16, 32 & 64-bit)
|
||
- Checksums and hash functions
|
||
- Variants (type-safe unions)
|
||
- Extensive template support utilities
|
||
|
||
- Robust Error Handling: Configurable error checking using asserts, exceptions, error handlers, or no checks; user’s choice.
|
||
|
||
- Thoroughly Tested:
|
||
- Over 10,000 unit tests
|
||
- Tested with Visual Studio 2022, GCC 12, and Clang 14
|
||
- Continuous integration via GitHub Actions.
|
||
|
||
- Readable and Well-Documented: Clean, maintainable source code with clear documentation.
|
||
|
||
- Support: Free email support available. A Slack group is available. Paid support on request.
|
||
|
||
- Archived: A snapshot of the ETL is preserved in the Arctic Code Vault for long-term digital preservation.
|
||
|
||
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.
|
||
|
||
## Installing this library
|
||
|
||
You can find the setup steps [here](https://www.etlcpp.com/setup.html).
|
||
|
||
### CMake
|
||
|
||
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`
|
||
|
||
```cmake
|
||
add_subdirectory(etl)
|
||
add_executable(foo main.cpp)
|
||
target_link_libraries(foo PRIVATE etl::etl)
|
||
```
|
||
|
||
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.
|
||
|
||
```cmake
|
||
set(GIT_DIR_LOOKUP_POLICY ALLOW_LOOKING_ABOVE_CMAKE_SOURCE_DIR)
|
||
add_subdirectory(etl)
|
||
```
|
||
|
||
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:
|
||
|
||
```sh
|
||
git clone https://github.com/ETLCPP/etl.git
|
||
cd etl
|
||
git checkout <targetVersion>
|
||
cmake -B build .
|
||
cmake --install build/
|
||
```
|
||
|
||
After the library has been installed, you can use
|
||
[find_package](https://cmake.org/cmake/help/latest/command/find_package.html) to use the library.
|
||
Replace `<majorVersionRequirement>` with your desired major version:
|
||
|
||
```cmake
|
||
find_package(etl <majorVersionRequirement>)
|
||
add_executable(foo main.cpp)
|
||
target_link_libraries(foo PRIVATE etl::etl)
|
||
```
|
||
|
||
|
||
Alternatively you can use [FetchContent](https://cmake.org/cmake/help/latest/module/FetchContent.html),
|
||
replacing `<targetVersion>` with the version to install based on a git tag:
|
||
|
||
```sh
|
||
Include(FetchContent)
|
||
|
||
FetchContent_Declare(
|
||
etl
|
||
GIT_REPOSITORY https://github.com/ETLCPP/etl
|
||
GIT_TAG <targetVersion>
|
||
)
|
||
|
||
FetchContent_MakeAvailable(etl)
|
||
|
||
add_executable(foo main.cpp)
|
||
target_link_libraries(foo PRIVATE etl::etl)
|
||
```
|
||
|
||
## Profile definition
|
||
|
||
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.
|
||
|
||
### Example
|
||
|
||
```
|
||
#ifndef __ETL_PROFILE_H__
|
||
#define __ETL_PROFILE_H__
|
||
|
||
#define ETL_TARGET_DEVICE_GENERIC
|
||
#define ETL_TARGET_OS_NONE
|
||
|
||
#define ETL_NO_STL
|
||
|
||
#endif
|
||
```
|
||
|
||
## Platform specific implementation
|
||
|
||
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()` |
|
||
|
||
### Example
|
||
|
||
```
|
||
#include <etl/chrono.h>
|
||
#include <etl/print.h>
|
||
|
||
extern "C"
|
||
{
|
||
|
||
etl::chrono::high_resolution_clock::rep etl_get_high_resolution_clock()
|
||
{
|
||
return etl::chrono::high_resolution_clock::rep(static_cast<int64_t>(getSystemTimeNs()));
|
||
}
|
||
|
||
etl::chrono::system_clock::rep etl_get_system_clock()
|
||
{
|
||
return etl::chrono::system_clock::rep(static_cast<int64_t>(getSystemTimeNs()));
|
||
}
|
||
|
||
etl::chrono::system_clock::rep etl_get_steady_clock()
|
||
{
|
||
return etl::chrono::system_clock::rep(static_cast<int64_t>(getSystemTimeNs()));
|
||
}
|
||
|
||
void etl_putchar(int c)
|
||
{
|
||
putByteToStdout(static_cast<uint8_t>(c));
|
||
}
|
||
|
||
}
|
||
```
|
||
|
||
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` |
|
||
|
||
## Arduino library
|
||
|
||
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.
|