meta: add interactive draft URL

This commit is contained in:
2026-07-20 08:36:39 +02:00
parent 8cce956515
commit 13abbea922
+263 -42
View File
@@ -1,63 +1,284 @@
{ {
"$schema": "../../../tools/card-layouts/schemas/card-source.schema.json", "schema": "esc-card-source.v1", "$schema": "../../../tools/card-layouts/schemas/card-source.schema.json",
"schema": "esc-card-source.v1",
"card": { "card": {
"id": "mpabi-freertos-cpp-15-isr-drivers", "series": "freertos-cpp", "series_title": "FreeRTOS C++", "number": "15", "count": "16", "slug": "isr-drivers", "id": "mpabi-freertos-cpp-15-isr-drivers",
"title": "Explicit FromISR, UART and GPIO Wrappers", "topic": "Task/ISR views, accumulated wake, one yield and explicit UART backpressure", "project": "Freestanding C++ nad FreeRTOS", "subject": "Informatyka", "series": "freertos-cpp",
"level": "Rok 2 · L14 · RV32I/Hazard3", "revision_date": "2026-07-19T00:00:00+02:00", "status": "Gotowa", "version": "v00.01", "series_title": "FreeRTOS C++",
"uuid": "02f6cd71-5c85-4883-a237-1d4ba08d9469", "author": "M. Pabiszczak", "year": "2026" "number": "15",
"count": "16",
"slug": "isr-drivers",
"title": "Explicit FromISR, UART and GPIO Wrappers",
"topic": "Task/ISR views, accumulated wake, one yield and explicit UART backpressure",
"project": "Freestanding C++ nad FreeRTOS",
"subject": "Informatyka",
"level": "Rok 2 · L14 · RV32I/Hazard3",
"revision_date": "2026-07-19T00:00:00+02:00",
"status": "Gotowa",
"version": "v00.01",
"uuid": "02f6cd71-5c85-4883-a237-1d4ba08d9469",
"author": "M. Pabiszczak",
"year": "2026"
},
"generated": {
"tex": "doc/generated/main.tex",
"html": "web/index.html",
"html_css": "web/style.css",
"html_tree_inspector": false,
"react_app": true
}, },
"generated": {"tex": "doc/generated/main.tex", "html": "web/index.html", "html_css": "web/style.css", "html_tree_inspector": false, "react_app": true},
"template": "templates/karta-klasyczna.json", "template": "templates/karta-klasyczna.json",
"title_block": { "title_block": {
"category": "KARTA PRACY · INFORMATYKA", "prepared_by": "M. Pabiszczak", "prepared_on": "2026-07-19T00:00:00+02:00", "category": "KARTA PRACY · INFORMATYKA",
"title": "Explicit FromISR, UART and GPIO Wrappers", "repository_url": "https://zsl-gitea.mpabi.pl/edu-freertos-cpp/lab-rv32i-freertos-isr-drivers", "prepared_by": "M. Pabiszczak",
"revision": "v00.01", "issued_on": "2026-07-19T00:00:00+02:00", "series": "FREERTOS-CPP-15", "document_type": "karta pracy", "tool": "card-layouts", "prepared_on": "2026-07-19T00:00:00+02:00",
"show_qr": false, "show_repository_qr": false, "height_cm": 2.6, "repeat_on_every_page": true, "replace_front_matter": true "title": "Explicit FromISR, UART and GPIO Wrappers",
"repository_url": "https://zsl-gitea.mpabi.pl/edu-freertos-cpp/lab-rv32i-freertos-isr-drivers",
"revision": "v00.01",
"issued_on": "2026-07-19T00:00:00+02:00",
"series": "FREERTOS-CPP-15",
"document_type": "karta pracy",
"tool": "card-layouts",
"show_qr": false,
"show_repository_qr": false,
"height_cm": 2.6,
"repeat_on_every_page": true,
"replace_front_matter": true,
"url": "https://dce7fb9d-7b2f-5d49-96a2-3a30d3070b84.mpabi.pl/02f6cd71-5c85-4883-a237-1d4ba08d9469"
}, },
"front_page_scope": { "front_page_scope": {
"title": "Cel karty", "content_tex": "Uczeń publikuje UART RX i GPIO edge z realnego external IRQ przez jawne FromISR views, akumuluje wake i wykonuje jeden yield.", "title": "Cel karty",
"scope_title": "Zakres karty", "scope_content_tex": "ISR nie wykonuje blocking API, parsowania ani debounce. Queue overflow jest jawnym drop-newest z licznikiem, a ciężka praca przechodzi do taska." "content_tex": "Uczeń publikuje UART RX i GPIO edge z realnego external IRQ przez jawne FromISR views, akumuluje wake i wykonuje jeden yield.",
"scope_title": "Zakres karty",
"scope_content_tex": "ISR nie wykonuje blocking API, parsowania ani debounce. Queue overflow jest jawnym drop-newest z licznikiem, a ciężka praca przechodzi do taska."
},
"side_margin_tree_layout": {
"columns": [
{
"id": "zawodowe",
"label": "TECH",
"side": "left",
"tree": "WE -> EK -> KW",
"description": "MMIO transitions, mcause, FromISR, wake/yield i execution order."
},
{
"id": "ogolne",
"label": "OG",
"side": "right",
"tree": "WE -> EN -> KW",
"description": "Context boundary, bounded work i backpressure policy."
}
]
}, },
"side_margin_tree_layout": {"columns": [
{"id": "zawodowe", "label": "TECH", "side": "left", "tree": "WE -> EK -> KW", "description": "MMIO transitions, mcause, FromISR, wake/yield i execution order."},
{"id": "ogolne", "label": "OG", "side": "right", "tree": "WE -> EN -> KW", "description": "Context boundary, bounded work i backpressure policy."}
]},
"learning_effects": { "learning_effects": {
"K15.EN01": {"bloom_level": "Analiza", "label": "Granica ISR", "text": "Uczeń analizuje task/ISR API, bounded handler, backpressure i miejsce parsing/debounce.", "assessment_criteria": ["K15.KW01"]}, "K15.EN01": {
"K15.EK01": {"bloom_level": "Zastosowanie", "label": "FromISR i yield", "text": "Uczeń obsługuje realny IRQ, publikuje queue/notification FromISR i dowodzi jednego przełączenia.", "assessment_criteria": ["K15.KW01"]} "bloom_level": "Analiza",
"label": "Granica ISR",
"text": "Uczeń analizuje task/ISR API, bounded handler, backpressure i miejsce parsing/debounce.",
"assessment_criteria": [
"K15.KW01"
]
},
"K15.EK01": {
"bloom_level": "Zastosowanie",
"label": "FromISR i yield",
"text": "Uczeń obsługuje realny IRQ, publikuje queue/notification FromISR i dowodzi jednego przełączenia.",
"assessment_criteria": [
"K15.KW01"
]
}
}, },
"assessment_criteria": { "assessment_criteria": {
"K15.KW01": {"text": "Program kończy się PASS; mcause=0x8000000b, UART/GPIO status 1->0, 0x41 queued, 0x42 drop-newest, notification=1, wake=true, yield calls=1, receiver działa w ticku 1 przed resume stimulus, heap delta 0.", "learning_effects": ["K15.EN01", "K15.EK01"]} "K15.KW01": {
"text": "Program kończy się PASS; mcause=0x8000000b, UART/GPIO status 1->0, 0x41 queued, 0x42 drop-newest, notification=1, wake=true, yield calls=1, receiver działa w ticku 1 przed resume stimulus, heap delta 0.",
"learning_effects": [
"K15.EN01",
"K15.EK01"
]
}
}, },
"educational_requirements": { "educational_requirements": {
"K15.WE01": { "K15.WE01": {
"text": "Implementacja jawnej, bounded granicy między IRQ a taskami dla UART i GPIO.", "label": "Explicit FromISR drivers", "learning_effects": ["K15.EN01", "K15.EK01"], "text": "Implementacja jawnej, bounded granicy między IRQ a taskami dla UART i GPIO.",
"label": "Explicit FromISR drivers",
"learning_effects": [
"K15.EN01",
"K15.EK01"
],
"learning_tree": { "learning_tree": {
"schema": "we-learning-tree.v1", "policy": "Handler używa jednego IsrContext, jawnych FromISR APIs, clear-before-exit i jednego yield.", "schema": "we-learning-tree.v1",
"ogolne": [{"effect_ref": "K15.EN01", "display": "EN LOCAL RTOS.ISR.01", "source": "LOCAL", "official": "RTOS.ISR", "local": "01", "kind": "EN", "tree_id": "K15.WE01.OG.LOCAL.RTOS.ISR.01", "text": "Analizuje ograniczenia ISR, overflow i delegowanie pracy.", "kw": [{"criterion_ref": "K15.KW01", "display": "KW LOCAL RTOS.ISR.01", "source": "LOCAL", "kind": "KW", "official": "RTOS.ISR", "local": "01", "text": "Nie wywołuje blocking API, definiuje drop-newest i przenosi parsing/debounce do taska."}]}], "policy": "Handler używa jednego IsrContext, jawnych FromISR APIs, clear-before-exit i jednego yield.",
"zawodowe": [{"effect_ref": "K15.EK01", "display": "EK LOCAL DBG.ISR.01", "source": "LOCAL", "official": "DBG.ISR", "local": "01", "kind": "EK", "tree_id": "K15.WE01.TECH.LOCAL.DBG.ISR.01", "text": "Mierzy mcause, register transitions, queued/dropped bytes, wake flag i order.", "kw": [{"criterion_ref": "K15.KW01", "display": "KW LOCAL DBG.ISR.01", "source": "LOCAL", "kind": "KW", "official": "DBG.ISR", "local": "01", "text": "Pokazuje 0x41/0x42, wake 1, yield 1, receiver-before-resume i PASS."}]}] "ogolne": [
{
"effect_ref": "K15.EN01",
"display": "EN LOCAL RTOS.ISR.01",
"source": "LOCAL",
"official": "RTOS.ISR",
"local": "01",
"kind": "EN",
"tree_id": "K15.WE01.OG.LOCAL.RTOS.ISR.01",
"text": "Analizuje ograniczenia ISR, overflow i delegowanie pracy.",
"kw": [
{
"criterion_ref": "K15.KW01",
"display": "KW LOCAL RTOS.ISR.01",
"source": "LOCAL",
"kind": "KW",
"official": "RTOS.ISR",
"local": "01",
"text": "Nie wywołuje blocking API, definiuje drop-newest i przenosi parsing/debounce do taska."
}
]
}
],
"zawodowe": [
{
"effect_ref": "K15.EK01",
"display": "EK LOCAL DBG.ISR.01",
"source": "LOCAL",
"official": "DBG.ISR",
"local": "01",
"kind": "EK",
"tree_id": "K15.WE01.TECH.LOCAL.DBG.ISR.01",
"text": "Mierzy mcause, register transitions, queued/dropped bytes, wake flag i order.",
"kw": [
{
"criterion_ref": "K15.KW01",
"display": "KW LOCAL DBG.ISR.01",
"source": "LOCAL",
"kind": "KW",
"official": "DBG.ISR",
"local": "01",
"text": "Pokazuje 0x41/0x42, wake 1, yield 1, receiver-before-resume i PASS."
}
]
}
]
} }
} }
}, },
"sections": [ "sections": [
{"title": "Realny IRQ i explicit views", "content_kind": "prose", "content_tex": "Wyzwól machine-external IRQ, porównaj task oraz ISR views UART/GPIO i potwierdź osobny ISR stack oraz clear sources.", "educational_requirement_refs": ["K15.WE01"], "learning_effect_refs": ["K15.EK01"], "assessment_criterion_refs": ["K15.KW01"], "area_tree_refs": ["K15.WE01.TECH.LOCAL.DBG.ISR.01"], "steps": [ {
{"id": "S01", "title": "Zmierz mcause i status UART/GPIO 1 do 0.", "tree_refs": ["K15.WE01.TECH.LOCAL.DBG.ISR.01"]}, "title": "Realny IRQ i explicit views",
{"id": "S02", "title": "Potwierdź ISR stack różny od task stacks.", "tree_refs": ["K15.WE01.TECH.LOCAL.DBG.ISR.01"]} "content_kind": "prose",
]}, "content_tex": "Wyzwól machine-external IRQ, porównaj task oraz ISR views UART/GPIO i potwierdź osobny ISR stack oraz clear sources.",
{"title": "UART backpressure i GPIO notification", "content_kind": "prose", "content_tex": "Wyślij dwa bajty do queue capacity 1, policz drop-newest, a GPIO edge opublikuj jako notification tego samego receivera.", "educational_requirement_refs": ["K15.WE01"], "learning_effect_refs": ["K15.EK01"], "assessment_criterion_refs": ["K15.KW01"], "area_tree_refs": ["K15.WE01.TECH.LOCAL.DBG.ISR.01"], "steps": [ "educational_requirement_refs": [
{"id": "S03", "title": "Pokaż queued 0x41 i dropped 0x42.", "tree_refs": ["K15.WE01.TECH.LOCAL.DBG.ISR.01"]}, "K15.WE01"
{"id": "S04", "title": "Pokaż notification sent/taken 1.", "tree_refs": ["K15.WE01.TECH.LOCAL.DBG.ISR.01"]} ],
]}, "learning_effect_refs": [
{"title": "Wake accumulation, one yield i bounded work", "content_kind": "prose", "content_tex": "Połącz local wake flags w jednym IsrContext, wykonaj yield raz, dowiedź receiver-before-resume i przypisz parsing/debounce do taska.", "educational_requirement_refs": ["K15.WE01"], "learning_effect_refs": ["K15.EN01"], "assessment_criterion_refs": ["K15.KW01"], "area_tree_refs": ["K15.WE01.OG.LOCAL.RTOS.ISR.01"], "steps": [ "K15.EK01"
{"id": "S05", "title": "Potwierdź wake true, yield calls 1 i tick receivera 1.", "tree_refs": ["K15.WE01.OG.LOCAL.RTOS.ISR.01"]}, ],
{"id": "S06", "title": "Uzasadnij overflow oraz granicę ISR/task.", "tree_refs": ["K15.WE01.OG.LOCAL.RTOS.ISR.01"]} "assessment_criterion_refs": [
]} "K15.KW01"
],
"area_tree_refs": [
"K15.WE01.TECH.LOCAL.DBG.ISR.01"
],
"steps": [
{
"id": "S01",
"title": "Zmierz mcause i status UART/GPIO 1 do 0.",
"tree_refs": [
"K15.WE01.TECH.LOCAL.DBG.ISR.01"
]
},
{
"id": "S02",
"title": "Potwierdź ISR stack różny od task stacks.",
"tree_refs": [
"K15.WE01.TECH.LOCAL.DBG.ISR.01"
]
}
]
},
{
"title": "UART backpressure i GPIO notification",
"content_kind": "prose",
"content_tex": "Wyślij dwa bajty do queue capacity 1, policz drop-newest, a GPIO edge opublikuj jako notification tego samego receivera.",
"educational_requirement_refs": [
"K15.WE01"
],
"learning_effect_refs": [
"K15.EK01"
],
"assessment_criterion_refs": [
"K15.KW01"
],
"area_tree_refs": [
"K15.WE01.TECH.LOCAL.DBG.ISR.01"
],
"steps": [
{
"id": "S03",
"title": "Pokaż queued 0x41 i dropped 0x42.",
"tree_refs": [
"K15.WE01.TECH.LOCAL.DBG.ISR.01"
]
},
{
"id": "S04",
"title": "Pokaż notification sent/taken 1.",
"tree_refs": [
"K15.WE01.TECH.LOCAL.DBG.ISR.01"
]
}
]
},
{
"title": "Wake accumulation, one yield i bounded work",
"content_kind": "prose",
"content_tex": "Połącz local wake flags w jednym IsrContext, wykonaj yield raz, dowiedź receiver-before-resume i przypisz parsing/debounce do taska.",
"educational_requirement_refs": [
"K15.WE01"
],
"learning_effect_refs": [
"K15.EN01"
],
"assessment_criterion_refs": [
"K15.KW01"
],
"area_tree_refs": [
"K15.WE01.OG.LOCAL.RTOS.ISR.01"
],
"steps": [
{
"id": "S05",
"title": "Potwierdź wake true, yield calls 1 i tick receivera 1.",
"tree_refs": [
"K15.WE01.OG.LOCAL.RTOS.ISR.01"
]
},
{
"id": "S06",
"title": "Uzasadnij overflow oraz granicę ISR/task.",
"tree_refs": [
"K15.WE01.OG.LOCAL.RTOS.ISR.01"
]
}
]
}
], ],
"tasks": {"task01": { "tasks": {
"title": "UART queue i GPIO notify z realnego IRQ", "uuid": "02f6cd71-5c85-4883-a237-1d4ba08d9469", "task01": {
"prompt_tex": "Zaimplementuj task/ISR views UART i GPIO, opublikuj dwa bounded events przez jeden IsrContext, udowodnij backpressure, wake i one-yield order.", "title": "UART queue i GPIO notify z realnego IRQ",
"criterion": "mcause 8000000b; status 1->0; queued 41/dropped 42; notify 1; wake/yield 1; receiver tick1 before resume; GPIO data1; heap delta0; pass=1.", "uuid": "02f6cd71-5c85-4883-a237-1d4ba08d9469",
"educational_requirement_refs": ["K15.WE01"], "learning_effect_refs": ["K15.EN01", "K15.EK01"], "assessment_criterion_ref": "K15.KW01", "links": {"equations": [], "figures": []} "prompt_tex": "Zaimplementuj task/ISR views UART i GPIO, opublikuj dwa bounded events przez jeden IsrContext, udowodnij backpressure, wake i one-yield order.",
}}, "criterion": "mcause 8000000b; status 1->0; queued 41/dropped 42; notify 1; wake/yield 1; receiver tick1 before resume; GPIO data1; heap delta0; pass=1.",
"tasks_order": ["task01"] "educational_requirement_refs": [
"K15.WE01"
],
"learning_effect_refs": [
"K15.EN01",
"K15.EK01"
],
"assessment_criterion_ref": "K15.KW01",
"links": {
"equations": [],
"figures": []
}
}
},
"tasks_order": [
"task01"
]
} }