Files
lab-rv32i-freertos-heap-models/json/card_source.json
T

311 lines
10 KiB
JSON

{
"$schema": "../../../tools/card-layouts/schemas/card-source.schema.json",
"schema": "esc-card-source.v1",
"card": {
"id": "mpabi-freertos-cpp-05-heap-models",
"series": "freertos-cpp",
"series_title": "FreeRTOS C++",
"number": "05",
"count": "16",
"slug": "heap-models",
"title": "Most C++ do heapu, modele i HeapStats",
"topic": "heap_1--heap_5, komplet new/delete, fragmentacja, koalescencja i watermark",
"project": "Freestanding C++ nad FreeRTOS",
"subject": "Informatyka",
"level": "Rok 2 · L04 · RV32I/Hazard3",
"revision_date": "2026-07-19T00:00:00+02:00",
"status": "Gotowa",
"version": "v00.01",
"uuid": "c456b505-dc5c-4894-b832-bb4c5afd0feb",
"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": "Most C++ do heapu, modele i HeapStats",
"repository_url": "https://zsl-gitea.mpabi.pl/edu-freertos-cpp/lab-rv32i-freertos-heap-models",
"revision": "v00.01",
"issued_on": "2026-07-19T00:00:00+02:00",
"series": "FREERTOS-CPP-05",
"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/c456b505-dc5c-4894-b832-bb4c5afd0feb"
},
"front_page_scope": {
"title": "Cel karty",
"content_tex": "Uczeń wybiera model heapu, śledzi kompletny most C++ i dowodzi na Hazard3, że suma wolnych bajtów nie gwarantuje jednego wystarczająco dużego bloku.",
"scope_title": "Zakres karty",
"scope_content_tex": "Eksperyment linkuje wyłącznie prawdziwy \\texttt{heap\\_4.c}. \\texttt{HeapStats} i \\texttt{HeapWatermark} są tylko-odczytowymi wartościami; runtime-selected resource oraz typed allocator należą do K06."
},
"side_margin_tree_layout": {
"columns": [
{
"id": "zawodowe",
"label": "TECH",
"side": "left",
"tree": "WE -> EK -> KW",
"description": "Dowód z heap_4, ELF i Hazard3."
},
{
"id": "ogolne",
"label": "OG",
"side": "right",
"tree": "WE -> EN -> KW",
"description": "Dobór polityki i interpretacja metryk."
}
]
},
"learning_effects": {
"K05.EN01": {
"bloom_level": "Analiza",
"label": "Polityka i metryki",
"text": "Uczeń dobiera heap_1--heap_5 oraz odróżnia current free, largest free block i minimum-ever.",
"assessment_criteria": [
"K05.KW01"
]
},
"K05.EK01": {
"bloom_level": "Zastosowanie",
"label": "Fragmentacja i most ABI",
"text": "Uczeń wykazuje komplet new/delete i odtwarza failure, koalescencję, retry oraz historyczny watermark.",
"assessment_criteria": [
"K05.KW01"
]
}
},
"assessment_criteria": {
"K05.KW01": {
"text": "Program kończy się PASS; largest < request < total; pierwsza próba zawodzi bez zwiększenia success count; po koalescencji identyczna próba działa; current wraca do baseline, a minimum-ever zachowuje historię.",
"learning_effects": [
"K05.EN01",
"K05.EK01"
]
}
},
"educational_requirements": {
"K05.WE01": {
"text": "Dobranie i zbadanie polityki dynamicznej pamięci FreeRTOS dla C++.",
"label": "Modele heapu i dowód fragmentacji",
"learning_effects": [
"K05.EN01",
"K05.EK01"
],
"learning_tree": {
"schema": "we-learning-tree.v1",
"policy": "Każdy wniosek o pojemności wskazuje total, largest i stan bloków; każdy operator ma symbol ABI.",
"ogolne": [
{
"effect_ref": "K05.EN01",
"display": "EN LOCAL MEM.POLICY.01",
"source": "LOCAL",
"official": "MEM.POLICY",
"local": "01",
"kind": "EN",
"tree_id": "K05.WE01.OG.LOCAL.MEM.POLICY.01",
"text": "Dobiera model i interpretuje current, largest oraz minimum-ever.",
"kw": [
{
"criterion_ref": "K05.KW01",
"display": "KW LOCAL MEM.POLICY.01",
"source": "LOCAL",
"kind": "KW",
"official": "MEM.POLICY",
"local": "01",
"text": "Uzasadnia heap_1, heap_4 i heap_5 dla trzech scenariuszy oraz nie myli total z largest."
}
]
}
],
"zawodowe": [
{
"effect_ref": "K05.EK01",
"display": "EK LOCAL DBG.HEAP.01",
"source": "LOCAL",
"official": "DBG.HEAP",
"local": "01",
"kind": "EK",
"tree_id": "K05.WE01.TECH.LOCAL.DBG.HEAP.01",
"text": "Koreluje adresy, statystyki, nagłówki bloków i symbole new/delete.",
"kw": [
{
"criterion_ref": "K05.KW01",
"display": "KW LOCAL DBG.HEAP.01",
"source": "LOCAL",
"kind": "KW",
"official": "DBG.HEAP",
"local": "01",
"text": "Pokazuje failure, koalescencję, retry, 3/3/0 i historyczne minimum-ever."
}
]
}
]
}
}
},
"sections": [
{
"title": "Wybór heap_1--heap_5",
"content_kind": "prose",
"content_tex": "Porównaj możliwość free, koalescencję oraz źródło/regiony pamięci. Wybierz heap dla startup-only, jednej areny z delete i dwóch rozłącznych banków RAM.",
"educational_requirement_refs": [
"K05.WE01"
],
"learning_effect_refs": [
"K05.EN01"
],
"assessment_criterion_refs": [
"K05.KW01"
],
"area_tree_refs": [
"K05.WE01.OG.LOCAL.MEM.POLICY.01"
],
"steps": [
{
"id": "S01",
"title": "Uzasadnij heap_1, heap_4 i heap_5 dla trzech wdrożeń.",
"tree_refs": [
"K05.WE01.OG.LOCAL.MEM.POLICY.01"
]
},
{
"id": "S02",
"title": "Wyjaśnij zależność heap_3 od libc i linkera.",
"tree_refs": [
"K05.WE01.OG.LOCAL.MEM.POLICY.01"
]
}
]
},
{
"title": "Kompletny most C++",
"content_kind": "prose",
"content_tex": "Odszukaj scalar/array new oraz sized/unsized scalar/array delete. Zwykłe new jest fail-fast; raw pvPortMalloc pozostaje fallible.",
"educational_requirement_refs": [
"K05.WE01"
],
"learning_effect_refs": [
"K05.EK01"
],
"assessment_criterion_refs": [
"K05.KW01"
],
"area_tree_refs": [
"K05.WE01.TECH.LOCAL.DBG.HEAP.01"
],
"steps": [
{
"id": "S03",
"title": "Potwierdź sześć symboli alokacji/dealokacji w ELF.",
"tree_refs": [
"K05.WE01.TECH.LOCAL.DBG.HEAP.01"
]
},
{
"id": "S04",
"title": "Rozdziel fail-fast new od kontrolowanego raw probe.",
"tree_refs": [
"K05.WE01.TECH.LOCAL.DBG.HEAP.01"
]
}
]
},
{
"title": "Fragmentacja, koalescencja i retry",
"content_kind": "prose",
"content_tex": "Zwolnij A i C wokół żywego B. Udowodnij largest < request < total oraz failure. Zwolnij B i ponów identyczne żądanie po koalescencji.",
"educational_requirement_refs": [
"K05.WE01"
],
"learning_effect_refs": [
"K05.EK01"
],
"assessment_criterion_refs": [
"K05.KW01"
],
"area_tree_refs": [
"K05.WE01.TECH.LOCAL.DBG.HEAP.01"
],
"steps": [
{
"id": "S05",
"title": "Zapisz dwa free blocks oraz relację request między largest i total.",
"tree_refs": [
"K05.WE01.TECH.LOCAL.DBG.HEAP.01"
]
},
{
"id": "S06",
"title": "Pokaż jeden blok po free B i udany retry.",
"tree_refs": [
"K05.WE01.TECH.LOCAL.DBG.HEAP.01"
]
}
]
},
{
"title": "Watermark zachowuje historię",
"content_kind": "prose",
"content_tex": "Po finalnym free current wraca do baseline, ale minimum-ever pozostaje historycznym minimum. Wylicz peak = baseline - minimum-ever.",
"educational_requirement_refs": [
"K05.WE01"
],
"learning_effect_refs": [
"K05.EN01"
],
"assessment_criterion_refs": [
"K05.KW01"
],
"area_tree_refs": [
"K05.WE01.OG.LOCAL.MEM.POLICY.01"
],
"steps": [
{
"id": "S07",
"title": "Porównaj final current z minimum-ever i wylicz peak.",
"tree_refs": [
"K05.WE01.OG.LOCAL.MEM.POLICY.01"
]
}
]
}
],
"tasks": {
"task01": {
"title": "Fragmentacja, koalescencja i historyczny watermark",
"uuid": "c456b505-dc5c-4894-b832-bb4c5afd0feb",
"prompt_tex": "Wybierz model heapu, sprawdź most ABI, a następnie odtwórz siedem checkpointów i udowodnij failure mimo wystarczającej sumy free, udany retry po koalescencji oraz zachowanie minimum-ever.",
"criterion": "Sześć symboli; largest < request < total; failure bez success increment; jeden blok po free B; retry działa; 3/3/0; current=baseline; minimum-ever<current; pass=1.",
"educational_requirement_refs": [
"K05.WE01"
],
"learning_effect_refs": [
"K05.EN01",
"K05.EK01"
],
"assessment_criterion_ref": "K05.KW01",
"links": {
"equations": [],
"figures": []
}
}
},
"tasks_order": [
"task01"
]
}