-
A Practical guide to ARM Cortex-M Exception Handling
In this article we will dive into the details of how the ARM Cortex-M exception model supports the handling of asynchronous events. We will walk through different exception types supported, terminology (i.e. NVIC, ISR, Priority), the configuration registers used & common settings, advanced topics to be aware of regarding exceptions and a few examples written in C.
-
Building a CLI for Firmware Projects using Invoke
Building a small (or large) command line interface (CLI) for a project is a great way to get an entire team to build, test, debug, and work with a project in the same way using the same set of tools. This post goes into detail about how to think about a project’s CLI and implementing one using the Invoke Python package.
-
Code Size Optimization: GCC Compiler Flags
In this post, we will review compiler options that we can use to reduce firmware code size. We will focus on
arm-none-eabi-gcc
, the GCC compiler used for ARM-based microcontrollers, though most of the compile-time flags we will cover are available in other GCC flavors as well as in Clang. -
From Zero to main(): How to Write a Bootloader from Scratch
In this post, we will explain why you may want a bootloader, how to implement one, and cover a few advanced techniques you may use to make your bootloader more useful.
-
A Deep Dive into ARM Cortex-M Debug Interfaces
In this article we will walk up through the hardware and software stack that enables debugging on
ARM Cortex-M
devices, demystify what is actually happening and go through a step-by-step example, tracing a basic debugger operation end to end using a logic analyzer. -
Bluetooth Low Energy: A Primer
In today’s post, we will be covering one of the most popular low-power IoT technologies: Bluetooth Low Energy (BLE). We will give an overview of how BLE works, dig into each protocol layer, and walk you through an example setting up BLE on a Nordic nRF52 microcontroller.
-
Using Python PyPi Packages within GDB/LLDB
In a previous post, we discussed how to automate some of the more tedious parts of debugging firmware using Python in GDB Scripts. To make these commands more powerful, one could use third-party packages from Python’s PyPi repository. In this post, we will discuss how to properly setup GDB, Python, and optionally virtualenv and then modify the
uuid_list_dump
command from the post mentioned above to make use of a third party package installed through PyPi. -
Fix Bugs and Secure Firmware with the MPU
Many ARM MCUs implement an optional unit, known as the Memory Protection Unit (MPU), which lets you control how regions of memory are accessed. In this article, we will deep dive into the unit and walk through a few practical examples of how it can be used to prevent bad memory accesses and security exploits on Cortex-M devices.