실시간성 분석 — Latency·Jitter·Deadline·WCET·RMA
#한 줄 요약
“평균 아닌 worst-case가 답” — 평균이 빠른 시스템도 worst-case가 deadline을 넘기면 실패합니다.
#4 핵심 지표
#1. Latency
이벤트 발생에서 응답 시작까지의 시간입니다.
External event (IRQ) ─────→ ISR start ─────→ Task wake ─────→ Task code ↑ t=0 ISR latency wake latency response (수십 ns) (수 µs)| 구성 | 측정 |
|---|---|
| ISR latency | IRQ 발생 → ISR 첫 줄 |
| Scheduler latency | ISR 끝 → ready task 실행 |
| Wake latency | 모든 합 |
#2. Jitter
Latency의 변동성을 가리킵니다.
예 — 주기적 task가 매 ms마다 깨어야 한다고 합시다. 실제 깨어남이 1.000, 1.001, 0.998, 1.003, 0.997 … 로 분포한다면 Jitter = max - min = 6 µs입니다.
평균이 좋아도 jitter가 크면 예측이 불가능합니다. 실시간 제어(모터, 오디오)에 치명적입니다.
#3. Deadline
이벤트 후 반드시 처리해야 할 마감입니다.
| 종류 | Deadline miss 결과 |
|---|---|
| Hard | 시스템 실패 (자동차 ESC, 인공호흡기) |
| Firm | 결과 무효 (실시간 거래) |
| Soft | 품질 저하 (비디오 frame drop) |
#4. WCET — Worst-Case Execution Time
한 task가 최대 얼마나 걸리는지를 나타냅니다. 평균(AET)이 아닌 worst case가 중요합니다.
PID 실행 시간 분포 예
| 항목 | 값 |
|---|---|
| Average | 50 µs |
| Median | 48 µs |
| p99 | 70 µs |
| Max | 95 µs (WCET, 보장 가능 한계) |
#WCET 측정 — 4 방법
#1. Static Analysis
소스와 CPU 모델로 모든 path를 분석합니다. aiT, Bound-T 같은 상용 도구가 있습니다.
장점은 수학적 보장이 가능하다는 점입니다. 단점은 비싸고 setup이 복잡하다는 점입니다.
#2. Measurement-Based
많은 input을 넣어 실제 실행 시간을 측정합니다.
uint32_t start = DWT->CYCCNT;pid_compute();uint32_t cycles = DWT->CYCCNT - start;log_max(cycles); // p99·max 누적장점은 간단하다는 점입니다. 단점은 모든 path를 커버하지 못한다는 점입니다.
#3. Hybrid
Static analysis와 measurement를 결합합니다. Loop bound는 측정하고, 경로는 static으로 분석합니다.
#4. Probabilistic WCET (pWCET)
확률 분포로 표현합니다. 예를 들어 “99.999%로 80 µs 미만”과 같습니다. EVT(Extreme Value Theory)를 활용합니다.
#Schedulability — 모든 task가 deadline 만족할 수 있나
#Rate Monotonic Analysis (RMA)
Liu & Layland 1973 논문에서 출발했습니다.
- 각 task에 주기 inverse priority를 부여합니다(짧은 주기 = 높은 priority).
- Utilization bound는 다음과 같습니다.
U = Σ (Ci / Ti) ≤ n × (2^(1/n) − 1)n=1 → 1.0, n=2 → 0.828, n=∞ → 0.693.
| Task | Ci | Ti | Ci/Ti |
|---|---|---|---|
| PID | 0.5 ms | 1 ms | 0.50 |
| Sensor | 1 ms | 10 ms | 0.10 |
| Log | 2 ms | 50 ms | 0.04 |
| 합 = 0.64 |
n=3일 때 bound는 3×(2^(1/3)−1) ≈ 0.78입니다. 0.64 < 0.78이므로 schedulable합니다.
#Response Time Analysis (RTA)
더 정확한 분석 방법입니다. Iterative하게 계산합니다.
(deadline)이면 schedulable입니다.
💡 RTA는 utilization bound를 넘더라도 deadline 만족 여부를 정확하게 판정합니다. iterative하게 수렴시키는 방식입니다.
#Latency 원인 분석
#Source 1: Interrupt Disable
taskENTER_CRITICAL();// ... 50 µs worktaskEXIT_CRITICAL();이 경우 모든 ISR이 50 µs 지연됩니다. 최대 critical section 길이가 곧 ISR worst latency가 됩니다.
#Source 2: ISR Nesting
ISR_A 도중 ISR_B가 시작되면 A가 끝나야 B가 실행됩니다. NVIC priority를 잘 설정하면 nested 실행이 가능합니다(high prio가 low prio를 preempt).
#Source 3: Scheduler Decision
Tick ISR이 다음 task를 결정하는 데 N µs가 걸립니다. List가 크면 더 길어집니다. FreeRTOS는 약 100 cycles입니다.
#Source 4: Context Switch
Register save/restore에는 Cortex-M이 약 30 cycles 걸립니다. Cortex-A는 모드 전환과 MMU 때문에 수백 cycles입니다.
#Source 5: Cache Miss
새 task가 다른 working set을 갖고 있으면 L1 miss가 발생하고, DRAM access에 200 cycles 이상이 듭니다.
#Source 6: Bus Contention
DMA나 다른 master가 bus를 사용 중이면 CPU가 stall 됩니다.
#측정 — Cyclictest
Linux PREEMPT_RT의 표준 도구입니다.
$ cyclictest -p 80 -t 1 -i 1000 -l 100000# Min: 5 µs, Avg: 7 µs, Max: 23 µsMax 값이 worst-case wake latency입니다. Hard real-time이라면 이 값이 deadline 안에 들어와야 합니다.
#측정 — Bare-Metal
GPIO와 로직 분석기를 쓰거나 DWT를 활용합니다.
GPIO_SET(DEBUG_PIN);critical_section();GPIO_CLR(DEBUG_PIN);로직 분석기로 pulse width를 측정해 critical section의 worst-case를 얻습니다.
#실전 — Latency 예산 (Budget)
PID 1 ms 주기, deadline 1 ms
| 항목 | 시간 |
|---|---|
| ISR latency | 50 ns |
| Scheduler latency | 2 µs |
| Context switch | 3 µs |
| PID compute (WCET) | 95 µs |
| PID write actuator | 10 µs |
| Total worst-case | ~110 µs (= 11% of 1 ms) |
여유 89%로 안전합니다.
만약 log_uart()가 5 ms를 점유한다면 어떨까요? Log priority가 PID보다 낮으므로, PID가 깨면 즉시 preempt 됩니다. 영향이 없습니다(Preemptive RTOS의 가치).
#Test Cases
WCET를 측정할 때는 각 path를 모두 커버해야 합니다.
int process(int *data, int n) { if (n > MAX) return ERROR; // early return for (int i = 0; i < n; i++) { // loop bound depends on n if (data[i] == 0) continue; complex_op(data[i]); } return SUCCESS;}테스트 케이스:
n = 0(loop 0회)n = MAX(loop 최대)n > MAX(early return)data전부 0 vs 전부 nonzero (branch)
#Hard vs Soft 시스템 설계 차이
| Hard | Soft | |
|---|---|---|
| WCET 분석 | 필수 (인증) | 측정으로 충분 |
| 메모리 할당 | 정적·미리 | 동적 OK |
| OS | RTOS 또는 bare-metal | Linux + PREEMPT_RT 가능 |
| 인증 | DO-178C·ISO 26262 ASIL D | 없음 |
| 테스트 | MC/DC coverage | 일반 |
| 예시 | 비행기, 의료기기 | 비디오, 게임 |
#자주 하는 실수
⚠️ 평균만 보고 OK 판정
평균 latency가 10 µs라도 worst가 1 ms면 hard real-time은 실패합니다.
⚠️ 측정 환경 == 실제 환경 가정
벤치마크 환경에서는 빠르지만 실 운영에서는 cache, bus, thermal의 영향으로 느려질 수 있습니다. 실 환경에서 수일간 측정해야 합니다.
⚠️ Utilization 99% 목표
너무 빡빡합니다. 실제로는 jitter나 event burst로 deadline을 miss할 수 있습니다. RMS bound인 69%를 권장합니다.
⚠️ Critical section 길이 측정 안 함
taskENTER_CRITICAL 호출 패턴마다 worst-case time을 측정해야 합니다. 디버그 print가 critical 안에 있으면 수 ms까지 늘어날 수 있습니다.
#정리 — Part 1 마무리
- 4 지표는 Latency, Jitter, Deadline, WCET입니다.
- WCET가 hard real-time의 핵심이며, 평균이 아닌 worst가 중요합니다.
- RMS와 RTA로 schedulability를 수학적으로 증명할 수 있습니다.
- Latency 원인은 IRQ disable, ISR nesting, scheduler, context switch, cache, bus 등입니다.
- 측정 도구로는 Linux의
cyclictest, bare-metal의 DWT+GPIO가 있습니다. - Hard real-time은 정적 할당과 인증, WCET 분석이 함께 필요합니다.
Part 1(RTOS Fundamentals)이 끝났습니다. Part 2부터는 내부 구현을 다룹니다. 스케줄러 자료구조와 context switch 어셈블리가 주제입니다.
#관련 항목
Practical RTOS Internals · 11 of 53
- 1Practical RTOS Internals — 실시간 커널 내부 분석 시리즈 소개
- 2RTOS가 필요한 이유 — 일반 OS와의 결정적 차이
- 3Task와 Thread 개념 — TCB·상태 머신·생명 주기 분석
- 4실시간 스케줄링 알고리즘 비교 — RR·Priority·EDF·RMS
- 5Preemption과 Cooperation — 강제 전환 vs 자발 양보
- 6인터럽트와 RTOS — ISR Context·Deferred Processing·FromISR API
- 7동기화 기초 분석 — Critical Section·Mutual Exclusion·Race Condition
- 8Semaphore 개념 분해 — Counting·Binary·P/V 연산
- 9Mutex 개념 분해 — Ownership·Recursive·Priority Inheritance
- 10큐와 메시지 패싱 — Producer-Consumer·Ring Buffer·전달 의미
- 11실시간성 분석 — Latency·Jitter·Deadline·WCET·RMA
- 12Ready List 자료구조 분석 — Linked List·Bitmap·O(1) Scheduler
- 13Blocked List 자료구조 — Timeout 정렬·Delta List·Two-List Scheme
- 14Scheduler 알고리즘 구현 추적 — Next-Task Selection 로직
- 15Context Switch 원리 분석 — 레지스터 저장·복원·Stack Frame
- 16ARM Cortex-M Context Switch — PendSV·MSP/PSP 어셈블리 추적
- 17ARM Cortex-A Context Switch — Mode 전환·SVC·Banked Registers
- 18RISC-V Context Switch 분석 — ECALL·mret·CSR
- 19RTOS Tick과 타이머 — SysTick·Generic Timer·configTICK_RATE_HZ
- 20Tickless 모드 구현 — Idle Tick Suppression·Sleep·Wake 보정
- 21Scheduler Latency 측정 기법 — GPIO Toggle·DWT·ftrace·cyclictest
- 22RTOS Tracing과 Observability — Tracealyzer·SystemView·ITM/ETM
- 23Critical Section 구현 비교 — IRQ Disable·BASEPRI·Spinlock
- 24Semaphore 내부 구현 추적 — Counter·Wait List·ISR-Safe Variant
- 25Mutex 내부 구현 추적 — Owner·Recursion Count·ISR 금지
- 26Priority Inversion 문제 — Mars Pathfinder 사례·Bounded vs Unbounded
- 27Priority Inheritance 구현 — Inherit·Disinherit·Chain
- 28Priority Ceiling Protocol — Immediate vs Original 비교
- 29Queue 내부 구현 추적 — Ring Buffer·2 Wait Lists·Atomic Send/Receive
- 30Event Group 분석 — Bit Flag·AND/OR Wait·Sync Barrier
- 31ISR-Safe API 설계 — FromISR 패턴·Higher Priority Wake·Deferred Work
- 32Deadlock 분석 — 4 조건·Wait-for Graph·Lock Ordering·Timeout
- 33Stream Buffer와 Message Buffer — FreeRTOS 10의 Lock-Free SPSC
- 34실시간 메모리 요구사항 — Determinism·Fragmentation·WCET
- 35FreeRTOS Heap_1~5 분석 — 5종 Allocator의 구조와 트레이드오프
- 36TLSF Allocator 분석 — Two-Level Segregated Fit O(1)
- 37Static Allocation — 컴파일 타임으로 동적 위험 제거하기
- 38Memory Pool — Fixed-Size Block Allocator의 단순함과 강력함
- 39Stack Overflow 탐지 — Canary·MPU·Watermark 3중 방어
- 40SMP RTOS 설계 — Ready List·Affinity·IPI·Load Balancing
- 41SMP Spinlock 구현 — LDREX/STREX·Ticket Lock·MCS·WFE/SEV
- 42Software Timer 분석 — Daemon Task·자료구조·ISR-Safe API
- 43RTOS System Call — SVC·ECALL·User/Kernel 분리·FreeRTOS-MPU
- 44TrustZone과 TF-M — Secure/Non-Secure·NSC Veneer·PSA
- 45AMP와 OpenAMP — Heterogeneous SoC·RPMsg·remoteproc
- 46C++ in RTOS — RAII·std::thread·ETL·Coroutine
- 47FreeRTOS 소스 분석 — tasks.c·queue.c·port.c 추적
- 48Zephyr 커널 분석 — k_thread·k_sem·Driver Model
- 49RT-Thread 분석 — Object 모델·Components·Smart·Studio
- 50RTOS 포팅 가이드 — 새 아키텍처에 옮기는 절차
- 51RTOS 선택 가이드 — Footprint·License·Certification·Ecosystem
- 52Apache NuttX 분석 — POSIX·PX4·NASA Ingenuity
- 53PREEMPT_RT Linux — Mainline 6.12·Xenomai 4·EVL
관련 글
실시간 메모리 요구사항 — Determinism·Fragmentation·WCET
동적 할당의 한계와 fragmentation, WCET-bounded allocator, safety-critical 기준을 살펴봅니다.
Scheduler Latency 측정 기법 — GPIO Toggle·DWT·ftrace·cyclictest
ISR 종료 → ready task 실행까지의 시간. 측정 방법과 worst-case 추적.
RTOS가 필요한 이유 — 일반 OS와의 결정적 차이
Super-loop는 모든 작업이 직렬화되어 deadline을 보장하지 못합니다. RTOS는 preemption과 우선순위로 실시간성을 확보합니다.
이 글을 참조하는 글 (6)
- Scheduler Latency 측정 기법 — GPIO Toggle·DWT·ftrace·cyclictest— Practical RTOS Internals
- 큐와 메시지 패싱 — Producer-Consumer·Ring Buffer·전달 의미— Practical RTOS Internals
- 실시간 스케줄링 알고리즘 비교 — RR·Priority·EDF·RMS— Practical RTOS Internals
- RTOS가 필요한 이유 — 일반 OS와의 결정적 차이— Practical RTOS Internals
- 실시간 성능 분석 — WCET·Jitter·Deadline Miss 측정— Embedded Performance Engineering
- WCET 분석 기법 — Static·Measurement·Hybrid 방법론— Modern Embedded Recipes