In the modern landscape of embedded software development, efficiency and safety are paramount. As applications become more complex and demands on performance and security increase, developers turn to every tool in their arsenal to meet these challenges. Enter std::uintptr_t, a data type that, while not new, is sadly overlooked in most embedded codebases. This guide aims to introduce std::uintptr_t, showcasing its benefits and demonstrating how to use it effectively in your projects. This arti...| Sticky Bits - Powered by Feabhas
The Challenge of Fixed-Size Integers Before C99 In embedded programming, before adopting the C99 standard (ISO/IEC 9899:1999), a significant challenge was ensuring the consistent sizing of key data objects. This complexity stemmed from the C standard’s (ISO/IEC 9899) non-committal stance on the size of an int. We knew: A short is a minimum of 16-bits. A long is a minimum of 32-bits. An int is somewhere between a short and a long. This flexibility boosted C’s portability, making it a favou...| Sticky Bits - Powered by Feabhas
Introduction When we developed the CMake based toolchain for our training projects we used a shell script to simplify invoking the cmake command line. CMake 3.19 added a presets feature that allows us to define command line parameters in a CMakeSettings.json file which can be used in place of using multiple command parameters. In previous articles about CMake we have shown how we need to specify command line parameters to use CMake with an embedded target toolchain (see CMake Part 3). T...| Sticky Bits - Powered by Feabhas
Dynamic polymorphism (virtual functions) is central to Object-Oriented Programming (OOP). Used well, it provides hooks into an existing codebase where new functionality and behaviour can (relatively) easily be integrated into a proven, tested codebase. Subtype inheritance can bring significant benefits, including easier integration, reduced regression test time and improved maintenance. However, using virtual functions in C++ brings a runtime performance overhead. This overhead may appear inc...| Sticky Bits - Powered by Feabhas
Creating a flash image The primary purpose of the ihex file in the embedded space is to create a file that is used to program/reprogram a target system. There are various file formats around, with the Intel Hex (ihex) format being among the most widely used. The output of the linker stage of a build process is typically to generate a .elf file (Executable and Linkable Format). Many debuggers and programmers can work directly with the ELF file format. However, in many [...]| Sticky Bits - Powered by Feabhas
In my first blog post about C++20 Coroutines I introduced the concepts behind a synchronous or generator style coroutine and developed a template class to support coroutines for any data type. In this post I’ll add an iterator to the template to support the range-for loop and iterative algorithms. You may want to review that post before reading this one but the following code should act as a reminder about how to write and use a coroutine to read two floating [...]| Sticky Bits - Powered by Feabhas