Embedded

Обзор Raspberry Pi для Qt-разработки: модели, ОС, кросс-компиляция

Введение

Arduino-цикл статей разбирал микроконтроллеры — устройства без полноценной операционной системы, программируемые в одном файле прошивки. Raspberry Pi — принципиально другой класс устройств: одноплатный компьютер с полноценным Linux, файловой системой, многозадачностью и сетевым стеком, что делает его значительно ближе к обычному десктопному Qt-приложению, чем к Arduino-скетчу. В статье разберём модели Raspberry Pi, подходящие операционные системы для Qt-разработки, и два основных подхода к сборке приложений — компиляцию непосредственно на самом устройстве и кросс-компиляцию с более мощного хоста.

Концепция

Raspberry Pi выпускается в нескольких актуальных моделях (Pi 4, Pi 5, Pi Zero 2 W как компактный вариант) с разной производительностью CPU и объёмом RAM — выбор модели для Qt-проекта зависит от требований конкретного приложения (простой текстовый интерфейс на Pi Zero против требовательного QML-интерфейса с анимациями на Pi 4/5). Raspberry Pi OS (на базе Debian) — основная, наиболее распространённая ОС, но для embedded-проектов также применимы более узкоспециализированные системы (Yocto, Buildroot — упоминавшиеся в основном цикле статей про Embedded и Boot2Qt, статья 25). Сборка непосредственно на самом устройстве проста в настройке, но медленна из-за ограниченной производительности; кросс-компиляция на мощном ПК с последующим переносом готового бинарного файла на Raspberry Pi значительно быстрее, но требует более сложной первоначальной настройки тулчейна.

Пример кода: Обзор Raspberry Pi для Qt-разработки

# Проверка модели и архитектуры Raspberry Pi — первый шаг перед выбором подхода к сборке
cat /proc/cpuinfo | grep Model
uname -m  # aarch64 для 64-битной Raspberry Pi OS, armv7l для 32-битной

# Установка Qt непосредственно на устройстве (самый простой старт, статья 342 разберёт детальнее)
sudo apt update
sudo apt install qt6-base-dev qt6-declarative-dev cmake build-essential
# CMakeLists.txt — простой проект, одинаково собираемый и на самом Pi, и через кросс-компиляцию
cmake_minimum_required(VERSION 3.20)
project(PiGpioDemo)

set(CMAKE_CXX_STANDARD 17)
find_package(Qt6 REQUIRED COMPONENTS Core Widgets)

qt_standard_project_setup()
qt_add_executable(PiGpioDemo main.cpp)
target_link_libraries(PiGpioDemo PRIVATE Qt6::Core Qt6::Widgets)
# Кросс-компиляция — типичный набор инструментов на хост-машине (Ubuntu/Debian)
sudo apt install crossbuild-essential-arm64  # тулчейн для 64-битной ARM-архитектуры

# Сборка с указанием toolchain-файла, направляющего CMake на кросс-компилятор
cmake -B build-pi -S . -DCMAKE_TOOLCHAIN_FILE=toolchain-rpi.cmake
cmake --build build-pi
# Готовый бинарный файл переносится на Raspberry Pi через scp для запуска
scp build-pi/PiGpioDemo pi@raspberrypi.local:/home/pi/

Пояснения к коду

cat /proc/cpuinfo/uname -m — первый диагностический шаг, определяющий архитектуру (aarch64 для современной 64-битной Raspberry Pi OS на Pi 4/5, armv7l для устаревших 32-битных образов) — это напрямую влияет на выбор архитектуры кросс-компилятора и доступность готовых пакетов Qt для конкретной версии ОС. Простой CMake-проект, показанный во втором примере, написан без какой-либо специфики, привязанной именно к Raspberry Pi — это намеренно демонстрирует, что обычное Qt-приложение не требует переписывания для запуска на Pi, и специфичный для платформы код (GPIO, статья 343; камера, статья 345) добавляется только там, где действительно нужно взаимодействие с аппаратными возможностями устройства.

Подводные камни

  • Выбор недостаточно производительной модели Raspberry Pi для приложения с требовательным QML-интерфейсом с анимациями, без предварительной оценки реальных требований к производительности GPU/CPU — Pi Zero 2 W заметно слабее Pi 4/5 по графической производительности, и интерфейс, плавно работающий на Pi 5, может ощутимо тормозить или вовсе не запускаться приемлемо на более слабой модели; выбор модели стоит делать с учётом конкретных требований интерфейса, а не наименьшей по стоимости опции «по умолчанию».
  • Смешивание 32-битной и 64-битной версий ОС/библиотек на одном проекте без понимания последствий — попытка запустить 64-битный бинарный файл на 32-битной Raspberry Pi OS (или наоборот) приведёт к немедленной ошибке запуска; архитектура целевой ОС должна быть явно определена до начала сборки и согласована между хостом кросс-компиляции (если используется) и реальным устройством.
  • Использование непредсказуемой по версиям, давно не обновлявшейся версии Raspberry Pi OS — версии пакетов Qt в репозиториях Raspberry Pi OS могут заметно отставать от актуальных релизов Qt, что иногда вынуждает к самостоятельной сборке нужной версии Qt из исходников (значительно более долгий процесс, особенно непосредственно на самом устройстве) — перед началом проекта стоит явно проверить, какая версия Qt доступна в репозиториях используемой версии ОС, и при необходимости спланировать самостоятельную сборку нужной версии заранее.
  • Полный отказ от кросс-компиляции в пользу постоянной сборки непосредственно на устройстве для крупного, активно разрабатываемого проекта — для проекта с частыми пересборками (активная разработка, а не финальное развёртывание) медленная сборка непосредственно на Raspberry Pi заметно замедляет итеративный цикл разработки по сравнению с кросс-компиляцией на значительно более мощном хосте, и инвестиция времени в настройку кросс-компиляции (статья 342) обычно окупается уже после нескольких десятков пересборок.