Milestone map
3 milestones
Set up the embedded development environment and implement a hardware abstraction layer
2–3 weeks (environment setup + HAL implementation + test)
Set up a working embedded development environment for a real microcontroller board or a free online simulator. Acceptable platforms: Arduino Uno/Nano/Mega (free Arduino IDE), Raspberry Pi Pico (free MicroPython or C SDK), STM32 Nucleo (free STM32CubeIDE), ESP32/ESP8266 (free Arduino IDE or ESP-IDF), or — with no hardware available — Wokwi (free browser-based simulator supporting Arduino, ESP32, and Raspberry Pi Pico). Implement a hardware abstraction layer (HAL) for at least two peripherals required by the firmware system you plan to build in M2: write driver functions for the peripheral (e.g. `led_init()`, `led_set(state)`, `uart_send(byte)`, `sensor_read_raw()`) that expose a clean interface hiding the register-level or library-level details. Confirm the HAL works by running a simple test for each peripheral (e.g. LED blinks at 1 Hz, UART sends a known byte sequence, sensor returns a value in the expected range).
Proof required
Submit: (1) a brief system overview (100–150 words) stating the target platform, the two peripherals your HAL covers, and the firmware system you plan to build in M2; (2) the HAL source code for both peripherals (in a public GitHub repository or Wokwi project link); (3) a short video or GIF (30–60 seconds) or Wokwi simulation link showing the HAL test running — each peripheral demonstrating its expected behaviour; (4) a confirmation that the development environment compiles and uploads without errors (screenshot of the IDE/terminal with a clean build output).
What gets checked
Common mistakes
Resources
Foundationstart here
Depthgo deeper
Masteryfor the dedicated
What a verifier looks for
You'll sign in first, then come straight back here.
Implement and test a complete firmware application using the HAL
3–4 weeks (firmware implementation + FSM + testing)
Implement a complete firmware application using the HAL from Milestone 1. The application must: use both peripherals from the HAL; implement a finite state machine (FSM) or event-driven architecture with at least three distinct states or event types; and meet at least one real-time constraint (e.g. sensor sampled at a fixed interval, LED pattern with precise timing, UART response within a bounded delay). Examples of complete applications: a temperature-monitored fan controller (temperature sensor HAL + PWM fan HAL + UART status reporting; FSM states: idle, cooling, alert); a door access controller (keypad HAL + LED/buzzer HAL; FSM states: locked, entering code, unlocked, alarm); a data logger (sensor HAL + SD card/UART HAL; event loop: sample, format, transmit). Write at least five unit tests or integration tests that verify the FSM transitions and the real-time constraint. Free tools: Wokwi for simulation; Unity Test Framework (free) for C firmware tests; or Arduino's own `assert()` for simple test cases.
Proof required
Submit: (1) the complete firmware application source code in a public GitHub repository or Wokwi project; (2) the FSM diagram (state diagram with states, transitions, and trigger conditions — draw.io is free); (3) the five test cases with expected and actual outputs (as code with assertion statements, or as a documented test log); (4) a video or Wokwi simulation link showing the application running through at least two FSM state transitions.
What gets checked
Common mistakes
Resources
Foundationstart here
Depthgo deeper
Masteryfor the dedicated
What a verifier looks for
You'll sign in first, then come straight back here.
Produce a firmware design document and conduct a code review
1–2 weeks (document + code review session + code update)
Produce a firmware design document covering the complete system from Milestone 1 and Milestone 2. The document must include: a system architecture section (block diagram showing HAL layer, application layer, and peripheral hardware; from M1); the FSM specification (state diagram + state/transition table; from M2); the real-time constraints and how they are met (timing analysis); a known limitations section (at least two limitations of the current implementation — e.g. no error recovery if sensor disconnected, timer interrupt not used so timing is approximate); and a future improvements section (at least two specific improvements, each with a brief technical rationale). Present the firmware code and design document to a qualified reviewer (software or electrical engineer with embedded systems experience) in a structured code review session of 30–45 minutes. The reviewer must identify at least two specific code issues (style, correctness, or robustness concerns) that the author must address.
Proof required
Submit: (1) the firmware design document (all sections above, 600–900 words); (2) the code review record — the reviewer's two specific issues (with file name and line number or function name), the author's response, and whether each issue was addressed in a code update (200 words minimum, attributing reviewer by professional role); (3) the updated code with the two issues addressed (GitHub commit link showing the changes).
What gets checked
Common mistakes
Powstik Guide
A firmware design document and a code review record.
Steps
Template
Modules: State machine: Reviewer: Role: Date: | Issue | Severity | Fix | |-------|----------|-----|
What gets sent back
Resources
Foundationstart here
Depthgo deeper
What a verifier looks for
You'll sign in first, then come straight back here.