Showing Posts From

껐다

전원을 껐다 켜봤나요?

전원을 껐다 켜봤나요?

"전원을 껐다 켜봤나요?" 오늘도 전원부터 출근했다. 어제 돌려놓은 테스트. 실패했다. 메일을 확인한다. HW팀 김과장님. "펌웨어 쪽 확인 부탁드립니다." 또다. 보드를 본다. LED가 안 켜진다. 전원을 뺐다 꽂는다. 켜진다. "해결됐습니다." 메일을 보낸다. 5분 걸렸다.이게 우리 일이다. 전원을 끄고 켠다. 하루에 50번. 99%의 좌절 오후 2시. 회의실. "통신이 안 됩니다." PM이 말한다. "리셋 해보셨어요?" 내가 묻는다. "해봤는데 안 돼요." 알았다. 직접 가봐야 한다. 현장에 간다. UART 로그를 본다. 통신은 된다. 그런데 데이터가 이상하다. "전원 껐다 켜보겠습니다." 모두가 본다. 나를. 전원을 끈다. 5초 기다린다. 켠다. 똑같다. 안 된다. "역시 펌웨어 문제네요." 누군가 말한다.99%는 이렇다. 리셋으로 해결 안 된다. 그런데도 우리는 계속한다. 왜냐면 1%가 있으니까. 1%의 기적 작년 겨울이었다. 양산 한 달 전. 필드 테스트 중. 기기가 멈췄다. "재현이 안 됩니다." 테스트팀이 말한다. 현장에 갔다. 한 시간 기다렸다. 멈췄다. JTAG를 연결한다. 스택을 본다. watchdog에 걸렸다. 그런데 원인을 모른다. 코드를 본다. 로그를 본다. 파형을 본다. 3일을 본다. "일단 리셋 루틴 추가하겠습니다." 보고했다. PM이 물었다. "근본 원인은요?" "모릅니다. 그런데 워치독으로 리셋되면 복구는 됩니다." 침묵. "그렇게 하세요." 그게 정답이었다. 양산 후 6개월. 문제없다.리셋이 해결책은 아니다. 그런데 때로는 유일한 대안이다. 리셋의 철학 임베디드 개발자들은 안다. 전원 껐다 켜는 게 얼마나 중요한지. 웹 개발자들은 모른다. 걔네는 서버 재시작하면 된다. 1초면 된다. 우리는 다르다. 리셋에도 종류가 있다. 소프트웨어 리셋. NVIC_SystemReset(). 코드로 리셋한다. 빠르다. 하지만 일부 레지스터는 안 지워진다. 하드웨어 리셋. NRST 핀. 완전히 리셋된다. 그런데 보드를 만져야 한다. 전원 리셋. 플러그를 뺀다. 가장 확실하다. 모든 걸 초기화한다. 프로젝트마다 다르다. 어떤 리셋이 필요한지. 작년 프로젝트. BLE 스택이 꼬였다. 소프트웨어 리셋으론 안 풀렸다. 전원을 완전히 끊어야 했다. 코드에 추가했다. "배터리 분리 후 3초 대기하세요." 사용자 매뉴얼에 들어갔다. 엔지니어가 아닌 사람들은 이해 못 한다. "왜 그냥 리셋 버튼 안 만들어요?" 만들었다. 버튼으로는 안 된다. 전원 분리가 필요하다. "왜요?" 설명했다. 10분 동안. 이해 못 한다. 그냥 했다. 디버깅의 늪 오늘 오전. 새 프로젝트. ESP32로 WiFi 연결. 안 된다. 로그를 본다. "Failed to connect". 당연하다. 그걸 보려고 로그를 보는 게 아닌데. 스펙 문서를 연다. 732페이지. WiFi 챕터. 읽는다. 한 시간. 뭔 소린지 모른다. "일단 리셋해보자." esp_restart(). 코드에 추가한다. 테스트한다. 안 된다. 다시 리셋. 또 안 된다. 10번 반복. 안 된다. 점심시간이다. 점심 먹고 온다. 다시 본다. 로그를 자세히 본다. "SSID not found". 아. WiFi 이름을 잘못 입력했다. 오타. 고친다. 된다. 리셋은 필요 없었다. 그런데 어쨌든 했다. 양산의 공포 양산이 제일 무섭다. 개발할 땐 문제 생기면 고친다. 펌웨어 업데이트하면 된다. 양산 후엔 다르다. 제품이 나간다. 만 대. 십만 대. 문제 생기면? 리콜. 비용이 몇억. 그래서 리셋 루틴을 넣는다. 보험처럼. Watchdog. 무조건 넣는다. 코드가 멈추면 리셋. Brown-out detection. 전압 떨어지면 리셋. Stack overflow check. 스택 터지면 리셋. 예외 처리. Hardfault 나면? 로그 남기고 리셋. 동료가 물었다. "너무 많이 리셋하는 거 아냐?" 아니다. 적당하다. "근본 원인 찾아야 하는 거 아냐?" 찾는다. 당연히. 그런데 못 찾을 수도 있다. 양산 전에 모든 버그를 찾는 건 불가능하다. 그래서 리셋이 필요하다. 사용자는 모른다. 기기가 잠깐 껐다 켜진 걸. 3초면 부팅된다. 우리만 안다. 그게 watchdog 리셋이란 걸. 로그에 남는다. 필드 테스트 데이터를 본다. 한 달에 watchdog 리셋 5번. 괜찮다. 10번 넘어가면 문제다. 코드를 다시 봐야 한다. 중국 칩의 비밀 중국 칩을 쓸 때가 있다. 싸니까. 그런데 스펙이 불친절하다. 영어 번역이 이상하다. "Reset function is to be enabled when power." 무슨 뜻인지 모른다. 구글 번역에 중국어를 넣는다. 더 모른다. 포럼을 뒤진다. 중국 포럼. 번역기 돌린다. 누군가 말한다. "그냥 껐다 켜세요." 중국어로. 해본다. 된다. 왜 되는지 모른다. 그냥 된다. 이게 중국 칩이다. 스펙보다 경험이 중요하다. 작년에 쓴 칩. 레지스터 하나가 리셋 안 됐다. 스펙엔 리셋된다고 나온다. 버그 아니냐고 물었다. 팹리스에. 답장 왔다. "이건 Feature입니다. 의도된 겁니다." 아니다. 버그다. 그냥 인정 안 하는 거다. 코드로 해결했다. 리셋 후 수동으로 레지스터 클리어. 이게 우리 일이다. HW팀과의 전쟁 "펌웨어 문제 아니에요?" HW팀 이과장님. "회로 확인해보셨어요?" 나. "회로는 문제없어요. 시뮬레이션 돌렸어요." "실제 파형 보셨어요?" "그건... 펌웨어가 잘못 설정한 거 아닐까요?" 한숨 나온다. 보드를 가져온다. 오실로스코프 연결한다. 프로브를 댄다. SCL, SDA 라인. I2C 통신. 파형을 본다. 이상하다. 클럭이 흔들린다. "이거 풀업 저항 얼마예요?" "4.7k요." "속도는요?" "400kHz요." 계산한다. 머릿속으로. 안 맞는다. "속도 낮춰보겠습니다." 코드를 고친다. 100kHz로. 테스트한다. 된다. "펌웨어 문제 맞네요." 이과장님이 말한다. 아니다. 하드웨어 문제다. 풀업 저항이 약하다. 그런데 말 안 한다. 이미 PCB 제작했다. 고치려면 재작업이다. 펌웨어로 우회한다. 속도 낮추면 된다. 성능은 좀 떨어진다. 괜찮다. 이게 임베디드다. 완벽한 하드웨어는 없다. 펌웨어로 커버한다. 리셋할 수 없는 것들 가끔 생각한다. 인생도 리셋할 수 있으면. 5년 전으로. 대학 졸업할 때로. 웹 개발 갈까, 임베디드 갈까 고민하던 때. 임베디드를 선택했다. 하드웨어가 재밌어 보였다. 지금은? 후회는 안 한다. 그런데 가끔 힘들다. 야근이 많다. 장비가 회사에 있어서 재택이 안 된다. 연봉은 나쁘지 않다. 5800만원. 야근 수당 더하면 6천 넘는다. 그런데 시급으로 계산하면? 별로다. 웹 개발자 친구. 연봉 7천. 재택 주 3일. 칼퇴. 부럽다. 솔직히. 그런데 걔는 모른다. 내가 아는 걸. 하드웨어가 돌아갈 때의 쾌감. LED가 처음 켜질 때. 센서 데이터가 들어올 때. 그건 웹에서 못 느낀다. 리셋 버튼을 누른다. 기기가 꺼진다. 다시 켜진다. 부팅 로그가 올라온다. UART로. "System initialized." 이 문장을 볼 때. 3일 밤샌 끝에. 그때는 행복하다. 내일도 리셋 퇴근 전이다. 9시. 오늘 작업한 코드. 커밋한다. 메시지를 쓴다. "Add watchdog reset handling." 푸시한다. 내일 출근하면 볼 것들. 테스트 결과. 실패했을 것이다. 또. 메일. "펌웨어 확인 부탁드립니다." 또. 회의. 결론 없을 것이다. 또. 그리고 나는 물을 것이다. "전원 껐다 켜보셨나요?" 이게 우리 일이다.내일도 전원을 끌 것이다. 그리고 켤 것이다. 50번쯤.