Files

1.9 KiB
Raw Permalink Blame History

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
05 ISR contract task/ISR views and one IsrContext
510 real IRQ mcause=0x8000000b and separate ISR stack
1015 UART queue 0x41 queued, 0x42 drop-newest
1520 GPIO notify edge 1→0, notification count 1
2025 wake/yield accumulated wake=true, exactly one yield
2530 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

  1. Calling an ordinary blocking API from an ISR.
  2. Automatically guessing execution context instead of explicit views.
  3. Yielding after each primitive rather than once at handler exit.
  4. Ignoring queue overflow or silently overwriting data.
  5. Performing parsing, debounce or long GPIO policy in the handler.