본문 바로가기
  • Masacorgi 's Dev Bloggg
TIL/Firmware

[펌웨어] 펌웨어 구조 : Main Loop, 인터럽트

by masacorgi 2025. 5. 27.

1. 펌웨어 구조란?

펌웨어는 MCU 위에서 동작하며, 센서 데이터를 읽고 처리하고 외부로 전송하는 역할을 한다.
이 구조를 이해하면 펌웨어 흐름 분석과 수정에 한 걸음 가까워진다.


1.1 main loop 중심 구조

펌웨어는 대부분 while(1) 구조의 메인 루프 안에서 반복적으로 특정 작업을 수행한다.

1.1.1 Arduino 예제

// LED를 0.5초 간격으로 깜빡이게 하는 기본 구조

void setup() {
  pinMode(13, OUTPUT);  // 핀 13번을 출력으로 설정 (내장 LED)
}

void loop() {
  digitalWrite(13, HIGH); // LED ON
  delay(500);             // 0.5초 대기
  digitalWrite(13, LOW);  // LED OFF
  delay(500);             // 다시 0.5초 대기
}

1.1.2 STM32 HAL 예제

int main(void)
{
  HAL_Init();              // HAL 라이브러리 초기화
  SystemClock_Config();    // 시스템 클럭 설정
  MX_GPIO_Init();          // GPIO 설정

  while (1) {
    HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // GPIO 상태 반전 (LED 토글)
    HAL_Delay(500);                        // 0.5초 대기
  }
}

1.2 인터럽트 기반 구조

일정 조건에서 즉시 처리해야 하는 이벤트는 인터럽트로 처리한다.

1.2.1 Arduino 인터럽트 예제

// 버튼을 누르면 인터럽트가 발생해 LED를 한번 깜빡이는 구조

volatile bool buttonPressed = false;

void setup() {
  pinMode(2, INPUT_PULLUP);  // 입력 + 내부 풀업
  pinMode(13, OUTPUT);       // 출력 (LED)
  attachInterrupt(digitalPinToInterrupt(2), handleInterrupt, FALLING); // 버튼 눌림 감지
}

void loop() {
  if (buttonPressed) {
    digitalWrite(13, HIGH);  // LED ON
    delay(500);
    digitalWrite(13, LOW);   // LED OFF
    buttonPressed = false;   // 처리 완료 후 초기화
  }
}

void handleInterrupt() {
  buttonPressed = true;      // 인터럽트에서 플래그만 설정
}

1.3 폴링 vs 인터럽트 비교

폴링루프에서 상태 검사구조 단순CPU 낭비 가능
인터럽트이벤트 발생 시 반응반응 빠름코드 복잡해짐

1.4 상태 머신 구조

복잡한 펌웨어는 상태 기반 분기로 흐름을 제어한다.

// 측정 → 전송 → 대기 반복 흐름

enum State { IDLE, READING, SENDING };
State current = IDLE;

while (1) {
  switch(current) {
    case IDLE:
      current = READING;
      break;
    case READING:
      측정();           // 센서값 읽기
      current = SENDING;
      break;
    case SENDING:
      전송();           // 데이터 전송
      current = IDLE;
      break;
  }
}

1.6 참고자료