Concurrency becomes manageable when every shared object has an owner, every handoff has a publication rule, and every wait has a bound. Use one single-core Cortex-M4 system to compare mutexes, queues, notifications, atomics, priority inheritance, and explicit buffer ownership.
Example system. A fictional 80 MHz single-core Cortex-M4 runs FreeRTOS with three fixed-priority tasks, a 20 ksample/s ADC stream, 128-sample DMA blocks, no data cache, and DMA buffers in coherent SRAM.
Verify on the real target. Priorities, queue depths, atomic lock freedom, port restrictions, and visibility rules are teaching values. Check the compiler, RTOS port, selected target manual, and DMA documentation.
Scope. This guide begins with named task, ISR, DMA, and peripheral actors. NVIC priority, masking, handler design, and DMA-completion service remain in the interrupts and DMA guide. Here the focus is task/task synchronization, C memory ordering, priority inversion, deadlock, and buffer lifetime after handoff.