chore: preserve current FreeRTOS and C card updates

This commit is contained in:
2026-07-21 19:13:55 +02:00
parent 0fc6158501
commit 4055b21868
6 changed files with 142 additions and 72 deletions
+2 -2
View File
@@ -41,7 +41,7 @@
{"id":"lists","number":4,"label":"active lists hold expiry","mode":"RUN","event_id":"E03","strategy_ref":"run.commands","svg_label":"04","code_ref":"src/tasks/task01_software_timers.c:131","snapshot_ref":"task01.reset","description":"Reset przesuwa one-shot.","evidence":"brak callbacku w tick 5."},
{"id":"callback","number":5,"label":"callback records only","mode":"RUN","event_id":"E07","strategy_ref":"run.callback","svg_label":"05","code_ref":"src/tasks/task01_software_timers.c:68","snapshot_ref":"task01.one-shot","description":"Krótka funkcja na daemon stack.","evidence":"one_shot_count=1."}
]}]}]},
{"id":"A3","label":"DISPATCH","title":"Dispatch","order":30,"orientation":"landscape","description":"Handle → Timer_t → callback → TimerTag.","content_tex":"Callback otrzymuje nieprzezroczysty TimerHandle_t. pvTimerGetTimerID odzyskuje jawny kontekst aplikacyjny bez globalnej tablicy rozgałęzień po adresach.","assets":[{"stem":"a3-dispatch","title":"A3 · callback dispatch","caption":"A3 DISPATCH — jeden callback i dwa typowane IDs.","label":"fig:a3-dispatch","alt":"Mechanizm dispatch software timera.","phases":[{"id":"dispatch","label":"HANDLE / ID / CALLBACK","steps":[
{"id":"A3","label":"DISPATCH","title":"Dispatch","order":30,"orientation":"landscape","description":"Handle → Timer_t → callback → TimerTag.","content_tex":"Callback otrzymuje nieprzezroczysty \\texttt{TimerHandle\\_t}. \\texttt{pvTimerGetTimerID} odzyskuje jawny kontekst aplikacyjny bez globalnej tablicy rozgałęzień po adresach.","assets":[{"stem":"a3-dispatch","title":"A3 · callback dispatch","caption":"A3 DISPATCH — jeden callback i dwa typowane IDs.","label":"fig:a3-dispatch","alt":"Mechanizm dispatch software timera.","phases":[{"id":"dispatch","label":"HANDLE / ID / CALLBACK","steps":[
{"id":"handle","number":1,"label":"opaque handle identifies Timer_t","mode":"CODE","strategy_ref":"code.timer-contract","svg_label":"01","code_ref":"include/task01_software_timers.h:37","description":"Aplikacja nie czyta pól Timer_t.","evidence":"TimerHandle_t."},
{"id":"timer","number":2,"label":"kernel stores callback and ID","mode":"CODE","strategy_ref":"code.timer-contract","svg_label":"02","code_ref":"src/tasks/task01_software_timers.c:249","description":"xTimerCreate wiąże funkcję z TimerTag.","evidence":"one-shot i auto."},
{"id":"callback","number":3,"label":"daemon invokes shared callback","mode":"RUN","event_id":"E04","strategy_ref":"run.callback","svg_label":"03","code_ref":"src/tasks/task01_software_timers.c:68","snapshot_ref":"task01.auto-1","description":"Wywołanie jest synchroniczne w daemon task.","evidence":"PC w callback, daemon SP."},
@@ -81,6 +81,6 @@
"task":{"short_label":"software timers","title":"One-shot, auto-reload i timer daemon","prompt_tex":"Przejdź po A1, A3, A5, A6 i A7. Odtwórz E01E10 i rozdziel moment enqueue command od callback execution.","conclusion_tex":"Software timer jest obsługiwany przez daemon task. API wysyła komendę, aktywna lista przechowuje expiry, a callback działa później na stosie daemon task.","flow":[
{"kind":"block","id":"model","title":"A — model timer service","content_tex":"Przewidź oś czasu i właściciela każdego wywołania.","steps":[{"id":"commands","title":"Rozdziel command i callback.","content_tex":"Wskaż dwa różne momenty dowodowe."},{"id":"timeline","title":"Przewidź 2/4/6/7.","content_tex":"Uwzględnij reset i change period."}]},
{"kind":"block","id":"replay","title":"B — replay Hazard3","content_tex":"Zbadaj controller i daemon w osobnych layoutach.","steps":[{"id":"enqueue","title":"Zbadaj E02/E03/E06.","content_tex":"Sprawdź accepted flags i command source."},{"id":"callbacks","title":"Zbadaj E04/E05/E07/E08.","content_tex":"Porównaj TimerTag, PC, SP i tick."},{"id":"pass","title":"Zbadaj E09/E10.","content_tex":"Sprawdź brak czwartego callbacku i digest."}]},
{"kind":"exercise","id":"late-command","title":"Ćwiczenie — command queue pressure","prompt_tex":"Zmniejsz configTIMER_QUEUE_LENGTH do 1 i przygotuj kontrolowany burst dwóch komend z block time 0. Obsłuż pdFAIL bez utraty poprzedniego stanu timera.","evidence_tex":"Snapshot queue pressure, jawny expected failure i deterministyczny final state.","criterion":"Uczeń nie interpretuje pdFAIL jako wykonanej komendy i nie blokuje callbacku.","based_on":["model","replay"]}
{"kind":"exercise","id":"late-command","title":"Ćwiczenie — command queue pressure","prompt_tex":"Zmniejsz \\texttt{configTIMER\\_QUEUE\\_LENGTH} do 1 i przygotuj kontrolowany burst dwóch komend z block time 0. Obsłuż \\texttt{pdFAIL} bez utraty poprzedniego stanu timera.","evidence_tex":"Snapshot queue pressure, jawny expected failure i deterministyczny final state.","criterion":"Uczeń nie interpretuje pdFAIL jako wykonanej komendy i nie blokuje callbacku.","based_on":["model","replay"]}
]}
}