Karta pracy: FreeRTOS heap_4

Trzy programy wspierające kartę po K&R 5.4 oraz structures:

  1. nagłówek, wyrównanie i geometria splitu na arenie 256 B;
  2. lista adresowa + scalanie A | B | C;
  3. niezmodyfikowany FreeRTOS-Kernel V11.3.0 heap_4.c.

W lekcji 30-minutowej programy 12 są demonstracjami z predykcją. Uczeń debugguje wyłącznie program 3.

Task 3 linkuje upstream portable/MemMang/heap_4.c z commita 9b777ae5c5b8e9e456065a00294d1e5f5f9facf5.

  • 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.

Bezpośrednia kontynuacja K&R 5.4

Lekcja zaczyna się od gotowego projektu z poprzedniej karty: allocbuf[64], allocp, alloc(5), alloc(7) oraz offsety 0 -> 5 -> 12. Ten alokator:

  • nie potrafi zwolnić pierwszego bloku i zachować drugiego;
  • nie przechowuje rozmiaru ani stanu zwróconego obszaru;
  • nie zapamiętuje i nie wykorzystuje dziur;
  • odzyskuje pamięć wyłącznie przez reset całej areny.

FC01 odpowiada na jedno pytanie projektowe: co trzeba dodać, aby zwalniać dowolny blok i ponownie wykorzystywać powstałe miejsce? Odpowiedzią jest mechanika heap_4: nagłówek bloku, lista wolnych bloków uporządkowana po adresie, first-fit, split oraz scalanie fizycznych sąsiadów.

FreeRTOS udostępnia kilka wymiennych implementacji tego samego API i projekt linkuje dokładnie jedną. heap_1, heap_2, heap_3 i heap_5 są w tej karcie tylko jednominutową mapą kontekstu. Cała obserwowana implementacja to niezmodyfikowany heap_4.c z FreeRTOS-Kernel V11.3.0.

Lekcja trwa 30 minut. Task 1 i Task 2 są krótkimi demonstracjami z predykcją; Task 3 jest jedynym centralnym przebiegiem ucznia w debuggerze. Obraz dla Pico 2 W musi być zbudowany i wgrany przed zajęciami. heap_4 jest wyborem linkera projektu, nie sprzętowym mechanizmem RP2350.

Jedno wejście: stemctl

Centralny przebieg lekcji, przygotowany przed wejściem uczniów:

stemctl debug rp2350 freertos heap4 3 --device /dev/bus/usb/BBB/DDD

Pełna weryfikacja repozytorium wykonywana poza 30-minutową lekcją:

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
  • 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.

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

./tests/test_host.sh
bash -n tools/card-action.sh
./scripts/render_pdf.sh

Źródło i licencja: UPSTREAM.md.

S
Description
FC01 — heap_1–heap_5 and heap_4 mechanics
Readme 3.2 MiB
Languages
Shell 37.7%
C 35.8%
Makefile 12.5%
CMake 11.1%
Assembly 1.9%
Other 1%