chore: preserve current FreeRTOS and C card updates

This commit is contained in:
user
2026-07-21 19:14:19 +02:00
parent 4785d506fc
commit 10a8be72e3
37 changed files with 2857 additions and 1571 deletions
+39 -121
View File
@@ -1,133 +1,51 @@
# K01 `heap4` — punkt zatrzymania
# FC01 `heap_4` — stan weryfikacji
## Stan repozytorium
## Stan na 2026-07-20
- Data: `2026-07-14`.
- Commit bazowy: `8aee0b104c4f6e6ffef119ab6f57a3e724144221`.
- Gałąź robocza: `work/list-first-rp2350-debug`.
- Zmienione źródła: brak.
- Zmieniona karta PDF: brak.
- Lokalny stan `.stem/`: wygenerowany przez testy `stemctl`, nie jest częścią karty.
- Review Claude: nieukończony; dwie sesje CLI nie zwróciły wyniku i zostały zatrzymane.
Karta ma jeden centralny eksperyment na niezmodyfikowanym
`heap_4.c` z FreeRTOS-Kernel V11.3.0. Przebieg jest podzielony na osiem
deterministycznych checkpointów E01E08 i działa na RV32I/Hazard3.
## Potwierdzone
## Potwierdzone na Hazard3
- [x] `make host` buduje 10/10 programów.
- [x] Wszystkie programy hostowe uruchamiają się z kodem `0`.
- [x] `make tasks RV_ENV_ROOT=...` buduje 10/10 ELF dla RV32I.
- [x] `stemctl test native-amd64 freertos heap4 10` przechodzi.
- [x] RP2350 Probe jest wykrywany bez `sudo` po wejściu do grupy `rpdebug`.
- [x] OpenOCD wykrywa `rp2350.rv0` i `rp2350.rv1`.
- [x] Oba rdzenie raportują `XLEN=32`.
- [ ] Nie wykonano testu programu K01 na RTL Hazard3.
- [ ] Nie wgrano programu K01 na fizyczny RP2350.
| Event | Stan | Dowód |
|---|---|---|
| E01 | arena po inicjalizacji | `free=largest=4080`, 1 blok |
| E02 | `alloc A(24)` | zużyto 48, zostało 4032 |
| E03 | `alloc B(40)` | zużyto 64, zostało 3968 |
| E04 | `alloc C(16)` | zużyto 32, zostało 3936 |
| E05 | `free(A)` | 3984, 2 wolne bloki |
| E06 | `free(C)` | 4016, 2 bloki, `free > largest` |
| E07 | `free(B)` | `free=largest=4080`, 1 blok |
| E08 | kontrolowany OOM | `NULL`, hook=1, asserts=0, PASS=1 |
## Wyniki bazowe — host AMD64
Na RV32 `sizeof(BlockLink_t) == 8`, ale `portBYTE_ALIGNMENT == 16`, więc
prywatne `xHeapStructSize == 16`. To wyjaśnia zużycie 48/64/32 bajtów.
| Task | Wynik |
|---|---|
| 01 | `header=16 aligned=16 allocated=1 total=32 user=16` |
| 02 | `free=136 largest=80 count=3` |
| 03 | `offset=0 free=144 end_last=1` |
| 04 | `r1=24 r9=32 r17=40 delta=7` |
| 05 | `ok=1 allocated=120 remaining=0` |
| 06 | `allocated=48 split=128 nodes=1` |
| 07 | `order=1 count=3 total=120` |
| 08 | `count=1 size=160 merged_right=1` |
| 09 | `heap=256 adjusted=248 dynamic=1 host_trace=1` |
| 10 | `ok=1 nodes=1 free=240 min=144` |
## Diagramy i iteracja
## Braki P0
- A1 CONTEXT: pięć kroków CODE — granice odpowiedzialności.
- A2 STRUCTURE: jeden krok CODE i pięć kroków RUN — nagłówek, split,
lista adresowa oraz scalenie lewego i prawego sąsiada.
- A5 FLOW: osiem kroków RUN mapowanych 1:1 na E01E08.
- A6 STATE: pięć reprezentatywnych stanów E01, E04, E06, E07 i E08.
- A7 RUNTIME: tożsamość źródła/ELF, pamięć `ucHeap` i końcowy werdykt.
- A3, A4 i A8 są jawnie pominięte, ponieważ dublowałyby A2/A5.
- [ ] Dodać `stem-card.yaml`.
- [ ] Obsłużyć targety:
- [ ] `native` / `native-amd64`;
- [ ] `hazard3-baremetal` / `hazard3-sim`;
- [ ] `rp2350-rv` / fizyczny Hazard3.
- [ ] Naprawić `stemctl test hazard3-sim freertos heap4 10`.
- Stan obecny: `Legacy Hazard3 card/task is unsupported`.
- [ ] Dodać asercje wyniku.
- Stan obecny: każdy `main()` zwraca `0` niezależnie od wartości `g_*`.
- [ ] Dodać automatyczne porównanie wyników AMD64 i RV32.
- [ ] Dodać bezpieczne sprawdzanie przepełnienia rozmiaru żądania.
- [ ] Sprawdzić wyrównanie buforów używanych jako `HeapBlock`.
- [ ] Nie dereferencjonować wyniku alokacji przed sprawdzeniem `p != NULL`.
Szczegółowa kolejność komend, obserwacji i kryteriów znajduje się w
[`hazard3-iteration-plan.md`](hazard3-iteration-plan.md).
## Braki debug
## Wykonane testy
- [ ] K10: dodać jawne checkpointy:
- [ ] `INIT`;
- [ ] `ALLOC_A`;
- [ ] `ALLOC_B`;
- [ ] `FREE_A`;
- [ ] `ALLOC_C`;
- [ ] `ALLOC_REJECTED`;
- [ ] `FREE_B`;
- [ ] `FREE_C`;
- [ ] `DONE`.
- [ ] K10: zapisywać przy checkpointcie:
- [ ] numer zdarzenia;
- [ ] adres bloku;
- [ ] liczbę wolnych bloków;
- [ ] sumę wolnej pamięci;
- [ ] minimum wolnej pamięci;
- [ ] status `RUNNING/PASS/FAIL`.
- [ ] Simulator:
- [ ] breakpoint na funkcji checkpointu;
- [ ] inspekcja listy i pamięci;
- [ ] bez obiecywania watchpointów — szybki stub obsługuje obecnie breakpointy wykonania.
- [ ] RP2350:
- [ ] OpenOCD `target/rp2350-riscv.cfg`;
- [ ] breakpoint `main`;
- [ ] sprzętowy watchpoint na numerze zdarzenia/statusie;
- [ ] porównanie adresów i wyników z symulatorem;
- [ ] Termdebug i DAP na tym samym ELF.
- testy hostowe Task 13;
- budowa RV32I i kontrola symboli ELF;
- Hazard3 RTL: zakończenie kodem 0 po 27308 cyklach;
- osiem checkpointów obecnych w ELF;
- walidacja JSON i odwołań `code_ref`/`snapshot_ref`;
- kontrola PlantUML, SVG, HTML, TeX i siedmiostronicowego PDF;
- TypeScript/React typecheck generatora.
## Braki materiału
- [ ] Zmniejszyć udział prozy.
- [ ] Zastąpić akapity:
- [ ] listami kontrolnymi;
- [ ] tabelami wartości;
- [ ] komendami do skopiowania;
- [ ] punktami zatrzymania GDB;
- [ ] kryteriami zaliczenia.
- [ ] Szablon każdego taska:
- [ ] `Cel` — maksymalnie 3 punkty;
- [ ] `Uruchom` — komendy;
- [ ] `Zatrzymaj` — breakpoint/watchpoint;
- [ ] `Obserwuj` — symbole i pamięć;
- [ ] `Oczekuj` — wartości host/RV32;
- [ ] `Zmień` — jeden eksperyment;
- [ ] `Zaliczenie` — mierzalna checklista.
- [ ] Przenieść pełne listingi C/ASM do dodatku.
- [ ] Pierwsze strony PDF przeznaczyć na kartę prowadzącego i przebieg lekcji.
## Kolejność wznowienia K01
1. Zamknąć wymagania w bezpośrednim poprzedniku `inf/structures`.
2. Dodać testy wyniku do K01.
3. Dodać kontrakt `stem-card.yaml`.
4. Uruchomić 10/10 tasków na Hazard3 RTL.
5. Dodać checkpointy K10.
6. Zbudować K10 dla `rp2350-rv`.
7. Wgrać i debugować K10 przez JTAG.
8. Przebudować README/PDF do formatu list-first.
9. Wykonać końcowy review techniczny i dydaktyczny.
## Bezpośredni poprzednik
- Seria: `inf`.
- Karta: `structures`.
- Repozytorium: `lab-rv32i-c-structures`.
- Przejście wymagane przed K01:
- [ ] `struct` i `typedef`;
- [ ] struktura samoreferencyjna;
- [ ] pole `next`;
- [ ] przejście po liście;
- [ ] wstawianie elementu;
- [ ] wartownik;
- [ ] `sizeof`, padding i wyrównanie na AMD64/RV32;
- [ ] niezmienniki listy;
- [ ] obserwacja w GDB.
## Pozostaje poza zakresem tej iteracji
- próba na fizycznym RP2350/Pico 2 W;
- commit i publikacja — wymagają osobnego polecenia.