chore: preserve current FreeRTOS and C card updates
This commit is contained in:
+39
-121
@@ -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 E01–E08 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 E01–E08.
|
||||
- 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 1–3;
|
||||
- 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.
|
||||
|
||||
Reference in New Issue
Block a user