The reason I was motivated to set up better ESP32 debugging support is that I expect my projects to become more complex in the near future. Sawppy V1 had two software control options: a very simple hard-wired joystick control option running on an Arduino Nano, and a more complex wireless system using a Raspberry Pi to serve web pages that display rover driving controls. I had many debugging resources at my disposal working on a Raspberry Pi, but for the Arduino I was reduced to diagnostic text sent over serial and working through the math on paper. That was primitive and I'd rather not be limited to pen & paper when debugging my inevitable ESP32 problems.

One of the tools available in the toolbox of an aspiring ESP32 programmer like myself is FreeRTOS. RTOS here stands for real-time operating system, though it's far smaller and simpler than what we usually think of as an "operating system" nowadays. And the "real-time" guarantees would meet some needs but not others. I understand FreeRTOS is part of ESP32 runtime by default, used by ESP-IDF to implement some of the APIs exposed to us. On an Arduino the software is completely under our control, and we are directly talking to hardware peripherals in the ATmega328. In contrast running on an ESP32 is a mix, some of the peripheral APIs are implemented in software components before handing off to the underlying hardware.

FreeRTOS allows software projects divide up all the work in a particular product into individual FreeRTOS tasks. Then FreeRTOS will handle cycling through what needs to be done while respecting their relative priorities. This is not absolutely required to implement complex functionality. Teensy's software framework, for example, was written and optimized to run without a similar RTOS layer. It's just another tool and Espressif decided it was the right tool for this job.

ESP-IDF makes use of FreeRTOS features and made it available to ESP32 developers as well. There's a section of Espressif documentation talking about FreeRTOS, including how it is configured to run on an ESP32 as well as the modifications Espressif have made to the base implementation. But the majority of FreeRTOS runs on ESP32 unmodified and I can learn from the source. There's a free eBook (PDF) that walks through major FreeRTOS feature areas. It is several versions out of date and thus does not cover new features, but it enough to get me get up and running on fundamental concepts.

Once I had a passing familiarity with basic functionality of FreeRTOS, I am better informed as I comb through ESP32 documentation. Things I had previously thought were duplicate functionality (example: FreeRTOS Event Groups versus ESP-IDF Event Library) now made more sense as I understand how they are tools for solving different problems.

Certain projects aim to stay within core FreeRTOS to make things portable across different processor architectures, I believe micro-ROS is one of these projects. At the moment architectural portability is not a concern, especially since I'm focused on the ESP32-specific MCPWM peripheral, giving me freedom to use both generic FreeRTOS and platform-specific ESP-IDF functionality. I might want to separate them out to different architectural layers later, but right now it's all one big mixing bowl for my first ESP32 motor control project.