본문으로 건너뛰기
Series · 53 posts

Practical RTOS Internals

affinity allocator amp and-or architecture arm assembly atomic avoidance banked-registers basepri binary bit-flag bitmap blocked-list bottom-half bounded callback callee-saved caller-saved canary clz comparison components context-switch cooperative coroutine cortex-a cortex-m cortex-m33 counter counting cpp critical-section csr cyclictest daemon deadline deadlock deadlock-free deferred delta-list detection determinism deterministic device-model devicetree dijkstra disinherit do-178c dwt ecall edf embedded etl etm event-group evl finsh fixed-size fragmentation free-list freertos freertos-mpu fromisr ftrace gpio heap heterogeneous higher-priority hw-timer imx ingenuity inherit integrity ipc ipi irq-disable isr isr-safe itm jitter k_thread latency ldrex lifecycle linked-list linker linux load-balancing lock-count lock-free lock-ordering low-power mars-pathfinder mcs measurement memory mepc message-buffer message-passing microkernel misra mmu mode mpu mret mscratch msp multicore mutex mutual-exclusion next-task nuttx o1 observability openamp owner ownership pcp pendsv pi pool port port-c porting posix preempt-rt preemption priority priority-ceiling priority-inheritance priority-inversion privilege producer-consumer psa psp pv px4 pxcurrenttcb qnx queue race-condition raii ready-list real-time-linux realtime recursion recursive register remoteproc ring-buffer risc-v riscv rma rms rpmsg rr rt-thread rtos scheduler secure-boot security selection semaphore slab sleep smart smp software-timer source-analysis spinlock spsc stack-frame stack-overflow state-machine static std-mutex std-thread stm32mp stream-buffer strex super-loop suppress-tick svc sync sync-barrier syscall systemview systick task tasks tcb tf-m tick tick-wraparound ticket-lock tickless time-slice timeout timer-wheel tlsf tracealyzer tracing trustzone unbounded vxworks wait-list watermark wcet wfi xenomai yield zephyr
practical-internals 53
1

Practical RTOS Internals — 실시간 커널 내부 분석 시리즈 소개

RTOS를 사용하는 것이 아니라 이해하고 구현하는 법. Scheduler, context switch, memory allocator의 내부 동작을 소스 코드 수준에서 분석합니다.

2

RTOS가 필요한 이유 — 일반 OS와의 결정적 차이

Super-loop는 모든 작업이 직렬화되어 deadline을 보장하지 못합니다. RTOS는 preemption과 우선순위로 실시간성을 확보합니다.

3

Task와 Thread 개념 — TCB·상태 머신·생명 주기 분석

Task는 stack과 TCB, 상태로 구성됩니다. 5상태 머신(Running·Ready·Blocked·Suspended·Deleted)과 그 전이를 다룹니다.

4

실시간 스케줄링 알고리즘 비교 — RR·Priority·EDF·RMS

Round Robin, Priority-based preemptive, Earliest Deadline First, Rate Monotonic을 다룹니다. 임베디드 RTOS는 대부분 fixed-priority preemptive를 씁니다.

5

Preemption과 Cooperation — 강제 전환 vs 자발 양보

Preemptive는 tick과 IRQ에서 강제로 전환합니다. Cooperative는 yield를 명시해야 합니다. latency와 predictability의 trade-off를 다룹니다.

6

인터럽트와 RTOS — ISR Context·Deferred Processing·FromISR API

ISR은 task가 아니므로 context도 따로 관리됩니다. Long work는 deferred task로 넘기고, FromISR API 패턴을 씁니다.

7

동기화 기초 분석 — Critical Section·Mutual Exclusion·Race Condition

공유 자원 보호의 3가지 도구로 interrupt disable, spinlock, mutex가 있습니다. 언제 어느 것을 쓰는지 정리합니다.

8

Semaphore 개념 분해 — Counting·Binary·P/V 연산

Dijkstra의 P/V(1965)에서 출발한 Counting(N 자원)과 Binary(신호) 세마포어를 다룹니다. ISR에서 task로 신호를 전달하는 표준 도구입니다.

9

Mutex 개념 분해 — Ownership·Recursive·Priority Inheritance

공유 자원 보호의 정답입니다. Owner tracking 덕에 PI가 가능하고, recursive로 재진입도 허용합니다.

10

큐와 메시지 패싱 — Producer-Consumer·Ring Buffer·전달 의미

Task 간 데이터 전달의 표준입니다. FreeRTOS는 by-value copy이며, 대용량은 pointer queue로 처리합니다.

11

실시간성 분석 — Latency·Jitter·Deadline·WCET·RMA

4 핵심 지표인 Latency, Jitter, Deadline, WCET를 다룹니다. Hard와 Soft real-time의 차이, Rate Monotonic Analysis로 schedulability를 증명하는 방법을 살펴봅니다.

12

Ready List 자료구조 분석 — Linked List·Bitmap·O(1) Scheduler

Ready 상태 task를 보관하는 자료구조 선택이 곧 스케줄러 latency를 결정합니다. FreeRTOS의 array-of-lists, bitmap + CLZ 최적화, uC/OS의 8×8 LUT까지 한 번에 정리합니다.

13

Blocked List 자료구조 — Timeout 정렬·Delta List·Two-List Scheme

Blocked task의 timeout 관리. Sorted list + tick wraparound 처리. FreeRTOS의 2-list scheme.

14

Scheduler 알고리즘 구현 추적 — Next-Task Selection 로직

FreeRTOS pxCurrentTCB 결정. CLZ 최적화, tie-breaking, scheduler entry points.

15

Context Switch 원리 분석 — 레지스터 저장·복원·Stack Frame

Context switch는 결국 CPU의 모든 가시 상태를 task 스택에 통째로 복제하는 일입니다. 어디서 발생하고, 무엇을 저장하고, 비용은 얼마인지 아키텍처 중립적으로 정리합니다.

16

ARM Cortex-M Context Switch — PendSV·MSP/PSP 어셈블리 추적

Cortex-M context switch는 PendSV 예외와 dual-stack 모델로 압축됩니다. FreeRTOS port의 PendSV 핸들러 어셈블리를 한 줄씩 따라가며 EXC_RETURN, BASEPRI, lazy FPU까지 풀어봅니다.

17

ARM Cortex-A Context Switch — Mode 전환·SVC·Banked Registers

Cortex-A의 7 모드와 모드별 banked register. 모드 간 SP·LR 별도 — Cortex-M보다 복잡.

18

RISC-V Context Switch 분석 — ECALL·mret·CSR

RISC-V는 모든 레지스터 SW save. ECALL/mret + CSR (mscratch/mepc/mcause/mstatus).

19

RTOS Tick과 타이머 — SysTick·Generic Timer·configTICK_RATE_HZ

RTOS의 심장 박동. SysTick 1 kHz가 표준 — Hz 선택의 trade-off.

20

Tickless 모드 구현 — Idle Tick Suppression·Sleep·Wake 보정

Idle 시 SysTick 멈춤 + CPU sleep. 다음 task wake 시점까지 동적 timer 설정. 배터리 IoT 핵심.

21

Scheduler Latency 측정 기법 — GPIO Toggle·DWT·ftrace·cyclictest

ISR 종료 → ready task 실행까지의 시간. 측정 방법과 worst-case 추적.

22

RTOS Tracing과 Observability — Tracealyzer·SystemView·ITM/ETM

Percepio Tracealyzer와 Segger SystemView, Cortex-M의 ITM/ETM 하드웨어 트레이스. Task switch·ISR·queue·mutex 이벤트를 시간축에 펼쳐 인과를 추적합니다.

23

Critical Section 구현 비교 — IRQ Disable·BASEPRI·Spinlock

3 가지 구현 — cpsid/BASEPRI mask, taskENTER_CRITICAL, SMP spinlock. Hold time이 latency 결정.

24

Semaphore 내부 구현 추적 — Counter·Wait List·ISR-Safe Variant

FreeRTOS semaphore = Queue wrapper. Counter + priority-sorted wait list.

25

Mutex 내부 구현 추적 — Owner·Recursion Count·ISR 금지

Mutex = Semaphore + pxMutexHolder + uxBasePriority. Recursive variant는 lock-count.

26

Priority Inversion 문제 — Mars Pathfinder 사례·Bounded vs Unbounded

고우선 task가 저우선 task 때문에 막힘. 1997 화성 탐사선 reset의 원인.

27

Priority Inheritance 구현 — Inherit·Disinherit·Chain

FreeRTOS PI 코드 분석 — vTaskPriorityInherit, vTaskPriorityDisinherit, chain handling.

28

Priority Ceiling Protocol — Immediate vs Original 비교

PI의 대안. 각 mutex에 정적 ceiling — take 즉시 boost. Deadlock 방지.

29

Queue 내부 구현 추적 — Ring Buffer·2 Wait Lists·Atomic Send/Receive

FreeRTOS Queue 코드 — pcWriteTo·pcReadFrom·uxMessagesWaiting + xTasksWaitingToSend/Receive.

30

Event Group 분석 — Bit Flag·AND/OR Wait·Sync Barrier

FreeRTOS Event Group — 24-bit flag, AND·OR semantics, clear-on-exit, multi-task sync.

31

ISR-Safe API 설계 — FromISR 패턴·Higher Priority Wake·Deferred Work

FromISR API 내부 구조와 pxHigherPriorityTaskWoken, yield 결정, deferred work 패턴을 정리합니다.

32

Deadlock 분석 — 4 조건·Wait-for Graph·Lock Ordering·Timeout

Coffman의 네 조건과 wait-for graph 분석, lock ordering, timeout, hierarchical locking을 살펴봅니다.

33

Stream Buffer와 Message Buffer — FreeRTOS 10의 Lock-Free SPSC

FreeRTOS 10+ 추가된 Stream/Message Buffer. Lock-free SPSC ring buffer로 queue보다 10배 빠른 IPC. ISR-safe variant, byte stream vs variable-length frame의 선택.

34

실시간 메모리 요구사항 — Determinism·Fragmentation·WCET

동적 할당의 한계와 fragmentation, WCET-bounded allocator, safety-critical 기준을 살펴봅니다.

35

FreeRTOS Heap_1~5 분석 — 5종 Allocator의 구조와 트레이드오프

FreeRTOS가 제공하는 다섯 가지 heap 구현을 source 수준에서 비교합니다. heap_1의 bump부터 heap_5의 multi-region까지, 실시간성과 단편화 관점에서 어떤 워크로드에 어떤 구현이 맞는지 정리합니다.

36

TLSF Allocator 분석 — Two-Level Segregated Fit O(1)

Masmano 2004의 TLSF 알고리즘을 풀어봅니다. Bitmap과 CLZ 명령으로 alloc·free·coalesce 모두 O(1)을 보장하며, 자동차·로봇·RT 게임의 표준 dynamic allocator가 된 이유를 살펴봅니다.

37

Static Allocation — 컴파일 타임으로 동적 위험 제거하기

모든 RTOS 객체를 컴파일 타임에 fixed로 두는 패턴입니다. FreeRTOS Static API, Zephyr 매크로, linker section 배치, MISRA/DO-178C 호환성까지 정리합니다.

38

Memory Pool — Fixed-Size Block Allocator의 단순함과 강력함

같은 크기 객체를 다수 alloc/free하는 패턴을 위한 fixed-size pool입니다. free list 구조, O(1) 보장, per-class pool, lock-free 변형까지 실전 패턴을 정리합니다.

39

Stack Overflow 탐지 — Canary·MPU·Watermark 3중 방어

임베디드 가장 흔한 silent bug가 스택 오버플로우입니다. FreeRTOS canary, MPU region 기반 hardware 보호, high-water mark 측정, 정적 분석 도구까지 다층 방어 전략을 정리합니다.

40

SMP RTOS 설계 — Ready List·Affinity·IPI·Load Balancing

FreeRTOS 11 SMP와 Zephyr SMP를 단일 ready list와 per-CPU ready list 두 축으로 비교합니다. task affinity, IPI, cross-core wake, cache coherency 경계까지 설계 관점에서 정리합니다.

41

SMP Spinlock 구현 — LDREX/STREX·Ticket Lock·MCS·WFE/SEV

ARM LDREX/STREX exclusive monitor와 ARMv8.1 LSE를 출발점으로 SMP spinlock 구현을 따라갑니다. test-and-test-and-set, ticket lock, MCS lock의 fairness와 cache bouncing trade-off, WFE/SEV로 만드는 저전력 spin을 정리합니다.

42

Software Timer 분석 — Daemon Task·자료구조·ISR-Safe API

FreeRTOS Software Timer 내부를 따라가며 daemon task 구조, sorted list와 timer wheel 자료구조, one-shot/auto-reload 동작, xTimerStartFromISR과 xTimerPendFunctionCall을 통한 ISR 워크 deferral을 정리합니다.

43

RTOS System Call — SVC·ECALL·User/Kernel 분리·FreeRTOS-MPU

MPU/MMU로 user task와 kernel을 분리하는 RTOS의 syscall 구조를 정리합니다. Cortex-M의 SVC trap, RISC-V의 ECALL, FreeRTOS-MPU와 Zephyr USERSPACE의 차이, capability 검사, syscall overhead 측정까지 다룹니다.

44

TrustZone과 TF-M — Secure/Non-Secure·NSC Veneer·PSA

Cortex-M33/M55/M85의 TrustZone-M과 TF-M secure firmware를 정리합니다. SAU/IDAU로 메모리를 secure/non-secure로 가르고, NSC veneer + SG 명령으로 안전하게 cross-world call을 수행하는 구조, PSA Crypto/Storage/Attestation API, secure boot chain까지 다룹니다.

45

AMP와 OpenAMP — Heterogeneous SoC·RPMsg·remoteproc

Cortex-A와 Cortex-M이 한 칩 위에서 별도의 OS를 돌리는 AMP 구조를 정리합니다. OpenAMP framework(libmetal/RPMsg/remoteproc), virtio-vring 기반 shared memory IPC, mailbox 인터럽트, i.MX·STM32MP·RP2350 사례까지 다룹니다.

46

C++ in RTOS — RAII·std::thread·ETL·Coroutine

RTOS C API를 C++ 객체로 감싸는 패턴을 정리합니다. RAII MutexGuard와 ScopedIRQDisable, std::thread/std::mutex의 한계와 직접 xTaskCreate가 결정성을 갖는 이유, ETL로 STL을 대체하는 법, C++20 coroutine을 RTOS 위에 얹는 방식까지 다룹니다.

47

FreeRTOS 소스 분석 — tasks.c·queue.c·port.c 추적

FreeRTOS-Kernel 저장소의 핵심 파일 셋을 따라가며 xTaskCreate부터 PendSV까지의 흐름을 정리합니다. TCB·ready list·port 계층 사이의 경계가 어떻게 그어져 있는지 source 수준에서 살펴봅니다.

48

Zephyr 커널 분석 — k_thread·k_sem·Driver Model

Zephyr 커널 서브트리를 따라가며 sched.c·thread.c·sem.c의 핵심을 읽습니다. devicetree로 드라이버 인스턴스가 만들어지는 경로와 KConfig·west 빌드 체계까지 한 지도 위에 모읍니다.

49

RT-Thread 분석 — Object 모델·Components·Smart·Studio

RT-Thread의 object-oriented C 설계와 component 생태계를 따라갑니다. FreeRTOS급 경량 kernel 위에 DFS·LwIP·POSIX·FinSH가 어떻게 얹히는지, Smart variant가 무엇을 더 가져오는지 정리합니다.

50

RTOS 포팅 가이드 — 새 아키텍처에 옮기는 절차

FreeRTOS와 Zephyr의 port 계층을 따라가며 새 아키텍처에 RTOS를 옮기는 절차를 정리합니다. initial stack frame, context switch assembly, tick source, critical section primitive까지 한 번에 잡습니다.

51

RTOS 선택 가이드 — Footprint·License·Certification·Ecosystem

FreeRTOS·Zephyr·ThreadX·RT-Thread·NuttX·VxWorks·QNX·INTEGRITY·SafeRTOS·µC/OS·PX5를 한 표에 모아 비교합니다. IoT·자동차·항공·산업·의료·웨어러블·드론별 추천과 결정 기준을 정리합니다.

52

Apache NuttX 분석 — POSIX·PX4·NASA Ingenuity

NuttX의 POSIX-compliant 구조를 따라가며 PX4 autopilot과 NASA Ingenuity 화성 헬리콥터 채택 배경을 정리합니다. Flat/Protected/Kernel 빌드, VFS, 네트워크, NSH, micro-ROS 통합까지 한 지도로 모읍니다.

53

PREEMPT_RT Linux — Mainline 6.12·Xenomai 4·EVL

2024년 9월 Linux 6.12 mainline에 합류한 PREEMPT_RT의 핵심 변경을 정리하고, Xenomai 4·EVL과 함께 RTOS와의 선택 기준을 비교합니다. threaded IRQ·sleeping spinlock·cyclictest까지 한 지도에 모읍니다.