Showing Posts From

문제

하드웨어 문제? 소프트웨어 문제? 중간에 몇 달이 간다

하드웨어 문제? 소프트웨어 문제? 중간에 몇 달이 간다

하드웨어 문제? 소프트웨어 문제? 중간에 몇 달이 간다 누가 진범인가 월요일 아침. 회의실 문이 닫힌다. "펌웨어팀, 이 제품 버그 좀 봐주시겠어요?" 하드웨어팀 팀장이 말한다. 목소리는 차분하지만 눈빛은 이미 비난하고 있다. 나는 버그 리포트를 받아든다. A4 한 장. 한글과 한문 섞인 번역체로 쓰여 있다. "디바이스 켜졌다가 5분 뒤 꺼져요." 이게 전부다. 내 머리가 이미 회전하기 시작한다. 소프트웨어 워치독이 있나? 배터리 문제는? 전원 관리 로직은? 아니면 실제로 하드웨어가 재부팅되는 건가? 펌웨어 크래시로 보이지만 사실 회로에서 전류가 튀는 건 아닌가? "일단 확인해보겠습니다." 내 대답. 항상 이 말부터다.오실로스코프 앞에서의 3시간 보드를 받아온다. 오실로스코프 프로브를 잡는다. 손이 익숙하다. 너무 익숙해서 가끔 전봇대 사진 봐도 신경이 쓰인다. VCC를 먼저 본다. 깨끗하다. 정말 깨끗하다. 5V가 흔들리지 않는다. 아, 잠깐. 순간 0.2V 드롭이 보인다. 아니다. 프로브 접지가 문제인가? 한 시간이 지난다. 파형을 다시 본다. 신호는 여전히 깨끗하다. 그럼 왜 꺼져? 혼잣말이 나온다. "클럭은? 클럭이 멈춰?" 오실로스코프 채널을 바꾼다. 48MHz 클럭이 보인다. 주기는 20.8ns. 정확하다. 그럼 뭐가 문제지? 한 시간 더. 커피를 마신다. 찬 커피다. 아침에 받은 거라서. "혹시 리셋 신호?" 리셋 핀을 본다. 3.3V에 안정적이다. 눌리지 않는다. 결론: 파형상으로는 아무 문제 없다. 그럼 소프트웨어다. 아니다. 기다려. 정말 그럴까?그 사이에서 뭔가가 발생한다 코드를 본다. 초기화 루틴부터. 1000줄이 있다. PLL 설정. 타이머 설정. UART 설정. I2C 설정. SPI 설정. GPIO 설정. "이게 순서가 맞나?" 레퍼런스 매뉴얼을 찾는다. STM32H745. 영어 1500페이지. 목차를 본다. 시스템 아키텍처. 전원 관리. 클럭 트리. RCC 레지스터. 2시간이 지난다. 혹시 스택 오버플로우? 혹시 메모리 부족? 혹시 인터럽트 우선순위 충돌? 전부 아니다. 슬랙으로 하드웨어팀에 메시지를 보낸다. "혹시 회로 다시 한 번 확인 가능할까요? 디커플링 캡이나..." 5분이 지난다. 하드웨어팀 팀장이 회의실 문을 열고 들어온다. "펌웨어 문제 아니면요? 우리 회로는 검증 다 했거든요." "저도 파형상으로는 문제가 없는데요. 혹시..." "펌웨어팀에서 먼저 확인해줄 수 있을까요?" 문이 닫힌다. 또 1시간. 또 다른 1시간. 또 다른 1시간. 며칠이 지난다. 상태 리포트를 쓴다. "원인 파악 중. 하드웨어와 소프트웨어의 경계 영역 검토 필요." 이 문장은 내가 아무것도 모른다는 뜻이다. 혹은 그 반대 "좌표를 확인해봤나요?" 하드웨어팀 신입 사원이 묻는다. 좌표? "이 IC, 데이터시트 봤어요? 핀 배치가..." 데이터시트를 본다. 맞다. 맞는데. 잠깐. 핀 번호가. "어? 43번이 GND인데 여기는 NC로 되어 있네요." "아 그건 한국 대리점에서 수정한 버전 문서예요." "...뭐?" 그 IC에서 나가는 신호가 5번인 줄 알았는데 사실은 그게 아니었다. 다른 핀이었다. 그 핀은 시뮬래이션상으로는 출력이 없는 핀이었다. 그래서 소프트웨어에서는 그 신호를 버려버렸다. 마이크로초 단위의 타이밍 오류가 발생했다. 그게 쌓여서 5분에 버퍼 오버플로우가 된 거다. 그런데 버퍼 오버플로우가 스택을 침범했다. 스택에는 뭐가 있었나. 핸들러 포인터가 있었다. 그게 깨졌다. 다음 인터럽트가 들어왔을 때 CPU가 엉뚱한 주소로 점프했다. 워치독이 감지했다. 리셋됐다. 결론: 하드웨어다. 아니다. 결론: 펌웨어 버퍼 사이즈다. 아니다. 결론: 스택 배치다. 아니다. 결론: 데이터시트가 잘못됐다.진짜 보상은 결론이 나왔다. 메일을 쓴다. "원인: 데이터시트 버전 불일치로 인한 IC 핀맵 오류. 영향: 신호 누락으로 인한 버퍼 오버플로우. 해결책: 데이터시트 최신 버전 확인 (영문) 펌웨어 버퍼 사이즈 1.5배 증량 스택 가드 추가"보낸다. 팀장이 본다. "좋아. 수정하지." 며칠이 지난다. 새 펌웨어가 나온다. 테스트한다. 24시간. 문제 없다. 48시간. 문제 없다. 72시간. 문제 없다. 처음으로 웃음이 나온다. 이게 펌웨어 개발의 쾌감이다. 파형을 봤을 때는 답이 없었다. 코드를 봤을 때도 답이 없었다. 그런데 세상에는 많은 문제가 경계에 있다. 하드웨어와 소프트웨어의 경계. 설계와 구현의 경계. 명세와 현실의 경계. 그 경계를 헤매다가 찾는 답. 그 답은 오실로스코프로도 보이지 않고 디버거로도 잘 안 보이고 머리로만 떠올라야 한다. 웹 개발자들은 이런 게 없겠지. 배포 잘못했으면 롤백하면 되니까. 우리는 한 달에 50만 개를 양산한다. 한 개가 재발할 확률이 0.0001%라도 50개가 나간다. 그 50개를 회수하려면 기차 2대가 필요하다. 그래서 우리는 며칠이고 기다린다. 오실로스코프 앞에서. 데이터시트 앞에서. 그리고 마침내 찾았을 때. 아, 그 느낌. 그게 이 일을 계속하는 이유다. 돈이 아니라. 밤새는 게 가치 있다고 느끼는 그 순간.내일 또 다른 버그 리포트가 올 거다. "어떤 제품 꺼져요." 그럼 또 시작한다.