{ "$schema": "../../../tools/card-layouts/schemas/card-source.schema.json", "schema": "esc-card-source.v1", "card": { "id": "mpabi-freertos-cpp-15-isr-drivers", "series": "freertos-cpp", "series_title": "FreeRTOS C++", "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}, "template": "templates/karta-klasyczna.json", "title_block": { "category": "KARTA PRACY · INFORMATYKA", "prepared_by": "M. Pabiszczak", "prepared_on": "2026-07-19T00:00:00+02:00", "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 }, "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.", "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."} ]}, "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.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": { "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": { "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"], "learning_tree": { "schema": "we-learning-tree.v1", "policy": "Handler używa jednego IsrContext, jawnych FromISR APIs, clear-before-exit i jednego yield.", "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": [ {"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"]}, {"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": { "title": "UART queue i GPIO notify z realnego IRQ", "uuid": "02f6cd71-5c85-4883-a237-1d4ba08d9469", "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.", "educational_requirement_refs": ["K15.WE01"], "learning_effect_refs": ["K15.EN01", "K15.EK01"], "assessment_criterion_ref": "K15.KW01", "links": {"equations": [], "figures": []} }}, "tasks_order": ["task01"] }