feat: rebuild heap4 card around upstream FreeRTOS allocator
This commit is contained in:
@@ -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.1–3.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 01–03 odtwarzają mapę bloku, wolną listę i inicjalizację heapu;
|
||||
- Taski 04–08 izolują wyrównanie, first-fit, podział, wstawianie i scalanie;
|
||||
- Task 09 łączy konfigurację z sekcjami 3.1.3–3.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).
|
||||
|
||||
Reference in New Issue
Block a user