Problem statement I recently came across a situation in a project where I had the following code: 1 2 3 4 5 6 7 8 9 10 struct FaultInfo final { uint32_t r0; uint32_t r1; // And all the other register state of a Cortex-M0+ processor // ... uint32_t crc; }; [[gnu::section(".uninit")]] volatile FaultInfo fault_data; I was using this static region of data to persist some fault information across reboots, to log it on the next boot after recovering from the fault.| AllThingsEmbedded
One of the nice things about C++ compared to C is its ability to define reusable types and data structures. They make code reuse easier and also help with reasoning if the abstraction is high-level enough. Today we are going to talk about static_ptr from the library Ditto. Dynamic allocation is often forbidden when developing embedded systems. This leads to allocating most things either in the stack or globally. A static_ptr allows the user to statically allocate an object of a derived class ...| Posts on AllThingsEmbedded
Introduction to memory-mapping Note: This section is introductory material for those who are not yet familiar with the concept of memory-mapping. If you are already experienced with memory-mapping feel free to jump to the next section. Most likely you won’t miss anything new. One of the most common ways of accessing peripherals from a CPU is memory-mapping. In short, this means that the address space of the CPU has some addresses that when accessed read/write peripheral’s registers.| Posts on AllThingsEmbedded
In a previous blog we discussed the role of the NVIC in ARM Cortex-M microcontrollers. This peripheral will play a central role in booting our target application. First of all, we need to discuss the boot process in an ARM Cortex-M microcontroller. Boot process After Power On Reset the microcontroller assumes the NVIC table is located at address 0x00000000. The processor fetches the first two words in the NVIC table, corresponding to the top of the stack and the reset vector.| Posts on AllThingsEmbedded
Welcome to the second entry of the Bootloader series! Today we are going to be discussing the design and basic architecture of the bootloader application. As we talked about on the last post, we are not going to be using any libraries, other than the C++ standard library in order to maximize portability and performance and limit code bloat. This means that we will be writing our own Hardware Abstraction Layer for all the peripherals and core features of the bootloader.| Posts on AllThingsEmbedded
We are introducing a new series to the blog, containing all about bootloaders for small ARM Cortex-M microcontrollers. I hope you like it. What is a bootloader? A bootloader is a piece of firmware that takes care of booting the target application, as well as providing a mechanism to update the firmware on the field, where you don’t have the means to flash the device using more advanced hardware interfaces such as JTAG, SWD or ICSP.| Posts on AllThingsEmbedded
After researching some alternatives for mp3 decoding on STM32 microcontrollers, I found ST’s X-CUBE-AUDIO, a set of libraries and components for audio processing. It turns out that SpiritDSP developed a version of their MP3 decoding libraries for STM microcontrollers. You can download the software expansion kit following this link. It contains much more than just the SpiritDSP MP3 decoder, but this article will be focused just on how to get the MP3 decoder up and running.| Posts on AllThingsEmbedded
When developing bare metal applications it is required to supply some functions that we normally take for granted when developing code for mainstream OS’s. Setting the startup code is not inherently difficult but beware: some of the nastiest bugs you will ever see on bare metal can come from the startup code. What is actually needed to start the execution of the main function? Well, there are a few things that the C and C++ language specifications assume when starting a new program.| Posts on AllThingsEmbedded
Most people getting started with embedded development seem to find linker scripts just another piece of magic required to get up and running with their system. Even when they might already be familiar with memory-mapped peripherals and basic embedded concepts, the linker script and how it interacts with the GNU linker (ld) is still pretty mysterious. Today we will go through the main functions of a linker script to try to shed some light onto their operation.| allthingsembedded.com