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 참고자료
'TIL > Firmware' 카테고리의 다른 글
[펌웨어] 시리얼데이터와 MQTT (0) | 2025.06.01 |
---|---|
[펌웨어] 시리얼 데이터 수신하고 로깅하기(Python) (0) | 2025.06.01 |
[펌웨어] 시리얼 명령 처리 흐름이란? (0) | 2025.06.01 |
[펌웨어] 구조체와 포인터는 왜 중요한가 (0) | 2025.05.27 |