Task Stack Structure
|---------------------| ← SP (PSP) → Software context
| R4 |
| R5 |
| R6 |
| R7 |
| R8 |
| R9 |
| R10 |
| R11 |
|---------------------|
| R0 | ← HW context (자동 저장/복원)
| R1 |
| R2 |
| R3 |
| R12 |
| LR (return addr) |
| PC |
| xPSR |
|---------------------|
Architecture Diagram
┌──────────────────────────────┐
│ MAIN │
│ (entrypoint, init, start) │
└────────────┬─────────────────┘
│
▼
┌──────────────────────────────┐
│ BOARD LAYER │
│ HAL: GPIO Init, Read, Write │
│ Implements: Syscalls │
└────────────┬─────────────────┘
│
Register Syscalls + Init
│
▼
┌──────────────────────────────┐
│ SVC │
│ Syscall Client Interface │
│ SVCall Exception Handler │
│ Dispatch Table (Syscalls) │
└────────────┬─────────────────┘
│
▼
┌──────────────────────────────┐
│ SCHEDULER │
│ - Task Stack Setup │
│ - Context Switching │
│ - PendSV & SysTick Handler │
└───────┬───────────────┬──────┘
│ │
▼ ▼
┌──────────────┐ ┌──────────────┐
│ Task 0 │ │ Task 1 │
│ LED ON loop │ │ sleep_ms │
└──────────────┘ └──────────────┘
│
▼
┌──────────────┐
│ Task 2 │
│ now_ms loop │
└──────────────┘
Flow Example
[SysTick interrupt]
↓
[MSP → PendSV]
↓
[asm: Save r4-r11 to PSP]
↓
[Rust: Save PSP to TCB, Load next PSP]
↓
[asm: Load r4-r11 from next PSP, set PSP]
↓
[bx lr or bx 0xFFFFFFFD]
↓
[HW context restore, task resumes]
Switch timing
| 시점 | 모드 | 스택 | 주체 | 역할 |
| --------- | ------------ | --- | --- | ----------------------- |
| SysTick | Privileged | MSP | 커널 | PendSV 요청 |
| PendSV 진입 | Privileged | MSP | 커널 | Context Save |
| Rust 진입 | Privileged | MSP | 커널 | PSP 계산 |
| 태스크 복귀 | Unprivileged | PSP | 태스크 | Resume from saved state |