chore: preserve current FreeRTOS and C card updates
This commit is contained in:
+26
-14
@@ -64,8 +64,8 @@ Przed wejściem uczniów:
|
||||
|
||||
1. zbuduj Task 3 dla `pico2_w` / RP2350 RISC-V;
|
||||
2. wgraj zweryfikowany obraz i otwórz sesję na tym samym ELF;
|
||||
3. ustaw pierwszy breakpoint na `heap4_fragmented_checkpoint`;
|
||||
4. przygotuj widok `ucHeap`, `g_fragmented_stats`, `g_final_stats`,
|
||||
3. ustaw pierwszy breakpoint na `heap4_reset_checkpoint`;
|
||||
4. przygotuj widok `ucHeap`, statystyk E01--E08,
|
||||
`xFreeBytesRemaining` i `xMinimumEverFreeBytesRemaining`;
|
||||
5. przygotuj Hazard3 jako awaryjny zamiennik — podczas lekcji użyj jednej
|
||||
platformy, nigdy obu.
|
||||
@@ -81,7 +81,7 @@ sprzętowym heapem ani peryferium RP2350.
|
||||
| 3–4 min | kontekst | Jedno zdanie: FreeRTOS dostarcza wymienne implementacje tego samego API; ta karta i oficjalne przykłady Pico 2 W linkują `heap_4`. |
|
||||
| 4–9 min | Task 1 — demo | Do żądania dodaj nagłówek, wyrównaj rozmiar, wybierz pierwszy pasujący blok i podziel go. Uczeń zapisuje `wanted` i `remainder` przed odsłonięciem wyniku. |
|
||||
| 9–16 min | Task 2 — demo | Dla `A:48 | B:48 | C:48` pokaż listę `A -> C`, wstaw `B` po adresie i sprawdź scalenie w prawo oraz w lewo: `2 bloki / 96 B / largest 48 B -> 1 blok / 144 B / largest 144 B`. |
|
||||
| 16–27 min | Task 3 — RUN | Na przygotowanym Pico 2 W przejdź przez prawdziwy `heap_4.c`: trzy alokacje, free A i C, checkpoint z dwoma blokami, free B, checkpoint z jednym blokiem, OOM=`NULL` i jeden malloc-failed hook. Uczeń wypełnia tabelę relacji. |
|
||||
| 16–27 min | Task 3 — RUN | Na przygotowanym celu przejdź przez osiem checkpointów prawdziwego `heap_4.c`: reset, trzy alokacje, free A, free C, free B i kontrolowany OOM. Uczeń wypełnia tabelę relacji. |
|
||||
| 27–30 min | wyjście | Uczeń wymienia trzy dodatki ponad K&R (`header`, `free list`, `coalescing`) i wyjaśnia: suma wolnych bajtów może być większa od największego bloku, a minimum-ever nie rośnie po `free`. |
|
||||
|
||||
## Task 1 — model nagłówka i splitu
|
||||
@@ -112,8 +112,8 @@ free list: A --------------------------------> C
|
||||
|
||||
vPortFree(B)
|
||||
1. wstaw B pomiędzy A i C według adresu;
|
||||
2. jeśli end(B) == addr(C), połącz B+C;
|
||||
3. jeśli end(A) == addr(BC), połącz A+BC;
|
||||
2. jeśli end(A) == addr(B), połącz A+B;
|
||||
3. jeśli end(AB) == addr(C), połącz AB+C;
|
||||
|
||||
wynik: [ ABC:144 FREE ]
|
||||
free list: A -> END
|
||||
@@ -126,26 +126,32 @@ Uczeń przed odsłonięciem rysuje listę i wpisuje `2 -> 1`, `96 -> 144` oraz
|
||||
|
||||
```text
|
||||
RESET/INIT
|
||||
-> heap4_reset_checkpoint # E01: 4080 B
|
||||
-> ALLOC A(24)
|
||||
-> heap4_alloc_a_checkpoint # E02: 4032 B
|
||||
-> ALLOC B(40)
|
||||
-> heap4_alloc_b_checkpoint # E03: 3968 B
|
||||
-> ALLOC C(16)
|
||||
-> heap4_alloc_c_checkpoint # E04: 3936 B
|
||||
-> FREE A
|
||||
-> heap4_free_a_checkpoint # E05: 3984 B, 2 bloki
|
||||
-> FREE C
|
||||
-> heap4_fragmented_checkpoint # 2 free blocks
|
||||
-> heap4_fragmented_checkpoint # E06: 4016 B, 2 bloki
|
||||
-> FREE B
|
||||
-> heap4_coalesced_checkpoint # E07: 4080 B, 1 blok
|
||||
-> OOM request
|
||||
-> task03_debug_checkpoint # 1 free block, pass=1
|
||||
-> task03_debug_checkpoint # E08: NULL, hook=1, pass=1
|
||||
```
|
||||
|
||||
Uczeń zapisuje tylko relacje, ponieważ dokładne bajty zależą od ABI i
|
||||
konfiguracji:
|
||||
Na Hazard3 `sizeof(BlockLink_t)=8`, ale `portBYTE_ALIGNMENT=16`, dlatego
|
||||
`xHeapStructSize=16`. Główny replay ma stałe, testowane wartości:
|
||||
|
||||
| Obserwacja | Oczekiwany związek |
|
||||
| Obserwacja | Oczekiwany wynik RV32/Hazard3 |
|
||||
| --- | --- |
|
||||
| po trzech alokacjach | `after_allocations < initial_free` |
|
||||
| stan pofragmentowany | `free_blocks == 2`, `largest < total_free` |
|
||||
| po `free(B)` | `final_free == initial_free`, `free_blocks == 1` |
|
||||
| low-water mark | `minimum_ever <= after_allocations` i nie rośnie po free |
|
||||
| E01--E04 | `4080 -> 4032 -> 3968 -> 3936`, zużycie `48/64/32` |
|
||||
| E05--E06 | `3984 -> 4016`, nadal 2 bloki i `largest < total_free` |
|
||||
| E07 | `final_free == initial_free == 4080`, `free_blocks == 1` |
|
||||
| low-water mark | `minimum_ever == 3936` i nie rośnie po free |
|
||||
| OOM | wynik `NULL`, hook `1`, brak uszkodzenia listy |
|
||||
|
||||
Minimalny dowód w GDB:
|
||||
@@ -153,6 +159,9 @@ Minimalny dowód w GDB:
|
||||
```gdb
|
||||
p g_fragmented_stats
|
||||
p g_final_stats
|
||||
p g_a_consumed
|
||||
p g_b_consumed
|
||||
p g_c_consumed
|
||||
p xFreeBytesRemaining
|
||||
p xMinimumEverFreeBytesRemaining
|
||||
p xStart
|
||||
@@ -160,6 +169,9 @@ p pxEnd
|
||||
x/96bx ucHeap
|
||||
```
|
||||
|
||||
Szczegółowe mapowanie wszystkich diagramów do kodu, replay i dowodów zawiera
|
||||
[`hazard3-iteration-plan.md`](hazard3-iteration-plan.md).
|
||||
|
||||
## Kryterium zaliczenia
|
||||
|
||||
Uczeń zalicza lekcję, jeżeli:
|
||||
|
||||
Reference in New Issue
Block a user