1.6 KiB
1.6 KiB
K11 — Mutex, LockGuard and priority inheritance
Position
- Series: FreeRTOS C++
- Lesson: L10, card K11
- Duration: 30 minutes
- Actors: LOW=1, MEDIUM=2, HIGH=3, coordinator=4
- Storage: static mutex control and static task stacks
Outcome
The student distinguishes mutex ownership from semaphore signaling, repairs
early returns with LockGuard, and explains every state/priority transition in
a measured priority-inheritance schedule.
Lesson plan
| Time | Mode | Evidence |
|---|---|---|
| 0–5 | ownership | owner-only give; ordinary mutex non-recursive |
| 5–10 | LockGuard | three returns each give exactly once |
| 10–15 | setup | LOW takes; HIGH attempts; MEDIUM ready |
| 15–20 | inheritance | HIGH blocked; LOW priority rises 1→3 |
| 20–25 | release | MEDIUM has not run; HIGH acquires next |
| 25–30 | restore | LOW returns to 1; protected counter is 11 |
Acceptance
- mutex handle equals caller static control and heap delta is zero;
- LOW owns at first checkpoint and HIGH owns after handoff;
- HIGH is blocked while waiting;
- LOW priority is exactly 1, then 3, then 1;
- MEDIUM does not run before LOW release;
- event order proves inherited LOW precedes MEDIUM;
- guard restores on every host early-return path;
- ordinary recursive attempt fails;
- target exits with PASS and shared counter 11.
Main traps
- A binary semaphore is not an ownership mutex and has no inheritance.
- Ordinary mutex recursion deadlocks/fails; use a recursive type deliberately.
- Only the owner may unlock.
- Mutex APIs are not ISR APIs.
- Inheritance is temporary and bounded by the held mutex lifetime.