android
    
    announcements
    
    arm
    
    bare-metal
    
    battery-life
    
    bazel
    
    best-practices
    
    better-firmware
    
    ble
    
    bootloader
    
    build-system
    
    buses
    
    c
    
    c++
    
    ci
    
    conferences
    
    connectivity
    
    cortex-m
    
    cross-compilation
    
    debugger
    
    debugging
    
    devicetree
    
    driver
    
    embedded
    
    embedded-world
    
    emulator
    
    firmware-update
    
    freertos
    
    fw-code-size
    
    gdb
    
    git
    
    github-actions
    
    jetson
    
    kconfig
    
    linux
    
    llvm
    
    logging
    
    lte
    
    mcu
    
    memfault
    
    monitoring
    
    nvidia
    
    observability
    
    ota
    
    peripherals
    
    practical-zephyr-series
    
    python
    
    qemu
    
    raspberry-pi
    
    roundup
    
    rtos
    
    rust
    
    security
    
    semihosting
    
    stack
    
    swupdate
    
    symbol-files
    
    testing
    
    toolchain
    
    unit-testing
    
    west
    
    yocto
    
    zephyr
    
    zero-to-main
    
  
  android
announcements
arm
- Diving into JTAG — Security (Part 6) 14 Aug 2024
 - Diving into JTAG — Usage Scenarios (Part 5) 12 Jun 2024
 - Diving into JTAG — BSDL (Part 4) 29 Mar 2024
 - Diving into JTAG — Boundary Scan (Part 3) 22 Mar 2024
 - Diving into JTAG — Debugging (Part 2) 29 Feb 2024
 - A Guide to Using ARM Stack Limit Registers 14 Feb 2023
 - Tools we use: installing GDB for ARM 03 Aug 2022
 - Peeking inside CMSIS-Packs 07 Oct 2021
 - Introduction to ARM Semihosting 16 Feb 2021
 - ARM Cortex-M33 Instruction Tracing Without a Debugger 23 Dec 2020
 - Faster Debugging with Watchpoints 16 Sep 2020
 - Step-through debugging with no debugger on Cortex-M 29 Jul 2020
 - How do breakpoints even work? 17 Jun 2020
 - Profiling Firmware on Cortex-M 02 Jun 2020
 - A Guide to Watchdog Timers for Embedded Systems 18 Feb 2020
 - How to debug a HardFault on an ARM Cortex-M MCU 20 Nov 2019
 - From Zero to main(): Bootstrapping libc with Newlib 12 Nov 2019
 - ARM Cortex-M RTOS Context Switching 30 Oct 2019
 - A Practical guide to ARM Cortex-M Exception Handling 04 Sep 2019
 - From Zero to main(): How to Write a Bootloader from Scratch 13 Aug 2019
 - A Deep Dive into ARM Cortex-M Debug Interfaces 06 Aug 2019
 
bare-metal
battery-life
bazel
best-practices
- Understanding Battery Performance of IoT Devices 26 Jul 2023
 - Proper Release Versioning Goes a Long Way 19 Jan 2021
 - Defensive Programming - Friend or Foe? 15 Dec 2020
 - Building a Tiny CLI Shell for Tiny Firmware 09 Jun 2020
 - Reproducible Firmware Builds 11 Dec 2019
 - Building Better Firmware with Continuous Integration 17 Sep 2019
 - GNU Build IDs for Firmware 29 May 2019
 
better-firmware
- Best Practices for Monitoring Device Connectivity 22 Feb 2024
 - Counting Crashes to Improve Device Reliability 08 Nov 2023
 - Pocket article: Debug vs. Release Builds Considered Harmful 25 Apr 2023
 - C Structure Padding Initialization 01 Mar 2022
 - Automatically format and lint code with pre-commit 27 Oct 2021
 - Profiling newlib-nano's memcpy 07 Sep 2021
 - Better Firmware with LLVM/Clang 20 May 2020
 - Embedded C/C++ Unit Testing with Mocks 12 May 2020
 - GNU Binutils: the ELF Swiss Army Knife 08 Apr 2020
 - A Guide to Watchdog Timers for Embedded Systems 18 Feb 2020
 - Improving Compilation Time of C/C++ Projects 11 Feb 2020
 - Managing Developer Environments with Conda 07 Jan 2020
 - Using Asserts in Embedded Systems 05 Nov 2019
 - Embedded C/C++ Unit Testing Basics 08 Oct 2019
 - Building Better Firmware with Continuous Integration 17 Sep 2019
 
ble
- Integrating Memfault with Blecon Bluetooth Devices 23 Aug 2022
 - A Practical Guide to BLE Throughput 24 Sep 2019
 - Bluetooth Low Energy: A Primer 30 Jul 2019
 
bootloader
- MCUboot Walkthrough and Porting Guide 04 Nov 2020
 - From Zero to main(): How to Write a Bootloader from Scratch 13 Aug 2019
 
build-system
- Practical Zephyr - Zephyr Basics (Part 1) 10 Jan 2024
 - Bazel Build System for Embedded Projects 30 May 2023
 - Pocket article: Debug vs. Release Builds Considered Harmful 25 Apr 2023
 - Pocket article: Debugging ccache misses 04 Oct 2022
 - Pocket article: How to implement and use `.noinit` RAM 23 Nov 2021
 - Seamless firmware development with PlatformIO 08 Dec 2020
 - Separating Unique Parameters from Firmware Binaries 06 Oct 2020
 - Reproducible Firmware Builds 11 Dec 2019
 
buses
c
- A Modern C Development Environment 09 Aug 2023
 - Using SWIG to generate bindings between C and Lua 29 Nov 2022
 - Pocket article: Debugging ccache misses 04 Oct 2022
 - C Structure Padding Initialization 01 Mar 2022
 - Firmware Static Analysis with CodeChecker 19 May 2021
 - Practical Design Patterns: Opaque Pointers and Objects in C 11 May 2021
 - Embedded C/C++ Unit Testing with Mocks 12 May 2020
 - A Shallow Dive into GNU Make 03 Mar 2020
 - Improving Compilation Time of C/C++ Projects 11 Feb 2020
 - The Best and Worst GCC Compiler Flags For Embedded 22 Oct 2019
 
c++
- C++17’s Useful Features for Embedded Systems 17 May 2023
 - Pocket article: Debugging ccache misses 04 Oct 2022
 - Building an On-Device Embedded Testing Library 07 Jun 2022
 - Firmware Static Analysis with CodeChecker 19 May 2021
 - Embedded C/C++ Unit Testing with Mocks 12 May 2020
 - Improving Compilation Time of C/C++ Projects 11 Feb 2020
 - The Best and Worst GCC Compiler Flags For Embedded 22 Oct 2019
 
ci
- GitHub Actions for STM32CubeIDE 01 Aug 2024
 - Building Nordic nRF-Connect SDK Projects with GitHub Actions 18 Jan 2024
 
conferences
- Embedded Open Source Summit 2024 Recap 08 May 2024
 - Standout Exhibits at Embedded World 2024 25 Apr 2024
 
connectivity
- Best Practices for Monitoring Device Connectivity 22 Feb 2024
 - LTE and IoT - How We Got Here 13 Dec 2023
 - Integrating Memfault with Blecon Bluetooth Devices 23 Aug 2022
 - A Practical Guide to BLE Throughput 24 Sep 2019
 
cortex-m
- Diving into JTAG — Security (Part 6) 14 Aug 2024
 - Diving into JTAG — Usage Scenarios (Part 5) 12 Jun 2024
 - Diving into JTAG — BSDL (Part 4) 29 Mar 2024
 - Diving into JTAG — Boundary Scan (Part 3) 22 Mar 2024
 - Diving into JTAG — Debugging (Part 2) 29 Feb 2024
 - Asynchronous Rust on Cortex-M Microcontrollers 19 Jul 2023
 - A Guide to Using ARM Stack Limit Registers 14 Feb 2023
 - Introduction to ARM Semihosting 16 Feb 2021
 - ARM Cortex-M33 Instruction Tracing Without a Debugger 23 Dec 2020
 - MCUboot Walkthrough and Porting Guide 04 Nov 2020
 - Faster Debugging with Watchpoints 16 Sep 2020
 - Step-through debugging with no debugger on Cortex-M 29 Jul 2020
 - How do breakpoints even work? 17 Jun 2020
 - Profiling Firmware on Cortex-M 02 Jun 2020
 - Better Firmware with LLVM/Clang 20 May 2020
 - Cortex-M MCU Emulation with Renode 23 Mar 2020
 - A Guide to Watchdog Timers for Embedded Systems 18 Feb 2020
 - How to debug a HardFault on an ARM Cortex-M MCU 20 Nov 2019
 - From Zero to main(): Bootstrapping libc with Newlib 12 Nov 2019
 - ARM Cortex-M RTOS Context Switching 30 Oct 2019
 - A Practical guide to ARM Cortex-M Exception Handling 04 Sep 2019
 - From Zero to main(): How to Write a Bootloader from Scratch 13 Aug 2019
 - A Deep Dive into ARM Cortex-M Debug Interfaces 06 Aug 2019
 - Fix Bugs and Secure Firmware with the MPU 16 Jul 2019
 - From Zero to main(): Bare metal C 14 May 2019
 - Programming the ATSAMD21 with IBDAP 25 Apr 2019
 
cross-compilation
debugger
- Diving into JTAG — Security (Part 6) 14 Aug 2024
 - Diving into JTAG — Usage Scenarios (Part 5) 12 Jun 2024
 - Diving into JTAG — BSDL (Part 4) 29 Mar 2024
 - Diving into JTAG — Boundary Scan (Part 3) 22 Mar 2024
 - Diving into JTAG — Debugging (Part 2) 29 Feb 2024
 - MCU Peripheral Forwarding 11 Oct 2023
 
debugging
- Diving into JTAG — Security (Part 6) 14 Aug 2024
 - Diving into JTAG — Usage Scenarios (Part 5) 12 Jun 2024
 - Diving into JTAG — BSDL (Part 4) 29 Mar 2024
 - Diving into JTAG — Boundary Scan (Part 3) 22 Mar 2024
 - Diving into JTAG — Debugging (Part 2) 29 Feb 2024
 - Logging on Embedded Devices 20 Dec 2023
 - Debugging Android Devices 16 Aug 2023
 - Nash's Four Favorite Firmware Debug Tools 25 Jan 2022
 - Share Your Debugging Scripts 21 Apr 2021
 - Faster Debugging with Watchpoints 16 Sep 2020
 - Step-through debugging with no debugger on Cortex-M 29 Jul 2020
 - How do breakpoints even work? 17 Jun 2020
 - Hunting Bugs with Git Bisect 21 Apr 2020
 - gdbundle - GDB and LLDB's Missing Plugin Manager 14 Apr 2020
 - How to debug a HardFault on an ARM Cortex-M MCU 20 Nov 2019
 - Using Asserts in Embedded Systems 05 Nov 2019
 - A Deep Dive into ARM Cortex-M Debug Interfaces 06 Aug 2019
 - Debugging Firmware with GDB 21 May 2019
 
devicetree
- Practical Zephyr - Devicetree practice (Part 5) 17 Apr 2024
 - Practical Zephyr - Devicetree semantics (Part 4) 15 Feb 2024
 - Practical Zephyr - Devicetree basics (Part 3) 01 Feb 2024
 
driver
embedded
embedded-world
emulator
firmware-update
- Saving bandwidth with delta firmware updates 09 Aug 2022
 - Secure firmware updates with code signing 08 Sep 2020
 - Device Firmware Update Cookbook 23 Jun 2020
 
freertos
fw-code-size
- Dealing with Large Symbol Files 30 Mar 2022
 - GNU Binutils: the ELF Swiss Army Knife 08 Apr 2020
 - Tracking Firmware Code Size 18 Mar 2020
 - Code Size Optimization: GCC Compiler Flags 20 Aug 2019
 - Tools for Firmware Code Size Optimization 06 Jun 2019
 
gdb
- Tools we use: installing GDB for ARM 03 Aug 2022
 - Dealing with Large Symbol Files 30 Mar 2022
 - Nash's Four Favorite Firmware Debug Tools 25 Jan 2022
 - Pocket article: Undefined Behavior Sanitizer Trap on Error 22 Jun 2021
 - Share Your Debugging Scripts 21 Apr 2021
 - Advanced GDB Usage 20 Oct 2020
 - Faster Debugging with Watchpoints 16 Sep 2020
 - Step-through debugging with no debugger on Cortex-M 29 Jul 2020
 - How do breakpoints even work? 17 Jun 2020
 - gdbundle - GDB and LLDB's Missing Plugin Manager 14 Apr 2020
 - Using Python PyPi Packages within GDB/LLDB 23 Jul 2019
 - Automate Debugging with GDB Python API 02 Jul 2019
 - Debugging Firmware with GDB 21 May 2019
 
git
- Automatically format and lint code with pre-commit 27 Oct 2021
 - Proper Release Versioning Goes a Long Way 19 Jan 2021
 - Hunting Bugs with Git Bisect 21 Apr 2020
 
github-actions
- GitHub Actions for STM32CubeIDE 01 Aug 2024
 - Building Nordic nRF-Connect SDK Projects with GitHub Actions 18 Jan 2024
 
jetson
kconfig
linux
- Updating NVIDIA Jetson devices with Memfault OTA 26 Jun 2024
 - Rust on Yocto: A Seamless Integration 18 Oct 2023
 - Emulating a Raspberry Pi in QEMU 21 Jun 2023
 - OTA for Embedded Linux Devices: A practical introduction 09 May 2023
 - Integrating Memfault into an Embedded Linux Project 18 Jan 2023
 
llvm
logging
- Logging on Embedded Devices 20 Dec 2023
 - Tracing & Logging with the `TRICE` Library (Interrupts too!) 12 Jan 2022
 - Monitoring Fleet Health with Heartbeat Metrics 02 Sep 2020
 - Parsing Logs Messages for Instant Crash Analysis 04 Aug 2020
 
lte
mcu
- Diving into JTAG — Security (Part 6) 14 Aug 2024
 - Diving into JTAG — Usage Scenarios (Part 5) 12 Jun 2024
 - Diving into JTAG — BSDL (Part 4) 29 Mar 2024
 - Diving into JTAG — Boundary Scan (Part 3) 22 Mar 2024
 - Diving into JTAG — Debugging (Part 2) 29 Feb 2024
 - MCU Peripheral Forwarding 11 Oct 2023
 - Asynchronous Rust on Cortex-M Microcontrollers 19 Jul 2023
 - Selecting Your Next Project's MCU 24 May 2022
 - Profiling newlib-nano's memcpy 07 Sep 2021
 - The Best and Worst MCU SDKs 10 Nov 2020
 - Faster Debugging with Watchpoints 16 Sep 2020
 - Secure firmware updates with code signing 08 Sep 2020
 - Step-through debugging with no debugger on Cortex-M 29 Jul 2020
 - How do breakpoints even work? 17 Jun 2020
 - Building a Tiny CLI Shell for Tiny Firmware 09 Jun 2020
 - Profiling Firmware on Cortex-M 02 Jun 2020
 - Better Firmware with LLVM/Clang 20 May 2020
 - Cortex-M MCU Emulation with Renode 23 Mar 2020
 - How to debug a HardFault on an ARM Cortex-M MCU 20 Nov 2019
 - ARM Cortex-M RTOS Context Switching 30 Oct 2019
 - A Practical guide to ARM Cortex-M Exception Handling 04 Sep 2019
 
memfault
- Updating NVIDIA Jetson devices with Memfault OTA 26 Jun 2024
 - OTA for Embedded Linux Devices: A practical introduction 09 May 2023
 - Integrating Memfault into an Embedded Linux Project 18 Jan 2023
 - Integrating Memfault with Blecon Bluetooth Devices 23 Aug 2022
 
monitoring
- Best Practices for Monitoring Device Connectivity 22 Feb 2024
 - Counting Crashes to Improve Device Reliability 08 Nov 2023
 - Understanding Battery Performance of IoT Devices 26 Jul 2023
 - Monitoring Fleet Health with Heartbeat Metrics 02 Sep 2020
 
nvidia
observability
ota
- Updating NVIDIA Jetson devices with Memfault OTA 26 Jun 2024
 - OTA for Embedded Linux Devices: A practical introduction 09 May 2023
 - Saving bandwidth with delta firmware updates 09 Aug 2022
 - Device Firmware Update Cookbook 23 Jun 2020
 
peripherals
practical-zephyr-series
- Practical Zephyr - West workspaces (Part 6) 16 May 2024
 - Practical Zephyr - Devicetree practice (Part 5) 17 Apr 2024
 - Practical Zephyr - Devicetree semantics (Part 4) 15 Feb 2024
 - Practical Zephyr - Devicetree basics (Part 3) 01 Feb 2024
 - Practical Zephyr - Kconfig (Part 2) 24 Jan 2024
 - Practical Zephyr - Zephyr Basics (Part 1) 10 Jan 2024
 
python
- Advanced GDB Usage 20 Oct 2020
 - gdbundle - GDB and LLDB's Missing Plugin Manager 14 Apr 2020
 - Managing Developer Environments with Conda 07 Jan 2020
 - Building a CLI for Firmware Projects using Invoke 27 Aug 2019
 - Using Python PyPi Packages within GDB/LLDB 23 Jul 2019
 - Automate Debugging with GDB Python API 02 Jul 2019
 
qemu
raspberry-pi
roundup
- What we've been reading in July (2024) 08 Aug 2024
 - What we've been reading in June (2024) 11 Jul 2024
 - What we've been reading in May (2024) 05 Jun 2024
 - What we've been reading in April (2024) 01 May 2024
 - What we've been reading in March (2024) 04 Apr 2024
 - What we've been reading in February (2024) 07 Mar 2024
 - What we've been reading in January (2024) 07 Feb 2024
 - What we've been reading in December (2023) 04 Jan 2024
 - What we've been reading in November (2023) 06 Dec 2023
 - What we've been reading in October (2023) 01 Nov 2023
 - What we've been reading in September (2023) 04 Oct 2023
 - What we've been reading in August (2023) 06 Sep 2023
 - What we've been reading in July 02 Aug 2023
 - What we've been reading in June 05 Jul 2023
 - What we've been reading in May 06 Jun 2023
 - What we've been reading in April 03 May 2023
 - What we've been reading in February & March 12 Apr 2023
 - What we've been reading in January 07 Feb 2023
 - What we've been reading in November & December (2022) 12 Jan 2023
 - What we've been reading in October (2022) 01 Nov 2022
 - What we've been reading in September (2022) 11 Oct 2022
 - What we've been reading in August (2022) 06 Sep 2022
 - What we've been reading in July (2022) 17 Aug 2022
 - What we've been reading in May & June (2022) 19 Jul 2022
 - What we've been reading in April (2022) 12 May 2022
 - What we've been reading in March (+ Announcements) (2022) 14 Apr 2022
 - What we've been reading in February (2022) 15 Mar 2022
 - What we've been reading in January (2022) 01 Feb 2022
 - What we've been reading in December (2021) 04 Jan 2022
 - What we've been reading in November (2021) 06 Dec 2021
 - What we've been reading in October (2021) 02 Nov 2021
 - What we've been reading in September (2021) 12 Oct 2021
 - What we've been reading in July and August (2021) 31 Aug 2021
 - What we've been reading in June (2021) 06 Jul 2021
 - What we've been reading in May (2021) 01 Jun 2021
 - What we've been reading in April (2021) 04 May 2021
 - What we've been reading in March (2021) 30 Mar 2021
 - What we've been reading in February (2021) 02 Mar 2021
 - What we've been reading in January (2020) 09 Feb 2021
 - What we've been reading in December (2020) 05 Jan 2021
 - What we've been reading in November (2020) 01 Dec 2020
 - What we've been reading in October (2020) 27 Oct 2020
 - What we've been reading in September (2020) 29 Sep 2020
 - What we've been reading in July (2020) 04 Aug 2020
 - What we've been reading in June (2020) 30 Jun 2020
 - What we've been reading in May (2020) 26 May 2020
 - What we've been reading in April (2020) 28 Apr 2020
 - What we've been reading in March (2020) 31 Mar 2020
 - What we've been reading in February (2020) 25 Feb 2020
 - What we've been reading in January 14 Jan 2020
 - What we've been reading in November (2019) 03 Dec 2019
 
rtos
- Measuring Stack Usage the Hard Way 14 Jun 2023
 - Zephyr Deep Dive: Ring Buffers 24 May 2023
 - How to Build Drivers for Zephyr 23 Jul 2020
 - ARM Cortex-M RTOS Context Switching 30 Oct 2019
 
rust
- Rust on Yocto: A Seamless Integration 18 Oct 2023
 - Asynchronous Rust on Cortex-M Microcontrollers 19 Jul 2023
 - Rust for Low Power Digital Signal Processing 04 Feb 2020
 - From Zero to main(): Bare metal Rust 17 Dec 2019
 
security
semihosting
stack
- Measuring Stack Usage the Hard Way 14 Jun 2023
 - A Guide to Using ARM Stack Limit Registers 14 Feb 2023
 - Parsing Logs Messages for Instant Crash Analysis 04 Aug 2020
 
swupdate
symbol-files
testing
- Building an On-Device Embedded Testing Library 07 Jun 2022
 - Balancing Test Coverage vs. Overhead 23 Mar 2021
 - Firmware Testing with Renode and GitHub Actions 07 Jul 2020
 - Cortex-M MCU Emulation with Renode 23 Mar 2020
 
toolchain
- Differences Between ELF-32 and ELF-64 13 Mar 2024
 - MCU Peripheral Forwarding 11 Oct 2023
 - A Modern C Development Environment 09 Aug 2023
 - Pocket article: Debug vs. Release Builds Considered Harmful 25 Apr 2023
 - Pocket article: How to implement and use `.noinit` RAM 23 Nov 2021
 - Automatically format and lint code with pre-commit 27 Oct 2021
 - Peeking inside CMSIS-Packs 07 Oct 2021
 - Profiling newlib-nano's memcpy 07 Sep 2021
 - Pocket article: Undefined Behavior Sanitizer Trap on Error 22 Jun 2021
 - Firmware Static Analysis with CodeChecker 19 May 2021
 - Seamless firmware development with PlatformIO 08 Dec 2020
 - Separating Unique Parameters from Firmware Binaries 06 Oct 2020
 - Better Firmware with LLVM/Clang 20 May 2020
 - A Shallow Dive into GNU Make 03 Mar 2020
 - From Zero to main(): Bootstrapping libc with Newlib 12 Nov 2019
 - The Best and Worst GCC Compiler Flags For Embedded 22 Oct 2019
 - Get the most out of the linker map file 09 Jul 2019
 - Tools for Firmware Code Size Optimization 06 Jun 2019
 
unit-testing
- Balancing Test Coverage vs. Overhead 23 Mar 2021
 - Embedded C/C++ Unit Testing with Mocks 12 May 2020
 - Embedded C/C++ Unit Testing with Mocks 12 May 2020
 - Embedded C/C++ Unit Testing Basics 08 Oct 2019
 
west
yocto
zephyr
- Practical Zephyr - West workspaces (Part 6) 16 May 2024
 - Practical Zephyr - Devicetree practice (Part 5) 17 Apr 2024
 - Practical Zephyr - Devicetree semantics (Part 4) 15 Feb 2024
 - Practical Zephyr - Devicetree basics (Part 3) 01 Feb 2024
 - Practical Zephyr - Kconfig (Part 2) 24 Jan 2024
 - Practical Zephyr - Zephyr Basics (Part 1) 10 Jan 2024
 - Measuring Stack Usage the Hard Way 14 Jun 2023
 - Zephyr Deep Dive: Ring Buffers 24 May 2023
 - How to Build Drivers for Zephyr 23 Jul 2020
 
zero-to-main
- From Zero to main(): Bare metal Rust 17 Dec 2019
 - From Zero to main(): Bootstrapping libc with Newlib 12 Nov 2019
 - From Zero to main(): How to Write a Bootloader from Scratch 13 Aug 2019
 - From Zero to main(): Demystifying Firmware Linker Scripts 25 Jun 2019
 - From Zero to main(): Bare metal C 14 May 2019