Posts

Showing posts from March, 2025

A simulator to boost embedded software productivity

Image
Intro This is an idea I've had for quite a while and have created limited-scope versions for a few customers. The idea is that developing software (any software) is challenging and often frustrating. Developing software for embedded devices is often much more challenging and frustrating. The extra time spent waiting for edit/compile/run cycles and more limited tooling hurts productivity. The simulators I've created allow you to work on Arduino projects as native MacOS/iOS projects. (Photo of an old iPhone running my simulation of a Guition ESP32-2432S028R) What's the benefit? Using the Apple tools, specifically Xcode and Instruments, I'm able to run/debug/profile my code much quicker and with a much friendlier set of tools. For my own work, the productivity boost has been tremendous. My Arduino imaging and video codecs ( JPEGDEC , JPEGENC, PNGDEC, PNGENG, AnimatedGIF, pl_mpeg, TIFF_G4, G4_ENC) were all written, debugged and profiled on the Mac as a native MacOS app. It...

How to speed up your project with DMA

Image
Intro DMA ( direct memory access ) is a topic that's similar to pointers in C - it's not easy for everyone to visualize how it works. My goal for this blog post is to explain, in the simplest way possible, how it works and why your project can benefit from proper use of it. What's it all about? DMA is a useful feature for a CPU/MCU to have because it means that data can move around without the CPU (your code) having to do the work. In other words, DMA can move a block of data from memory-to-memory, peripheral-to-memory or memory-to-peripheral independently from the CPU. For people used to programming multi-core CPUs with a multi-threaded operating system, that may not sound very special. For those of us familiar with programming slow, low power, single threaded, embedded processors, it can make quite a difference. Here's a practical example - sending data to an SPI device (e.g. a small LCD display): Without DMA <prepare data1 - 10ms > <send data1 to SPI - 10ms...