Follow our illustrated blog on Embedded Software Architecture

How to build a hybrid solar/wind energy harvester?

Embedded software

Table of contents

Embedded software architecture

Hardware abstraction layer and interfaces

Simple Platform Abstraction: how to build a Hardware Abstraction Layer?

Simple Platform Abstraction: how to define a timer, thread, lock or queue interface?

MCU pin configuration, GPIOs and a word on software architecture: interfaces for microcontroller pin configuration and GPIO. Includes a paragraph of how your application code should look like.

Driving LEDs by GPIO: finally resolved!: how to design a LED interface and abstraction?

Debounced Buttons: how to debounce gpio switches?

ADC driver for the energy harvester: ADC software interface.

PWM: PWM description and software interface.

I2C and SPI: advantages and disadvantages of both buses.

Architectural views

Our at-first-sight trivial product: a hybrid solar/wind energy harvester (aka battery charger): context view of the charge controller.

Charge controller system architecture: context view and functional view of our charge controller (the energy harvester as a power management device).

All about mutexes and semaphores

Not all processors have atomic instructions!: do you want to know more about atomic instructions and their applications?

Mutexes and semaphores: two concepts for two different use cases (part1): the difference between resource protection and synchronization.

Mutexes and semaphores: the FreeRTOS implementation (part2): two concepts applied on FreeRTOS.

User level spin locks revisited: when to use spin locks?

Programs, processes and threads

Programs, processes and threads – Part 1: what are programs? What are processes? Several examples e.g. FreeRTOS, Linux and GHS Integrity.

Programs, processes and thread – Part 2: a thread in Linux, Integrity RTOS and FreeRTOS.


Guidelines to minimize ROM and RAM usage in low-end embedded systems: how to code for ‘const’? Various topics about toolchain configuration.

Memory management in embedded devices: Stack or heap?: 2 memory allocation schemes… or is there a third way?

Embedded device communication: use a standard or design a custom communication protocol?

Hardware-Software partitioning: how to define boundaries between tasks which can be implemented in hardware or software?

Storing settings and data on an embedded device: which strategy for which device?

Embedded software coding

Code quality

Adopting MISRA-C guidelines in your software development process – best practices: want to enforce coding rules?

3 ways to boost your performance as a developer: …and how to deliver quality?

Guidelines to minimize ROM and RAM usage in low-end embedded systems: includes a section about writing good code.

The embedded hierarchy: part1, part2.


How procedural code evolves to object-oriented code

Object-orientation in C: part1, part2, part3, part4 and part5.


You can follow our real-time systems track here.


Embedded device boot: first-level, second-level bootloader.

Painless CRC for your embedded device: