android
announcements
arm
bare-metal
battery-life
bazel
best-practices
better-firmware
ble
bootloader
build-system
buses
c
c++
connectivity
cortex-m
cross-compilation
debugger
debugging
devicetree
driver
embedded
emulator
firmware-update
freertos
fw-code-size
gdb
git
kconfig
linux
llvm
logging
lte
mcu
memfault
monitoring
observability
ota
peripherals
python
qemu
raspberry-pi
roundup
rtos
rust
security
semihosting
stack
swupdate
symbol-files
testing
toolchain
unit-testing
yocto
zephyr
zero-to-main
android
announcements
arm
- 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
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 — 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
debugging
- 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 semantics (Part 4) 15 Feb 2024
- Practical Zephyr - Devicetree basics (Part 3) 01 Feb 2024
driver
embedded
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
kconfig
linux
- 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 — 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
- 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
observability
ota
- 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
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 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
yocto
zephyr
- 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