Advanced techniques: Master essential C features for embedded projects, from linker internals to state machines.
Work hands-on with arrays, pointers, object-oriented patterns in C, and advanced embedded concepts (AVR focus).
Explore the evolution of C standards and how new constructs affect embedded code.
Gain practical experience through extensive labs (~70%) that mirror real-world codebases.
How this course helps: Build robust, portable, and efficient embedded software with confidence.
Who it’s for: designed for individuals with prior C experience who want to deepen their embedded expertise.
By the end you’ll be confident implementing complex systems with C, from ISRs to low-power design.
Curriculum
Essential C
- The job of the linker (in detail)
- Execution context for applications
- ABI formats
- Promotion pitfalls, overflow pitfalls
- Pointers
- Working with multi-dimensional arrays
- Pitfalls with arrays and C strings
- Complex data types
- Inlining revisited
- Portability problems and solutions
- Undefined behaviors
Object Oriented methods in C
- Constructors and destructors and how the toolchain supports them
- "Virtual methods" in C and their advantages
- "Inheritance" and "polymorphism"
- Performance improvements
State machines done right
- State representation (enums, function pointers)
- Transition tables and guards
- Hierarchical state machines (HSM)
- Event-driven architecture for embedded systems
Evolution of C
- Newer language constructs (keywords, trigraphs, digraphs)
- C11 _Generic and type-generic macros
- C11/C18 updates relevant to embedded codebases
Handling variable number of arguments
- The basics of varargs
- Security considerations (format-string issues, bounds, undefined behavior)
Embedded programming (AVR focus)
- AVR architecture overview (memory, CPU)
- Important registers and addressing modes
- Key AVR instructions
- Timers
- I/O ports
- ADC
- PWM
- Interrupt handling
- AVR interrupts and the interrupt vector
- Writing ISRs: do's and don'ts, examples
- Deferrable functions and deferred work
- Time management with timers
- Timer operation patterns
- RTOS essentials
- Scheduling: threads, context switching, scheduler types
- Implementing a task scheduler for precise timing
- Mutexes (types, robust vs. non-robust, policy)
- MMU basics
- Hardware I/O: buses and ports
- Important registers recap (GPIO/ADC/PWM/Watchdog)
- Power management and system power states
Advanced embedded C (extra topics)
- C11 atomics vs. volatile; memory order and lock-free patterns (where applicable)
- Ring buffers for ISR ⇄ main communication (single-producer/single-consumer)
- DMA basics and zero-copy I/O (where available)
- Linker scripts and memory sections (.text/.data/.bss/.rodata, custom placement)
- Startup code and boot sequence (reset vector, crt0, initialization order)
- Interrupt latency, critical sections, and determinism
- Tickless scheduling and low-jitter timers
- Fixed-point arithmetic and saturation arithmetic
- MISRA C overview and practical deviation handling
- Testing on embedded targets: Unity/CMock, fakes, and HIL
- Abstraction strategies: HAL vs. register-level; compile-time configuration
- Low-power design: sleep modes, clock gating, wake-up sources
Course Day Structure
- Part 1: 09:00–10:30
- Break: 10:30–10:45
- Part 2: 10:45–12:15
- Lunch break: 12:15–13:15
- Part 3: 13:15–15:15
- Break: 15:15–15:30
- Part 4: 15:30–17:30