들어가며
학부 때 ESP32로 재활 자전거 IoT 모니터링 시스템을 만들고, 석사에서는 Tinker Board 2S와 STM32를 써서 HBOT 챔버 제어 시스템을 구축했다. 그 과정에서 꽤 다양한 것들을 다뤘다.
근데 기술 스택을 쌓는 데 집중하다 보면 정작 가장 기본적인 개념들이 흐릿해지기 마련이다.
그래서 지금까지 해온 것들의 기반이 되는 기초 개념들을 처음부터 다시 정리해보기로 했다. 당연하게 써왔던 것들의 의미를 되짚어보는 시리즈다.
임베디드 시스템이란?
임베디드 시스템(Embedded System) 은 특수한 목적을 위해 설계된 컴퓨터 시스템이다.
범용 PC는 웹 브라우징, 게임, 영상 편집 등 다양한 작업을 수행할 수 있다. 반면 임베디드 시스템은 처음부터 정해진 기능만 수행하도록 설계된다.
우리 주변에서 임베디드 시스템을 찾는 건 어렵지 않다.
- 세탁기 제어 보드
- 자동차 ECU
- 산업용 로봇 제어기
- 의료기기
펌웨어란?
펌웨어(Firmware) 는 특정 하드웨어에 종속되어, 임베디드 시스템에서 동작하는 프로그램이다. 더 정확히는 하드웨어를 직접 제어하는 가장 낮은 단계의 소프트웨어라고 할 수 있다.
“Firm” — 단단하다는 뜻이다. Software처럼 자유롭게 바꿀 수 있는 것도 아니고, Hardware처럼 완전히 고정된 것도 아닌, 그 중간 어딘가에 위치한다. 실제로 펌웨어 업데이트는 앱 업데이트처럼 주기적으로 일어나지 않고, 버그가 발생하거나 기능 변경이 필요할 때만 이루어진다. 옛날 게임 카트리지나 일부 산업용 MCU처럼 아예 업데이트 자체가 불가능한 경우도 있다.
펌웨어 vs 일반 애플리케이션
카카오톡은 갤럭시에서도, 아이폰에서도 동작한다. 하드웨어가 달라도 문제없다.
반면 STM32용 펌웨어를 ESP32에 그대로 올리면? 부팅조차 안 된다.
이유는 간단하다. STM32는 ARM Cortex-M 코어, ESP32는 Xtensa LX6 코어다. CPU 아키텍처가 다르면 명령어 체계(ISA, Instruction Set Architecture)가 달라지기 때문에, 같은 C 코드라도 컴파일된 기계어가 전혀 다르다. 여기에 레지스터 구조, Endianness, Memory Map까지 다르기 때문에 펌웨어는 특정 하드웨어에 완전히 종속될 수밖에 없다.
| 구분 | 펌웨어 | 일반 애플리케이션 |
|---|---|---|
| 하드웨어 종속성 | 특정 하드웨어에 종속 | 하드웨어 독립적 |
| 실행 위치 | 임베디드 시스템 | 범용 OS 위 |
| 업데이트 빈도 | 버그 발생 시에만 | 주기적으로 자주 |
| 예시 | STM32 GPIO 제어 코드 | 카카오톡, 크롬 |
펌웨어는 항상 OS 없이 동작할까?
그렇지 않다. 펌웨어도 OS 위에서 동작하는 경우가 있다.
- Bare-metal: OS 없이 직접 하드웨어를 제어. 단순한 제어 로직에 적합하다.
- RTOS 기반: FreeRTOS 같은 real-time OS 위에서 동작. task 우선순위, resource 관리가 필요한 경우 사용한다.
실시간(Real-Time) 요구사항이 있는 경우, 즉 정해진 시간 내에 반드시 동작해야 하는 경우엔 RTOS가 필요하다. FreeRTOS는 deterministic — 실행 시간을 예측 가능하게 보장한다는 점에서 일반 리눅스와 다르다.
실시간 요구사항은 엄격함의 정도에 따라 두 가지로 나뉜다.
- Hard Real-Time: 데드라인을 단 한 번이라도 어기면 시스템 전체가 실패한 것으로 간주된다. 자동차 에어백 제어, 심장 박동기 같은 안전-critical 시스템이 여기에 해당한다.
- Soft Real-Time: 데드라인을 가끔 어겨도 성능이 저하될 뿐 치명적이지 않다. 영상 스트리밍, 게임 렌더링 등이 대표적이다.
내 HBOT 챔버 제어 시스템의 경우, 압력과 산소 농도를 일정 주기로 안정적으로 제어해야 했기 때문에 real-time 요구사항이 있었다.
MCU / DSP / FPGA 비교
임베디드 시스템을 구성하는 핵심 하드웨어는 크게 세 가지로 나뉜다.
MCU (Microcontroller Unit)
이미 만들어진 CPU 코어 + 주변장치(GPIO, UART, SPI 등)가 하나의 칩에 통합된 형태다. 코드를 작성하면 CPU가 명령어를 순서대로 실행한다.
범용 제어에 적합하고 개발이 쉽다. STM32, ESP32, ATmega가 대표적이다.
DSP (Digital Signal Processor)
신호처리에 특화된 프로세서다. 오디오, 통신, 레이더 신호처리 등에 사용된다. MCU처럼 순차처리 방식이지만 신호처리 연산(FIR 필터, FFT 등)에 최적화된 하드웨어 구조를 갖는다.
FPGA (Field Programmable Gate Array)
MCU, DSP와 근본적으로 다르다. 엄밀히 말하면 FPGA는 “회로를 만든다"기보다 Logic Gates들의 연결(Routing)을 재설정하는 방식으로 동작한다. 이 특성을 Reconfigurability 라고 부른다.
MCU는 내가 짠 코드를 CPU가 순서대로 실행하는 방식이다. FPGA는 HDL(Hardware Description Language)로 회로를 기술하면 내부 Logic Gates의 연결이 그에 맞게 재구성된다.
덕분에 병렬처리(parallel processing) 가 가능하다. 수천 개의 픽셀을 동시에 처리해야 하는 영상처리, 초고속 통신 프로토콜 처리 등에서 MCU보다 압도적으로 유리하다.
단점은 명확하다. 개발 난이도가 높고 비용이 비싸다. STM32에서 UART 하나 구현하는 건 레지스터 몇 개 설정하면 끝이지만, FPGA에서는 UART 회로 자체를 만들어야 한다.
| 구분 | MCU | DSP | FPGA |
|---|---|---|---|
| 처리 방식 | sequential | sequential | parallel |
| 특화 분야 | 범용 제어 | signal processing | 고속 parallel processing |
| 개발 난이도 | 낮음 | 중간 | 높음 |
| 비용 | 저렴 | 중간 | 비쌈 |
| 예시 | STM32, ESP32 | TI C6000 | Xilinx, Altera |
언제 뭘 쓸까?
내 석사 연구인 HBOT 챔버 제어 시스템은 PID 제어, 센서 데이터 읽기, 통신 처리 정도의 작업이 전부였다. 병렬처리가 필요할 만큼 고속의 데이터 스트림이 아니었기 때문에 MCU(Tinker Board 2S + STM32)를 선택했다. 개발 효율과 비용 면에서도 MCU가 최적이었다.
정리
- 임베디드 시스템 = 특수한 목적을 가지고 동작하는 시스템
- 펌웨어 = 특정 하드웨어에 종속되어 임베디드 시스템에서 동작하는 프로그램
- 임베디드가 큰 범위, 펌웨어는 그 안에서 동작하는 소프트웨어 영역
- MCU(범용 제어), DSP(신호처리), FPGA(병렬처리) — 목적에 맞게 선택한다
다음 편에서는 STM32의 메모리 구조(Flash, RAM, Stack, Heap)를 정리한다.