1.9 KiB
1.9 KiB
K15 — Explicit FromISR, UART and GPIO wrappers
Position
- Series: FreeRTOS C++
- Lesson: L14, card K15
- Duration: 30 minutes
- Real machine-external interrupt on Hazard3
- Queue capacity 1 with drop-newest overflow
Outcome
The student distinguishes task and ISR driver views, publishes UART/GPIO events only through explicit FromISR APIs, accumulates one wake decision, yields once, and proves backpressure plus immediate high-priority task execution.
Lesson plan
| Time | Mode | Evidence |
|---|---|---|
| 0–5 | ISR contract | task/ISR views and one IsrContext |
| 5–10 | real IRQ | mcause=0x8000000b and separate ISR stack |
| 10–15 | UART queue | 0x41 queued, 0x42 drop-newest |
| 15–20 | GPIO notify | edge 1→0, notification count 1 |
| 20–25 | wake/yield | accumulated wake=true, exactly one yield |
| 25–30 | context switch | receiver at tick 1 before stimulus resumes |
Acceptance
- the interrupt is a real machine-external IRQ through the FreeRTOS trap path;
- Uart and GpioPin expose distinct task and ISR views;
- only xQueueSendFromISR and vTaskNotifyGiveFromISR are used in the handler;
- one IsrContext accumulates both wake requests;
- RX queue capacity 1 accepts 0x41 and drop-newest rejects/counts 0x42;
- UART ready and GPIO edge MMIO-model state clear from 1 to 0;
- higherPriorityTaskWoken is true and yield_if_needed is called once;
- receiver gets byte 0x41 and notification count 1 at tick 1;
- receiver sees stimulus_after=0; stimulus later sees receiver_done=1;
- static storage has heap delta zero and target exits with PASS.
Main traps
- Calling an ordinary blocking API from an ISR.
- Automatically guessing execution context instead of explicit views.
- Yielding after each primitive rather than once at handler exit.
- Ignoring queue overflow or silently overwriting data.
- Performing parsing, debounce or long GPIO policy in the handler.