• A Practical Guide to Watchdogs for Embedded Systems

    In this article we will discuss the last line of defense in embedded systems – watchdogs. We will walk through a step-by-step example of how to implement a watchdog subsystem, incorporating a “hardware” and “software” watchdog, and examine effective strategies for root causing the underlying problems leading to these hangs.

  • Improving Compilation Time of C/C++ Projects

    Build times don’t have to be long, even yours! However, many factors play a role. In this post, we’ll dive into which factors contribute to slower builds, compare and contrast options, and also go over some easy wins which you can immediately contribute to your project and share with your teammates. The techniques discussed apply to most C/C++ compilers and projects, and there are a couple extra tips for those using the GNU GCC compiler.

  • Beyond Firmware in the 2020s

    In the next decade the capabilities of software for embedded systems will catch up to those of hardware, 'firmware' will become increasingly difficult to distinguish from 'software', and a new discipline altogether will begin to take shape.

  • Rust for Low Power Digital Signal Processing

    In this post, I go over how Rust can be used to implement DSP algorithms for firmware today, and compare the process and performance to the equivalent code written with CMSIS-DSP.

  • I2C in a Nutshell

    I2C is perhaps the most commonly used bus to connect ICs together. As such, firmware engineers encounter it on most projects. In this post, we explain how I2C works, explore common bugs and investigate how to debug these issues.

  • What we've been reading in January

    Happy New Year! Here are the articles, videos, and tools we’ve been excited about this past month.

  • Managing Developer Environments with Conda

    This post gives an introduction to what Conda is, explains why you should care about keeping your developer environments in sync, and finally provides a walk-through on getting started with Conda to set up a GCC based developer environment.

  • From Zero to main(): Bare metal Rust

    Since 2015, Rust has been redefining what it means to combine the best-in-class aspects of performance, correctness, and developer convenience into one language, without compromise. In this post, we’ll bootstrap a Rust environment on a Cortex-M microcontroller from scratch, and explain a few of the language concepts you might not have seen before.