GCC has support for using its Standard Template Library in AVR 8-bit microcontrollers since 2016, when we at Expertise Solutions pushed three commits upstream to GCC project.
You may ask, why use the STL? And if so, why not use another STL?
There are some tutorials and materials on the internet, including a ArduinoSTL project to implement partial STL support for AVR. However, they lack anything new from C++14 and up, like lots of type traits and other meta-programming goodies that allows zero-overhead over very advanced template-y code.
Other reasons include being able to use dependencies that do require STL. We were able to use Boost.Spirit library on the AVR for creating advanced parsers using just a few hundred bytes of footprint size by using the libstdc++v3.
Why libstdc++v3 didn’t work before?
There were 3 incompatibility problems that caused compilations errors.
First, there were codes in locale C++ standard library implementation
that used the tm fields directly in calls that would expect a specific
type as is defined in POSIX’s
struct tm. However, AVR libc uses a
struct tm implementation uses
int is expected.
fixes this by using a temporary
Pointers with 16 bits size
In libstdc++v3, exception implementation uses a Copy-On-Write implementation to avoid unnecessary reallocations, which could cause failure if the allocation fails. By doing that, it must abstract pointers in different integral types, which it was implemented only for 32-bit and 64-bit architectures.
The patch f68963c0923) implements the same logic for 16-bit pointers.
Add AVR targets to libstdc++v3 build
The last patch just adds to libstdc++v3’s autotools the AVR target so it can be compiled for the AVR platform.
We’ve been using GCC with STL for AVR microcontrollers for years now. Nobody seems to be aware that this is possible yet. Next post I’ll explain how to compile GCC with libstdc++v3 for AVR!
Let me know if you want to try in other 8-bit microcontrollers.