Fixing “REENT malloc succeeded” Assertion

One little nasty assertion in the GNU standard library appeared a few days ago, kind out of nowhere, reporting “REENT malloc succeeded”:

Obviously it was caused by the call to srand() which sets the ‘seed’ for the standard library (pseudo) random number generator. The assertion happens as well later for calling the rand() function.

Continue reading

Energy Crisis in Europe: Optimizing a Building from 4.5 to 2.4 MWh

With the war in the Ukraine, energy prices in Europe reached new record levels. This initially affected the gas price which does not affect me directly. But it had a big impact on the price for electrical energy too. In my village, the price for electrical energy is now at 0.45 CHF/kWh, starting October 1st 2022. It is twice as much as what it used to be, and three times more what it used to be the price for the energy at night time.

Saving energy always makes a lot of sense, now even more, both for the environment and directly saving money. Luckily, I started thinking about optimizing the electrical energy used in my house back in 2021, and now in 2022 it really pays off: The daily average of 16 kWh/day (including heating and cooling) came down to 7 kWh/day, or from 4.5 MWh/year down to 2.4 MWh/year, or a reduction of 47%.

There were different areas contributing to this very positive result:

The above graph shows the changes in the different categories, from 2021 (blue, 4.5 MWh) to 2022 (orange, 2.4 MWh).

Continue reading

Installing eGit into CodeWarrior Development Studio for MCU v11.1

Sometimes it can be a challenge to update or add plugins to older software or Eclipse versions. The ‘CodeWarrior for MCU’ from NXP is legacy and replaced by the newer MCUXpresso IDE and tools, but I continue to use CodeWarrior for our older projects, and it still works fine after all the years and Windows host updates. However, trying to install from the standard eGit Update site fails:

Continue reading

How to make sure no Dynamic Memory is used

In many embedded applications, it is mandatory that memory allocation is static and not dynamic. Means that no calls to things like malloc() or free() shall be used in the application, because they might fail at runtime (out of memory, heap fragmentation).

But when linking with 3rd party libraries or even with the C/C++ standard libraries, how to ensure no dynamic memory is used? The problem can occur as well for C++ objects, or a simple call to printf() which internally requires some dynamic memory allocated.

Continue reading

Loading Multiple (Binary) Files with GDB

A typical debugging session involves just one ELF/Dwarf binary or executable. But what if I need to program multiple binary files with gdb? Things like loading both the bootloader and the application binary? Or I have a an on-chip file system or data section I need to program?

In this article I show how I can use gdb to load and program extra data, like a binary (.bin) file, both using command line interface and using an IDE.

Continue reading

Shut Down C++ Embedded Systems with Calling the global Destructors

If using C++ on an embedded target, you depend on the constructors for global objects being called by the startup code. While in many cases an embedded system won’t stop, so you don’t need to call the global C++ destructors, this is still something to consider for a proper shutdown.

Calling OOP Destructors after leaving main()
Continue reading

Picoprobe: Using the Raspberry Pi Pico as Debug Probe

In Getting Started: Raspberry Pi Pico RP2040 with Eclipse and J-Link I used a SEGGER J-Link EDU for debugging: unfortunately, probably because of silicon shortage, these EDU probes are out of stock everywhere. Luckily, there is a solution: just use another Raspberry Pi Pico!

SWD Debugging with PicoProbe

This turns a $5 Raspberry Pi Pico board in to a very usable and versatile debug probe.

Continue reading

Tutorial: Creating Bare-bare Embedded Projects with CMake, with Eclipse included

MCU vendors offer SDKs and configuration tools: that’s a good thing, because that way I can get started quickly and get something up and running ideally in a few minutes. But this gets you into a dependency on tools, SDK and configuration tools too: changing later from one MCU to another can be difficult and time consuming. So why not get started with a ‘bare’ project, using general available tools, just with a basic initialization (clocking, startup code, CMSIS), even with the silicon vendor provided IDE and basic support files?

In this case, I show how you easily can do this with CMake, make and Eclipse, without the (direct) need of an SDK.

NXP LPC55S69-EVK with LoRa Shield
Continue reading

Custom ${user} with C/C++ Code Templates

The Eclipse Editor has a very cool feature named ‘Code Templates’: With such templates files are created with specific pre-filled content. For the templates, variables like ${user} for the user name can be used, see Custom C/C++ Headers with Eclipse:

Eclipse Code Template Editor
Continue reading

Choosing GNU Compiler Optimizations

Tool chains like the GNU compiler collection (gcc) have a plethora of options. The probably most important ones are the ones which tell the compiler how to optimize the code. Running out of code space, or the application is not performing well? Then have a look at the compiler optimization levels!

However, which one to select can be a difficult choice. And the result might very well depend on the application and coding style too. So I’ll give you some hints and guidance with an autonomous robot application we use at the Lucerne University for research and education.

INTRO Sumo Robot
INTRO Sumo Robot
Continue reading