The oldest, tried and true debugging technique is to sprinkle printf statements throughout embedded software in the hope that an insight to the system behavior will be gleaned. Using printf is not always advisable and can unforeseen real-time implications for the system. Let’s examine the fundamental issues with printf and then a few techniques that … Continue reading Getting the most performance from printf
Debugging embedded software is my least favorite activity but unfortunately a necessary evil. Thankfully recent advances in technology and tool chain innovation has resulted in a plethora of techniques to drastically speed up the debugging process. Let’s examine a few techniques starting from our traditional debugging by break-point through the more advanced instrument trace techniques. … Continue reading 5 Debugging Techniques for the ARM Cortex-M MCU
The debugger is arguably one of the most important tools available to embedded software engineers. The debugger is capable of not only loading firmware on a microcontroller but can peer into the depths of memory and registers, revealing its inner workings. Despite the debuggers importance, many developers overlook some of the most useful features of … Continue reading How well do you know your debugger?
I recently wrote an article for embedded.com entitled “A Peek Inside Amazon FreeRTOS” where I started to analyze the high-level behavior that the Amazon FreeRTOS application exhibits while running on an STM32F475 IoT Discovery Node. In this post, I will continue the analysis by demonstrating how a developer can follow the communication flow and examine … Continue reading Amazon FreeRTOS: Behind the Scenes
I’m a big believer that having the right tools for the job not only can speed up the job, but can also improve the quality of the end product. That is why every month I look at a different tool that can aid developers. This month, I’ve decided to take a look at my newly … Continue reading Unboxing the arm ULINKplus Programmer
The very terminology that we use when developing embedded software can set our perspective and have potentially devastating effects on our ability to deliver successfully. The most commonly used term to describe an issue with software is that “there is a bug” or that the code is “buggy”. The term bug implies that there is … Continue reading Bugs and Errors and Defects, Oh My!
Semi-hosting is a debugging capability supported by ARM processors that allows the embedded target to access i/o capabilities on a host PC through the debugging interface. The i/o capabilities are most often used with printf to transmit text data to a virtual terminal within the debugging environment but it can also be used for file … Continue reading Tools – Getting a grip on Semi-hosting
The greatest annoyance that I’ve ever encountered when developing embedded software is when I have to guess at what the software is doing. Back in the day, the best insight a developer could get into their application was to blink an LED and correlate it to the code that was executing. Today’s processors and development … Continue reading Tools – OS-Aware Debugging
Developing firmware that can be reused is an important and critical skill. The majority of engineers and teams that I interact with are stuck constantly reinventing the wheel on every project that they work on. In order to help developers understand how they can create not just reusable application code but reusable firmware, down to … Continue reading Developing Reusable Firmware – A Practical Guide to API’s, HAL’s and Drivers
When using an Eclipse based IDE to debug an embedded system, undoubtedly the reader has come across the reset and restart buttons in the debug perspective. From a high-level view, these two options may seem the same but there are important differences on when a developer should use restart over reset. Let’s look at how … Continue reading Embedded Basics – The Difference between Restart and Reset