feat: rebuild heap4 card around upstream FreeRTOS allocator

This commit is contained in:
user
2026-07-14 23:24:56 +02:00
parent 032a06fdef
commit 2b17bb4ff9
41 changed files with 1462 additions and 2138 deletions
+57 -61
View File
@@ -1,73 +1,69 @@
# rv32i-freertos / heap4
# Karta pracy: FreeRTOS `heap_4`
Karta pracy `01/14` z serii `rv32i-freertos`; jest opcjonalnym fundamentem L1.
Trzy krótkie zadania po kartach `pointers` i `structures`:
Temat: mechanika alokatora `heap_4.c` z FreeRTOS-a na małych przykładach
uruchamianych w środowisku RV32I.
1. first-fit + split na arenie 256 B;
2. lista adresowa + scalanie `A | B | C`;
3. niezmodyfikowany FreeRTOS-Kernel V11.3.0 `heap_4.c`.
Ta karta jest pomostem po kartach C: używa wskaźników, struktur, listy
jednokierunkowej, `static`, `typedef`, makr i arytmetyki adresów, ale nie
wymaga jeszcze schedulera, tasków ani przerwań.
Task 3 linkuje upstream `portable/MemMang/heap_4.c` z commita
`9b777ae5c5b8e9e456065a00294d1e5f5f9facf5`.
Kod w `src/tasks` jest dydaktycznym modelem zachowania `heap_4`, a nie kopią
pliku upstream FreeRTOS.
- AMD64: rzeczywisty algorytm + jednowątkowy adapter sekcji krytycznej.
- Hazard3: `tasks.c`, `list.c`, `heap_4.c` i oficjalny port RISC-V.
- RP2350: zgodny core+port z forka Raspberry Pi (`4f7299d6ea74`) oraz
podstawiony stabilny allocator V11.3.0.
## Taski
- `task01_heap_map.c` - mapa pojęć: sterta, blok, nagłówek bloku.
- `task02_free_list.c` - lista wolnych bloków.
- `task03_heap_init.c` - inicjalizacja sterty i wartownik końca listy.
- `task04_alignment.c` - wyrównanie rozmiarów i adresów.
- `task05_malloc_first_fit.c` - pierwszy pasujący wolny blok.
- `task06_split_block.c` - podział większego bloku.
- `task07_free_insert.c` - zwracanie bloku na listę wolnych.
- `task08_coalescing.c` - scalanie sąsiednich wolnych bloków.
- `task09_config_macros.c` - makra konfiguracyjne i warunkowy `printf`.
- `task10_heap4_demo.c` - mini-demonstracja `malloc/free` bez pełnego RTOS-a.
Hostowe `printf` jest dostępne tylko przez `-DHOST_PRINTF=1`; RV32I zapisuje
wyniki w globalnych zmiennych `volatile`.
## Gałęzie zadań
Gałąź `deploy` jest pełną publiczną wersją karty. Każde zadanie ma osobną
gałąź startową `tasks/*`, na przykład `tasks/05-malloc-first-fit`. Taka gałąź
nie jest wycinkiem repozytorium: zawiera dokumentację, treść karty, `Makefile`,
kod pomocniczy i pliki danego zadania.
Uczeń nie commituje bezpośrednio do `tasks/*`. W repozytorium klasy tworzy
gałąź pochodną, na przykład `students/u01/tasks/05-malloc-first-fit`.
## Powiązanie z FreeRTOS Book v1.1.0
To jest opcjonalna karta `K01` z
[mapy serii](../README.md). Jej źródłem pojęciowym jest rozdział 3 książki
*Mastering the FreeRTOS Real Time Kernel*, przede wszystkim sekcja 3.2.4 o
`heap_4` oraz rysunki 3.13.4. Rozdział o heapie nie ma numerowanego programu
z zestawu `Example001``Example025`, dlatego karta rozkłada mechanikę
alokatora na własne, krótsze eksperymenty:
- Taski 0103 odtwarzają mapę bloku, wolną listę i inicjalizację heapu;
- Taski 0408 izolują wyrównanie, first-fit, podział, wstawianie i scalanie;
- Task 09 łączy konfigurację z sekcjami 3.1.33.1.5;
- Task 10 składa te elementy w jeden model zachowania `heap_4`.
Karta nie jest kopią upstreamowego `heap_4.c` ani listingów książki. Jest
modelem dydaktycznym, po którym karta `K02` przechodzi na prawdziwy plik
`portable/MemMang/heap_4.c` z FreeRTOS V11.3.0.
## Budowanie
## Jedno wejście: `stemctl`
```bash
RV_ENV_ROOT=~/dev/workspace/rv/tools/rv32i-hazard3-student-env make tasks
make host
stemctl series cards fetch freertos heap4
stemctl test native-amd64 freertos heap4 1
stemctl test hazard3-sim freertos heap4 2
stemctl debug hazard3-sim freertos heap4 3
stemctl test rp2350 freertos heap4 3
stemctl deploy rp2350 freertos heap4 3 --device /dev/bus/usb/BBB/DDD
stemctl debug rp2350 freertos heap4 3 --device /dev/bus/usb/BBB/DDD
```
## Praca przez rvctl
- `debug rp2350`: roboczy ELF `no_flash` ładowany do SRAM.
- `deploy rp2350`: trwały obraz w SPI flash, odczytany przez breakpointy.
## Kontrakt zadań
| Task | Sprawdza | Wynik kluczowy |
|---|---|---|
| 1 | alignment, header, split | `wanted + remainder == 256` |
| 2 | lista po adresie, coalescing | `2 bloki -> 1 blok`, `96 -> 144 B` |
| 3 | prawdziwe API FreeRTOS | free wraca do F0, minimum nie rośnie, OOM = NULL |
## Debugowanie Task 3
Automatyczny start: `heap4_fragmented_checkpoint`.
```gdb
p g_fragmented_stats
p g_final_stats
p xFreeBytesRemaining
p xMinimumEverFreeBytesRemaining
p xStart
p pxEnd
x/160bx ucHeap
b prvInsertBlockIntoFreeList
b pvPortMalloc
b vPortFree
```
W UI: Termdebug po lewej; źródło i listing po prawej; bash pod Neovimem.
`F5` continue, `F9` breakpoint, `F10` next, `F11` step, `Shift-F11`
finish, `F8` stepi, `:StudentStack`, `:StudentMemory`, `:StudentLst`.
## Test repozytorium
```bash
./rvctl series cards fetch inf heap4
./rvctl card use inf heap4
./rvctl tasks list
./rvctl debug rv32i 1
./tests/test_host.sh
bash -n tools/card-action.sh
./scripts/render_pdf.sh
```
Źródło i licencja: [UPSTREAM.md](UPSTREAM.md).