Blog for Curious Minds

Technical deep dives into firmware design, embedded debugging, and system-level problem-solving.

Banner for blog post showing Docker on Raspberry Pi

Running OpenOCD in Docker: A "Tools as Code" Approach to Embedded DevOps

Discover how Docker containers can simplify your embedded tooling setup, making OpenOCD portable, isolated, and hassle-free, all while keeping your Raspberry Pi 4 devbox clean and efficient.

Automating OpenOCD Distribution with a Private Gitea Package Registry

Turn your OpenOCD updates from a manual chore into a one-click process. Learn how to set up a private Gitea Package Registry, upload .deb files, and install them effortlessly on any Debian-based machine. Automation made simple.

How I Finally Cross-Compiled Rust App for Pi Zero (After Many Fails) Banner

How I Finally Cross-Compiled Rust App for Pi Zero (After Many Fails)

A debugging story of segmentation faults, ARM quirks, and Docker containers or how to compile a Rust application for the Pi Zero.

How to Embed Binary Information in Your Rust Pi Pico Firmware

How to Embed Binary Information in Your Rust Pi Pico Firmware

Embed binary metadata in your Rust Pi Pico firmware with picotool! Learn how to store program names, versions, build dates, and more in flash, so you can easily track firmware details with a single command.

Prototyping a pcb in an hour

Prototyping in an Hour: A Small PCB and a Quiet Shift in Embedded Work

Designing and ordering a custom PCB in under an hour — a reflection on modern KiCad workflows and how rapid prototyping has quietly changed embedded development.

Advanced RTT in Embedded Rust: A Guide to Multi-Channel Logging and Binary Streaming (Part 2)

Advanced RTT in Embedded Rust: A Guide to Multi-Channel Logging and Binary Streaming (Part 2)

Stream RP2040 sensor data over RTT and decode logs in real time. Use Python to visualize binary temperature readings and turn raw bytes into insights.

Advanced RTT in Embedded Rust: A Guide to Multi-Channel Logging and Binary Streaming (Part 1)

Advanced RTT in Embedded Rust: A Guide to Multi-Channel Logging and Binary Streaming (Part 1)

Learn to set up multi-channel RTT on the Pi Pico: structured logging with defmt, debug prints, and host commands—all over a single SWD/JTAG probe.

How to Move RTT to a Custom RAM Section in Embedded Rust

How to Move RTT to a Custom RAM Section in Embedded Rust

Learn how to place RTT buffers and the control block into a fixed RAM section in embedded Rust. This guide covers linker script changes, custom RTT initialization, and setting up a reliable RTT print channel.

How to Use RTT in Embedded Rust: Setup and Logging

How to Use RTT in Embedded Rust: Setup and Logging

Learn how to use RTT in Embedded Rust for fast, non-blocking debug logging. This guide covers setup, rtt-target usage, OpenOCD configuration, and VS Code auto-start.

Welcome to The Crab Lab: Diving into Embedded Rust (and Maybe Some Memes)

Welcome to The Crab Lab: Diving into Embedded Rust (and Maybe Some Memes)

Are ya ready, Kids? Dive into The Crab Lab, a new series exploring Embedded Rust through tutorials, projects, and troubleshooting tips. Join the journey of learning, experimenting, and building with Rust on microcontrollers.

Debugging Microsecond Delays on STM32: When 1 µs Isn’t What It Seems

Debugging Microsecond Delays on STM32: When 1 µs Isn’t What It Seems

Why your STM32 timer-based microsecond delays may not work as you expect. Discover how Cortex-M0+ pipelines and timer register updates can affect your timing. Learn ways to correct these issues.

How to Strip Debug Symbols from Software (and Still Keep GDB Context)

How to Strip Debug Symbols from Software (and Still Keep GDB Context)

Learn how to use objcopy to strip debug symbols from an ELF executable, protecting sensitive data without losing the ability to debug your code using an external .dbg file and GDB.

Cortex-M0 Profiling: How to Trace Without Hardware Support

Cortex-M0 Profiling: How to Trace Without Hardware Support

The ARM Cortex-M0 and M0+ lack hardware tracing features like SWO, ETM, and ITM, so how do you profile code on them? In this post, I explore software-based techniques to get deeper insight into performance and debugging on these resource-constrained MCUs.

From Feature Tetris to Full Power – The UV-K5 Flex PCB Brain Hack

From Feature Tetris to Full Power – The UV-K5 Flex PCB Brain Hack

The Quansheng UV-K5 makes you play firmware feature Tetris with its tiny MCU. In this project, we perform some embedded brain surgery—replacing it with an STM32 via a custom flex PCB for more flash, RAM, and possibilities.

Simplifying OpenOCD Deployment with a Debian Package

Simplifying OpenOCD Deployment with a Debian Package

Instead of manually copying binaries and dependencies across machines, you can package OpenOCD into a Debian .deb archive. This post walks through creating a custom package to simplify installation and distribution.

Managing Multi-Compiler CMake Projects in VS Code

Managing Multi-Compiler CMake Projects in VS Code

Learn how to build host utilities alongside embedded firmware in CMake by using ExternalProject. This guide covers setting up multiple compilers, integrating utility projects, and configuring VS Code workspaces for smooth IntelliSense.

Cross-Compiling OpenOCD: A Step-by-Step Walkthrough

Cross-Compiling OpenOCD: A Step-by-Step Walkthrough

Learn how to build OpenOCD binaries on Ubuntu 22.04 for both the ARM64 and AMD64 target architectures. A great way to share a consistent OpenOCD build across your Debian systems

How to Find the Memory Address of a Symbol in an ELF File

How to Find the Memory Address of a Symbol in an ELF File

A quick and useful tip for locating symbol memory addresses in ELF files using arm-none-eabi-nm combined with grep—perfect for embedded debugging scenarios like setting up SEGGER RTT or inspecting linker placements and runtime symbols.

Using CMake to include libraries in your projects

Including External Libraries in CMake Projects

Learn how to use CMake’s FetchContent module to automatically download and integrate libraries like CMSIS into your embedded projects, eliminating the hassle of manual copying and updates.

Remote Debugging using Raspberry Pi and OpenOCD

How to Use a Raspberry Pi as a Remote OpenOCD Debugger

Learn how to turn a Raspberry Pi into a remote debugging server for the RP2040 using OpenOCD, a complete with step-by-step setup and instructions for building OpenOCD from source to resolve hardware compatibility issues.

OpenOCD beginner's guide banner featuring a close-up of a microcontroller

Getting Started with OpenOCD: A Beginner’s Guide for Embedded Developers

A beginner-friendly guide to installing, configuring, and using OpenOCD for flashing and debugging microcontrollers.

Need help with embedded systems development?

Whether you're building something new, fixing stability issues, or automating what slows your team down — we can help.