EmbeddedRelated.com
The 2026 Embedded Online Conference

Review: Embedded Software Design: A Practical Approach to Architecture, Processes, and Coding Techniques

Steve BranamSteve Branam February 28, 2023

Jacob Beningo's Embedded Software Design is a practical, discipline-first guide to building reliable embedded systems. It frames development around a software triad: architecture, Agile/DevOps processes, and coding techniques, with security integrated from the start. The book mixes principles with hands-on recipes and includes appendices that walk through GitLab CI/CD and TDD examples you can reuse on real projects.


C to C++: 3 Proven Techniques for Embedded Systems Transformation

Jacob BeningoJacob Beningo February 7, 20234 comments

Jacob Beningo lays out a pragmatic, low-risk path for embedded teams to start using C++ without adding bloat or runtime cost. He recommends beginning by treating C++ as a cleaner C with namespaces, constexpr, and smart pointers, then adopting object-oriented design with composition, and finally introducing templates for static polymorphism where it makes sense. The post focuses on practical guardrails for resource-constrained firmware.


Libgpiod - Toggling GPIOs The Right Way In Embedded Linux

Mohammed BillooMohammed Billoo January 24, 2023

Accessing GPIOs through sysfs is simple but fragile, causing race conditions when multiple userspace processes touch the same line. This post explains libgpiod, introduced in Linux 4.8, and shows concise Python examples on a Toradex Verdin iMX8M Plus for requesting lines, tagging the consumer, using active_low flags, and reading or driving values. Learn why libgpiod provides safer, atomic GPIO handling.


In Memoriam: Frederick P. Brooks, Jr. and The Mythical Man-Month

Jason SachsJason Sachs November 20, 2022

It is with some sadness that I have read that Fred Brooks has passed away. Brooks (1931 - 2022) worked at IBM and managed a large team developing the IBM System/360 computers in the early 1960s. Brooks was thirty years old at the start of this project. He founded the Computer Science Department at UNC Chapel Hill in 1964, at the age of thirty-three, acting as its department chair for twenty years. He remained at IBM until 1965, however. During this one-year...


Soft Skills For Embedded Systems Software Developers

Steve BranamSteve Branam October 18, 20222 comments

Soft skills often determine whether an embedded project ships on time as much as technical chops do. This post lays out practical, engineer-friendly guidance on interpersonal skills, communication, time management, deep focus, asking for help, learning, and resilience. It mixes concrete tips like the documentation system, pomodoro and quiet hours with habits such as engineering notebooks and role-playing to make collaboration and productivity more reliable.


Skills For Embedded Systems Software Developers

Steve BranamSteve Branam August 9, 2022

Embedded development demands a broad, practical skillset, and this post lays out the core knowledge employers expect across software, hardware, and tooling. It highlights essential languages like C, low-level concepts such as interrupts and RTOS, plus hardware skills like debugging with JTAG and using oscilloscopes. You also get realistic timelines, hands on study advice, and resource pointers to build a portfolio that proves you can ship reliable firmware.


3 Overlooked Embedded Software Elements

Jacob BeningoJacob Beningo July 9, 20223 comments

Jacob Beningo points out three often-overlooked elements that can make embedded projects less painful and faster to ship. He highlights model-generated code for off-target iteration, configuration-generated code to manage SKUs and avoid fragile conditional compilation, and automated test harnesses to catch regressions early. The post gives practical reasons to consider each approach and how they fit into modern embedded DevOps.


Learning A New Microcontroller

Steve BranamSteve Branam July 3, 20221 comment

Learning a new microcontroller becomes manageable with a repeatable, stepwise process that focuses on common peripherals, tools, and example programs. This post lays out hands-on exercises from blinky and UART echoes through I2C/SPI, PWM and ADC to DMA and RTOS variations, and shows how to evolve prototype code into reusable HAL and OSAL layers. Practical tips cover hardware setup, logic analyzers, and keeping an engineering notebook.


Review: Modern Software Engineering

Steve BranamSteve Branam December 27, 20212 comments

Long-lived branches, manual releases, and slow feedback waste engineering time. This review of three Dave Farley books distills a practical playbook: continuous delivery pipelines, trunk-based development, and disciplined TDD to keep trunk always releasable. It shows how fast, automated feedback at every stage shrinks cycle time, reduces merge pain, and makes teams far more productive.


VolksEEG: Rust Development On Adafruit nRF52840 Feather Express

Steve BranamSteve Branam December 13, 2021

Setting up Rust embedded development on an Adafruit Feather nRF52840 Express inside a VS Code devcontainer can save time, but the toolchain has a few gotchas. This post walks through using the VolksEEG prototype echo-server to verify the USB serial path, configuring probe-rs with J-Link and OpenOCD for on-chip debugging, and diagnosing a container build error fixed by adding libudev-dev. Expect step-by-step commands and troubleshooting tips.


How to make a heap profiler

Yossi KreininYossi Kreinin May 23, 20141 comment

A heap profiler is surprisingly simple to build, and Yossi Kreinin walks through a compact working example called heapprof. The post shows how to intercept malloc/free, stash per-allocation metadata and call stacks into heap chunks, dump memory on crash or via JTAG, and map return addresses to source lines with addr2line or gdb. It also covers practical bootstrapping tricks for platforms without standard libc support.


Jaywalking Around the Compiler

Jason SachsJason Sachs December 9, 20193 comments

Messing with inline assembly can feel powerful until the compiler silently undoes you. Jason Sachs walks through a real bug on a Microchip dsPIC33E where pushing CORCON and writing a fixed value corrupts compiler-managed state and produces wrong results when the compiler reorders code. The post shows why the stack and certain registers are off-limits to raw inline asm, and gives practical, safe patterns to save and restore mode bits.


Libgpiod - Toggling GPIOs The Right Way In Embedded Linux

Mohammed BillooMohammed Billoo January 24, 2023

Accessing GPIOs through sysfs is simple but fragile, causing race conditions when multiple userspace processes touch the same line. This post explains libgpiod, introduced in Linux 4.8, and shows concise Python examples on a Toradex Verdin iMX8M Plus for requesting lines, tagging the consumer, using active_low flags, and reading or driving values. Learn why libgpiod provides safer, atomic GPIO handling.


A wireless door monitor based on the BANO framework

Fabien Le MentecFabien Le Mentec June 10, 20145 comments

Fabien Le Mentec built a battery-powered wireless door monitor and a reusable node framework called BANO to monitor doors across seven floors without wired links. The post highlights BANO's 17-byte key,value protocol, the node runtime that enables wake-on-interrupt low-power operation, and practical RF choices like the NRF905 plus a 330 µF cap to handle coin-cell transmission peaks. It includes source, PCB, and base station notes.


Important Programming Concepts (Even on Embedded Systems) Part VI : Abstraction

Jason SachsJason Sachs June 16, 20153 comments

Abstraction is essential, but it is not free. Jason Sachs walks through the many faces of abstraction—pattern recognition, generalization, simplification, and indirection—and shows how each helps and hurts real projects. Using examples from math, API design, UI toolkits, schematics, and embedded C, he gives practical context so firmware engineers can apply abstractions without causing maintenance or debugging headaches.


Reverse engineering wireless wall outlets

Fabien Le MentecFabien Le Mentec July 19, 2014

Fabien Le Mentec reverse engineers a cheap set of wireless wall outlets to add them to his BANO home automation while avoiding uncertified mains hardware. He uses PCB inspection to identify a Holtek MCU and RF83C, captures 433.92 MHz OOK signals with an RTL-SDR and ookdump, then replays commands using an RFM22 in direct mode controlled by an ATmega328P. The post explains frame structure and links to a working GitHub implementation.


Coding Step 3 - High-Level Requirements

Stephen FriederichsStephen Friederichs August 17, 20152 comments

Stephen Friederichs turns the series toward embedded code by showing how to write a single high-level requirement for an embedded Hello World. He explains when requirements pay off, how they support testing and scope control, and why you should not write them for every small script. He then lays out five practical rules and applies them to a concrete EHW-001 serial transmission requirement.


C++ on microcontrollers 4 – input pins, and decoding a rotary switch

Wouter van OoijenWouter van Ooijen November 12, 20112 comments

Wouter van Ooijen shows how to extend a small C++ I/O library for microcontrollers to support input pins and mixed I/O, and how to decode a rotary switch reliably. The post walks through a safe class hierarchy for input, output, and bidirectional pins, then builds a quadrature decoder with a saturating counter and an HC595 seven-segment demo you can run on LPCXpresso hardware.


Watchdog Timer Anti-patterns

Alexandru LazarAlexandru Lazar June 8, 2019

A watchdog timer can be useless or even harmful when misused. This post catalogs the most common watchdog anti-patterns, including feeding the watchdog unconditionally from a timer ISR, suspending it during long operations, sprinkling resets across code, timeout auctions, incomplete reset trees, and treating process supervision as a substitute for hardware. It finishes with practical rules to design watchdogs that genuinely improve embedded system reliability.


Continuous Integration for Embedded Systems

Tayyar GUZELTayyar GUZEL September 5, 20172 comments

Hardware dependencies make continuous integration for embedded systems harder than for pure software, yet it is essential for quality and faster feedback. This post explains the three CI types, host, non-host and hardware-in-the-loop, then compares trade-offs in cost, parallelism, timing accuracy and portability. It also outlines steps in a typical CI pipeline and highlights practical tools and plugins, including Jenkins and static analysis to automate builds and tests.


The 2026 Embedded Online Conference