[IT 심층 분석]
CMOS 이미지 센서의 롤링 셔터 현상 최소화를 위한 하드웨어 인터럽트 제어 최적화
김민준 · IT 시스템 엔지니어|
광학 시스템을 다루는 엔지니어라면 움직이는 피사체를 촬영할 때 젤리처럼 늘어지는 형태의 왜곡을 경험한 적이 있을 것입니다. 전형적인 CMOS 이미지 센서의 구조적 한계에서 기인하는 이 현상은 롤링 셔터 이펙트로 불립니다. 최근 머신러닝 기반의 자동 객체 인식 카메라 모듈을 개발하는 인프라 단계에서 이 왜곡 현상으로 인해 객체 바운딩 박스가 어긋나거나 인식률이 현저하게 떨어지는 치명적인 결함이 발생했습니다. 글로벌 셔터를 탑재한 값비싼 센서로 교체하는 것이 가장 직관적인 광학적 해결책이겠으나 한정된 단가에 맞추어 양산을 계획해야 하는 현장의 현실은 결코 그것을 허락하지 않았습니다. 따라서 우리는 순전히 펌웨어 단비와 운영체제의 인터럽트 스레드 튜닝만으로 이 물리적 한계를 최대한 극복해보기로 결심했습니다.
CMOS 센서 배열은 각 라인별로 화소를 활성화하고 데이터를 읽어들이는데 전체 프레임을 읽어내는 스캔 시간과 피사체의 이동 속도가 상충할 때 왜곡이 생깁니다. 따라서 최우선 과제는 데이터 스캔 속도를 극한으로 끌어올리는 것이었습니다. 이를 진단하기 위해 우리는 오실로스코프를 센서의 V-Sync 핀과 Data 라인에 물려놓고 버스 타이밍 다이어그램을 그려보았습니다. 분석 결과 센서 자체의 동작 속도는 나쁘지 않았으나 호스트 프로세서가 인터럽트를 처리하면서 상당한 마이크로초 단위의 지연을 일으키고 있는 것을 발견했습니다. 즉 센서가 한 라인의 데이터 전송을 완료했다는 인터럽트를 AP 측에 날렸을 때 AP가 이를 받아들이고 곧바로 다음 라인을 읽도록 명령하는 턴어라운드 타임에 극심한 병목이 있었던 것입니다.
이에 대한 근본 원인은 리눅스 커널 상의 인터럽트 핸들러 구조에서 비롯된 것이었습니다. 센서 관련 인터럽트가 소프트웨어 인터럽트 큐(SoftIRQ)에 쌓이고 CPU 코어가 다른 중요한 시스템 I/O 태스크를 처리하느라 카메라 인터럽트의 처리 우선순위가 자꾸만 밀려났기 때문입니다. 이를 타파하기 위해 커널 수준에서 IRQ 어피니티(IRQ Affinity)를 강제로 고정하는 전략을 취했습니다. 유휴 상태에 가까운 특정 고성능 코어를 시스템 스케줄러에서 분리시켜 오로지 카메라 센서가 발송하는 인터럽트만 독점적으로 처리하도록 마스킹 설정을 변경했습니다. 아울러 커널 코드 내에서 이 인터럽트를 처리하는 하프 스레드의 우선순위를 실시간 스케줄링 클래스로 끌어올려 그 어떤 외부 문맥 교환에 의해서도 선점당하지 않도록 강력한 방어막을 쳤습니다.
이러한 인터럽트 튜닝 외에도 추가로 적용한 기법은 MIPI CSI 레인의 대역폭 확장이었습니다. 센서와 호스트 AP를 이어주는 데이터 고속도로인 MIPI 라인의 클럭 파라미터를 규격 내에서 최상치로 오버클럭했습니다. 이렇게 하드웨어 인터럽트 응답 시간을 획기적으로 줄이고 전송 경로를 확장하자 센서가 프레임의 첫 라인부터 마지막 라인까지 읽어들이는 리드아웃 시간(Readout Time)이 기존 대비 놀라울 만큼 단축되었습니다. 절대적으로 롤링 셔터 왜곡 자체를 소멸시킬 수는 없지만 그 찰나의 시간 오차를 한계를 뛰어넘어 좁혔기 때문에 움직이는 피사체를 포착했을 때의 비틀림 현상이 딥러닝 객체 판단 로직에 방해가 되지 않을 수준으로 극복할 수 있었습니다.
소프트웨어 시스템 엔지니어가 하드웨어 구성 요소의 본질적인 제약을 회피하기 위해 운영체제 커널의 심장부까지 뜯어고쳐야 한다는 사실은 굉장히 매력적이면서도 고통스러운 작업이었습니다. 이번 디버깅 과정은 결국 시스템 전반의 병목은 절대 어느 한 계층에만 국한되지 않는다는 사실을 입증했으며 인터럽트 루틴의 우선순위 최적화가 전체 시스템 퍼포먼스 향상에 얼마나 중대한 영향을 미치는가에 대한 교과서적인 모범 답안으로 남게 되었습니다.