임베디드를 공부하다 보면 한동안 실력이 늘지 않는 것처럼 느껴지는 구간이 옵니다. GPIO 예제는 따라 했고 UART도 한 번 찍어봤는데, 타이머와 인터럽트가 섞이거나 센서와 회로가 붙으면 갑자기 막힙니다. 검색해서 코드를 붙여 넣으면 그 순간은 동작하지만, 조금만 조건이 바뀌면 다시 처음부터 헤매게 됩니다.
이 정체감은 게으름 때문만은 아닙니다. 임베디드는 개념이 늦게 연결되는 분야입니다. C언어, MCU 레지스터, 클럭, 전원, 신호, 센서, 통신, 측정 장비가 따로 공부될 때는 조각처럼 보입니다. 그런데 작은 프로젝트를 끝까지 해보면 이 조각들이 하나의 흐름으로 붙습니다. 그래서 임베디드 실력은 직선보다 계단에 가깝습니다.
예제만 많이 따라 하면 연결이 늦게 생깁니다
예제 코드는 시작점으로 좋습니다. 하지만 예제만 바꿔가며 실행하면 문제를 스스로 정의하는 힘이 늦게 생깁니다. LED blink, UART echo, timer interrupt를 각각 따로 돌려보는 것과, 이 세 가지를 하나의 기능으로 묶는 것은 난이도가 다릅니다. 묶는 순간 초기화 순서, 주기, 상태 변수, 인터럽트 타이밍, 로그 출력이 서로 영향을 줍니다.
정체기를 줄이려면 예제를 기능 단위로 합쳐야 합니다. 예를 들어 버튼을 누르면 모드가 바뀌고, 타이머가 10 ms마다 상태를 갱신하고, UART로 현재 상태를 출력하는 정도의 작은 시스템을 만들어봅니다. 여기에 센서 입력이나 PWM 출력을 하나 붙이면 회로와 펌웨어가 같이 보이기 시작합니다.
작은 프로젝트는 너무 작아도, 너무 커도 안 됩니다
프로젝트가 너무 작으면 연결이 생기지 않습니다. LED 하나를 켜는 수준에서는 GPIO 설정만 보고 끝납니다. 반대로 처음부터 로봇, 드론, 모터 제어기처럼 큰 주제를 잡으면 완주 전에 지칩니다. 임베디드 초반에는 1~2주 안에 끝낼 수 있지만 여러 개념이 들어 있는 프로젝트가 좋습니다.
예를 들어 온도 센서를 읽어 UART로 출력하고, 임계값을 넘으면 PWM으로 팬 속도를 바꾸는 프로젝트를 생각해볼 수 있습니다. 여기에는 ADC, 타이머, PWM, UART, 전원 안정성, 센서 노이즈가 들어갑니다. 기능은 작지만 디버깅 포인트는 충분합니다. 이 정도를 끝까지 해보면 임베디드 실력은 계단처럼 성장한다는 카드뉴스가 말하는 정체와 도약의 감각을 실제로 느낄 수 있습니다.
디버깅 기록이 실력의 계단을 만듭니다
임베디드 실력은 성공한 코드보다 실패한 디버깅에서 더 많이 쌓입니다. 하지만 실패를 그냥 넘기면 같은 문제를 반복합니다. 버튼이 여러 번 눌린 것처럼 보였다면 회로 디바운싱이었는지, 소프트웨어 디바운싱이었는지, 풀업 설정이 틀렸는지 기록해야 합니다. UART가 깨졌다면 baud rate, 클럭, GND, 버퍼 처리를 어떤 순서로 봤는지 남겨야 합니다.
기록은 길 필요가 없습니다. 증상, 가설, 확인한 것, 바꾼 것, 결과만 남기면 됩니다. “PWM이 안 나옴”보다 “타이머 클럭 설정은 맞았고, GPIO alternate function 설정이 빠져 있었음”처럼 적는 것이 좋습니다. 이렇게 남긴 기록이 다음 프로젝트에서 판단 기준이 됩니다.
회로와 코드를 같이 보는 습관이 필요합니다
임베디드 초보자는 코드 문제와 회로 문제를 분리해서 생각하기 쉽습니다. 하지만 실제 문제는 경계에 걸쳐 있는 경우가 많습니다. 버튼 입력이 불안정하면 코드만 볼 것이 아니라 풀업 저항과 스위치 접점도 봐야 합니다. 센서 값이 흔들리면 평균 필터만 넣을 것이 아니라 전원 노이즈와 RC 필터도 확인해야 합니다.
반대로 회로만 의심해서도 안 됩니다. 파형이 이상할 때는 오실로스코프 측정 조건부터 확인하고, 펌웨어가 실제로 어떤 주기로 핀을 바꾸는지도 봐야 합니다. 하드웨어와 펌웨어를 함께 보는 습관은 초반에는 느려 보이지만, 시간이 지나면 디버깅 속도를 크게 줄여줍니다.
다음 계단은 완성보다 설명에서 옵니다
프로젝트가 동작하면 바로 다음 주제로 넘어가고 싶어집니다. 하지만 실력을 올리는 마지막 단계는 설명입니다. 이 프로젝트에서 MCU가 어떤 순서로 초기화됐는지, 타이머 주기는 어떻게 정했는지, 인터럽트 안에서는 무엇을 하지 않았는지, 측정으로 무엇을 확인했는지 설명해봅니다.
설명할 수 없는 부분은 아직 연결되지 않은 부분입니다. 그 부분을 다시 보면 다음 계단이 생깁니다. 임베디드 공부는 많은 예제를 빠르게 소비하는 것보다, 작은 시스템을 끝까지 만들고 복기하는 쪽이 훨씬 오래 남습니다. 정체기는 멈춘 시간이 아니라 연결이 만들어지는 시간입니다.