Embox RTOS로 STM32 MCU에서 Qt 실행하기: 실전 성능 가이드
배경
임베디드 시스템은 점점 더 풍부한 기능을 제공해야 하는 요구에 직면해 있습니다. 리눅스는 방대한 라이브러리와 도구 생태계를 갖추고 있지만, 특히 메모리 측면에서의 하드웨어 요구사항이 비용과 전력 소모를 증가시키는 경우가 많습니다. STM32 시리즈와 같은 최신 마이크로컨트롤러(MCU)는 많은 스마트 애플리케이션에 충분한 리소스를 제공하면서도 저렴하고 에너지 효율적입니다.
Qt 애플리케이션 빌드 및 검증
이전에는 STM32F746-Discovery 보드에서 Qt 'moveblocks' 예제를 시연한 바 있습니다. 이번에는 대화형 3D 스타일 그래픽을 제공하며 터치스크린에 적합한 'animatedtiles' 예제로 확장했습니다. MCU의 CPU와 메모리가 480×272 또는 800×480 디스플레이에서 부드러운 렌더링을 유지할 수 있는지 평가하고자 했습니다.
QEMU에서 애플리케이션 빌드
먼저 Qt 예제를 오픈소스 에뮬레이터인 QEMU용으로 빌드했습니다. QEMU에서 앱을 실행하면 메모리를 미리 할당할 필요가 없어 모든 종속성이 갖춰져 있는지 확인할 수 있습니다. 검증이 완료되면 STM32 구성 파일에 필요한 구성 요소를 추가했습니다.
타겟 보드에서 최초 실행
애플리케이션은 STM32F746G-Discovery에서 시작되었지만 화면의 상단 절반만 채워졌습니다. 보드에서 직접 디버깅하는 것도 가능하지만, 호스트 환경을 활용해 초기 디버깅을 수행하는 것이 더 효율적입니다.
호스트 환경에서의 디버깅
예제를 실행하고 디버깅하려면 Qt 라이브러리와 QVFB(Qt Virtual Framebuffer)를 설치해야 합니다. QVFB는 Qt가 렌더링할 수 있는 가상 디스플레이를 제공합니다. 공식 지침에 따라 QVFB를 빌드하세요.
보드 해상도에 맞춰 QVFB 실행
./qvfb -width 480 -height 272 -nocursor
임베디드 프로파일로 Qt 컴파일 (X11 비활성화) 및 불필요한 모듈 제외
./configure -opensource -confirm-license -debug \
-embedded -qt-gfx-qvfb -qvfb \
-no-javascript-jit -no-script -no-scripttools \
-no-qt3support -no-webkit -nomake demos -nomake examples
QVFB로 animatedtiles 빌드 및 실행
./examples/animation/animatedtiles/animatedtiles -qws -display QVFb:0
애플리케이션이 다시 화면 상단 절반만 차지하는 것을 확인했습니다. examples/animation/animatedtiles/main.cpp를 검토한 결과, 뷰가 윈도우 모드로 표시되도록 설정되어 있었습니다. -fullscreen 플래그를 추가하면 이 문제가 해결됩니다.
STM32F746-Discovery에 배포
소스 코드를 수정한 후 Embox용으로 애플리케이션을 다시 빌드하고 QEMU에서 실행했습니다. 실제 보드에서 실행할 때 'Out Of Memory' 오류가 발생해 힙 크기가 부족함을 알 수 있었습니다. 필요한 크기를 파악하기 위해 Valgrind의 Massif 도구를 사용했습니다.
valgrind --tool=massif --massif-out-file=animatedtiles.massif ./examples/animation/animatedtiles/animatedtiles -qws -fullscreen
ms_print animatedtiles.massif > animatedtiles.out
Massif 분석 결과 약 2.7MB의 힙이 필요하다고 나왔습니다. Embox 구성에서 힙을 3MB로 늘리니 데모가 전체 화면으로 실행되었습니다.
STM32F769I-Discovery에 배포
STM32F769I-Discovery는 800×480 디스플레이와 16MB의 외부 SDRAM을 갖추고 있습니다. 프레임버퍼만 약 0.8MB(800×480×2바이트)를 소비합니다. 힙 크기만 조정하면 됩니다.
더 큰 해상도로 QVFB 시작
./qvfb -width 800 -height 480 -nocursor &
Massif로 다시 분석
valgrind --tool=massif --massif-out-file=animatedtiles.massif ./examples/animation/animatedtiles/animatedtiles -qws -fullscreen
ms_print animatedtiles.massif > animatedtiles.out
Massif는 약 6MB의 힙을 보고했습니다. 힙을 6MB로 구성하면 STM32F769I 보드에서 전체 화면 작동이 가능해집니다.

아래 동영상에서 데모를 시청하거나 GitHub 위키의 단계를 따라 결과를 재현해 보세요.
참고 자료
- https://habr.com/ru/company/embox/blog/459730/ (러시아어, 영어 버전도 제공: https://sudonull.com/post/25508-Porting-Qt-to-STM32-Embox-Blog)
- https://alexkalmuk.medium.com/a-little-about-graphics-subsystem-internals-on-microcontrollers-d952cfd0966a
Anton Bondarev는 Embox RTOS의 창립자입니다. 2003년 상트페테르부르크 전기기술대학교(LETI)에서 전기공학 석사 학위를 취득했고, 이후 상트페테르부르크 국립대학교에서 소프트웨어 공학 박사 과정을 수료했습니다. 임베디드 및 시스템 프로그래밍 분야에서 20년 이상의 경력을 쌓으며 Embox 프로젝트를 이끌고 있습니다.
Alexander Kalmuk은 Embox RTOS의 공동 창립자입니다. 2014년 상트페테르부르크 국립대학교에서 수학 및 소프트웨어 공학 석사 학위를 취득하고 제어 이론 박사 과정을 밟았습니다. 10년 이상의 임베디드 시스템 프로그래밍 경험을 바탕으로 Embox 개발의 핵심 기여자로 활동하고 있습니다.
관련 콘텐츠
- 리눅스를 크리티컬 애플리케이션에 사용할 때: 물과 기름 섞기?
- 내 IoT 프로젝트에 Yocto Project를 선택해야 하는 이유?
- Automotive Grade Linux 전문성 수요 예측
- MCU로 산업용 IoT에 리눅스 구현하기
- 임베디드 리눅스를 겨냥한 오픈소스 플랫폼
- 임베디드 리눅스 디바이스 드라이버: 역할 이해하기
- 임베디드 리눅스 OTA 업데이트 1부 – 기초와 구현
- $3 와이파이 디바이스에 보안 임베디드 웹 서버 설치하기
- 연결된 시스템의 끝없는 소프트웨어 개발 수명 주기 마스터하기 – 그렇지 않으면 그것이 당신을 지배할 것이다
더 많은 임베디드 소식을 원하시면 Embedded의 주간 이메일 뉴스레터를 구독하세요.