본문 바로가기
Embedded Program

펌웨어 (Firmware) 란?

by rlawnsghtest 2025. 2. 3.

펌웨어 란?

오늘은 펌웨어 개발 입문자를 위한 필수 개념 정리를 해보려고 합니다. 펌웨어는 현대 전자기기에서 매우 중요한 역할을 하고 있습니다. 그렇다면 펌웨어란 무엇인지, 그 정의와 역할에 대해 알아보겠습니다.

 

펌웨어는 하드웨어와 소프트웨어의 중간에 위치하는 소프트웨어입니다. 일반적으로 하드웨어에 내장되어 있으며, 하드웨어의 동작을 제어하고 관리하는 역할을 합니다. 예를 들어, 스마트폰의 카메라 모듈이나 가전제품의 제어 보드에 내장된 소프트웨어가 펌웨어입니다. 이러한 펌웨어는 하드웨어의 기능을 최적화하고, 사용자와 하드웨어 간의 인터페이스를 제공합니다.

 

펌웨어는 하드웨어의 성능을 극대화하고, 특정 기능을 수행하기 위해 설계됩니다. 예를 들어, IoT 기기에서는 센서 데이터를 수집하고, 이를 클라우드로 전송하는 기능을 수행하는 펌웨어가 필요합니다. 이러한 펌웨어는 기기의 작동을 안정적으로 유지하고, 업데이트를 통해 새로운 기능을 추가할 수 있습니다.

 

소프트웨어 vs 하드웨어 vs 펌웨어 비교

소프트웨어, 하드웨어, 펌웨어는 모두 전자기기에서 중요한 역할을 하지만, 그 기능과 위치는 다릅니다. 소프트웨어는 일반적으로 컴퓨터나 스마트폰에서 실행되는 프로그램을 의미하며, 사용자가 직접 설치하고 업데이트할 수 있습니다. 반면, 하드웨어는 물리적인 장치로, 컴퓨터의 CPU, 메모리, 저장장치 등이 이에 해당합니다.

 

펌웨어는 하드웨어에 내장된 소프트웨어로, 하드웨어의 동작을 제어합니다. 소프트웨어는 사용자가 직접 조작할 수 있지만, 펌웨어는 하드웨어에 내장되어 있어 사용자가 직접 수정하기 어렵습니다. 이러한 차이점은 펌웨어가 하드웨어의 성능을 최적화하는 데 중요한 역할을 한다는 것을 의미합니다.

 

펌웨어가 실행되는 환경

펌웨어는 주로 MCU(Microcontroller Unit), MPU(Microprocessor Unit), 임베디드 시스템에서 실행됩니다. MCU는 소형 컴퓨터로, 특정 작업을 수행하기 위해 설계된 장치입니다. 예를 들어, 가전제품의 제어 보드나 IoT 기기에서 사용됩니다. MPU는 더 복잡한 작업을 수행할 수 있는 프로세서로, 일반적으로 컴퓨터나 스마트폰에서 사용됩니다.

임베디드 시스템은 특정 기능을 수행하기 위해 설계된 시스템으로, 펌웨어가 내장되어 있습니다. 이러한 시스템은 다양한 분야에서 사용되며, 자동차, 의료기기, 가전제품 등에서 찾아볼 수 있습니다. 펌웨어는 이러한 시스템의 핵심 요소로, 하드웨어와 소프트웨어 간의 원활한 통신을 보장합니다.

 

펌웨어가 실행되는 환경은 크게 임베디드 시스템과 마이크로컨트롤러(MCU), 그리고 운영체제 여부에 따라 나뉩니다. 각각의 환경을 예제와 함께 설명해보겠습니다.

(1) 베어메탈 환경 (Bare Metal)

운영체제 없이 직접 하드웨어를 제어하는 환경입니다. MCU에 펌웨어가 직접 로드되어 실행되며, 태스크 스케줄링은 개발자가 직접 구현해야 합니다.

예제: 간단한 MCU 기반 LED 제어

  • 하드웨어: STM32, ATmega328P(Arduino), PIC, ESP8266 등
  • 펌웨어 역할: 전원을 켜면 LED를 점멸시키는 코드가 실행됨.
  • 코드 예제 (C, STM32 HAL 사용)
#include "stm32f4xx.h"

void delay(int time) {
    for (volatile int i = 0; i < time * 1000; i++);
}

int main() {
    RCC->AHB1ENR |= (1 << 3);   // GPIOD 클럭 활성화
    GPIOD->MODER |= (1 << 26);  // PD13을 출력 모드로 설정

    while (1) {
        GPIOD->ODR ^= (1 << 13); // PD13 토글 (LED 깜빡임)
        delay(500);
    }
}

 

특징:

  • 운영체제가 없고 단순한 동작 수행
  • 실시간 반응이 필요할 때 유용
  • 메모리와 CPU 자원이 제한적

(2) RTOS(Real-Time Operating System) 기반 환경

FreeRTOS, Zephyr, RTX 같은 실시간 운영체제를 활용하여 태스크를 스케줄링하는 방식입니다. 베어메탈 환경과 달리 멀티태스킹을 지원합니다.

예제: FreeRTOS 기반 멀티태스킹 LED 제어

  • 하드웨어: ESP32, STM32F4, Texas Instruments TM4C
  • 펌웨어 역할: LED를 제어하는 태스크와 UART(시리얼 통신) 태스크를 동시에 실행.
  • 코드 예제 (FreeRTOS 사용)
#include "FreeRTOS.h"
#include "task.h"
#include "stm32f4xx.h"

void vLEDTask(void *pvParameters) {
    while (1) {
        GPIOD->ODR ^= (1 << 13); // LED 토글
        vTaskDelay(pdMS_TO_TICKS(500));
    }
}

void vUARTTask(void *pvParameters) {
    while (1) {
        printf("Hello, FreeRTOS!\n");
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

int main(void) {
    xTaskCreate(vLEDTask, "LED Task", 128, NULL, 1, NULL);
    xTaskCreate(vUARTTask, "UART Task", 128, NULL, 1, NULL);
    vTaskStartScheduler();
}

 

특징:

  • 태스크 기반으로 동작하여 여러 기능을 동시에 수행 가능
  • 실시간성을 제공하며, 인터럽트 및 우선순위 조정이 가능
  • RAM, Flash 사용량이 베어메탈보다 많음

(3) 리눅스 기반 임베디드 환경

리눅스 커널 위에서 펌웨어가 실행되는 방식으로, 주로 고성능 임베디드 시스템에서 사용됩니다. 예를 들어 라즈베리파이(Raspberry Pi)나 BeagleBone 같은 보드에서 동작하는 펌웨어가 있습니다.

예제: 리눅스에서 GPIO 제어 (C, Raspberry Pi)

  • 하드웨어: Raspberry Pi, BeagleBone, NVIDIA Jetson
  • 펌웨어 역할: GPIO를 통해 LED를 제어하는 펌웨어
  • 코드 예제 (C, 라즈베리파이에서 실행)
#include 
#include 

#define LED_PIN 0

int main() {
    wiringPiSetup();
    pinMode(LED_PIN, OUTPUT);

    while (1) {
        digitalWrite(LED_PIN, HIGH);
        delay(500);
        digitalWrite(LED_PIN, LOW);
        delay(500);
    }

    return 0;
}

 

특징:

  • 멀티태스킹과 다양한 프로세스를 실행 가능
  • 파일 시스템과 네트워크 기능을 사용할 수 있음
  • 부팅 속도가 상대적으로 느림

펌웨어 실행환경 비교

베어메탈 STM32, ATmega328P 운영체제 없이 단순 실행 LED 깜빡이기
RTOS ESP32, STM32F4 멀티태스킹 지원, 실시간 성능 LED + UART
리눅스 Raspberry Pi, Jetson 파일 시스템 및 네트워크 지원 GPIO 제어

 

펌웨어 개발자는 어떤 환경으로 개발을 해야 할까를 생각하고 사용 가능한 CPU 또는 MPU를 선택할 수 있어야 하겠습니다.

  • 하드웨어가 제한적이고 단순한 동작이면? → 베어메탈
  • 멀티태스킹이 필요하고 실시간 동작이 중요하면?   RTOS
  • 파일 시스템, 네트워크, 멀티프로세스가 필요하면?   리눅스 기반

펌웨어 개발을 위한 필수 프로그래밍 언어

펌웨어 개발에는 다양한 프로그래밍 언어가 사용됩니다. 가장 일반적으로 사용되는 언어는 C 언어입니다. C 언어는 하드웨어와 가까운 수준에서 프로그래밍할 수 있어, 펌웨어 개발에 적합합니다. 또한, C++와 어셈블리 언어도 펌웨어 개발에 사용될 수 있습니다. C++는 객체 지향 프로그래밍을 지원하여, 복잡한 시스템을 효율적으로 관리할 수 있습니다.

펌웨어 개발을 위해서는 개발 환경을 설정하는 것이 중요합니다. 통합 개발 환경(IDE)을 설치하고, 필요한 라이브러리와 툴체인을 구성해야 합니다. 예를 들어, 아두이노와 같은 플랫폼을 사용할 경우, 아두이노 IDE를 설치하여 펌웨어를 개발할 수 있습니다.

 

다음 글은 "어떤 칩이 나에게 맞을까?" 를 주제로 작성해 보겠습니다.