Введение Итак, еще вчера вы программировали UART, GPIO на микроконтроллере и ничего не предвещало беды, но заказчик хотел еще и 20-дюймовый дисплей с тачскрином.
И вот вы уже рассматриваете варианты одноплатных компьютеров (SBC).
Там их много, поделюсь горьким опытом.
Искал что-нибудь подешевле и мой выбор пал на Orange Pi. Прежде всего, это модель PC PLUS. Для него есть сборка Armbian со свежей ОС, в отличие от сайта производителя, где вам предложат Ubuntu 16. Вот незадача, с Armbian OrangePi PC PLUS не выключается.
OrangePi PC PLUS в конце сообщает, что система остановлена, поскольку за выключение отвечает сопроцессор.
АР100 с закрытыми исходными кодами, не вошедшими в Armbian. Вы можете взять образ Ubuntu с сайта производителя.
Есть несколько образов, все перепробовал, только один реально отключает одноплатную систему.
Какое отношение у xunlong к пользователю, что они выкладывают прошивки, где их творение нельзя отключить?! Также на PC PLUS были непреодолимые трудности с подключением экрана 4:3. Затем я попробовал OrangePi 4G. Я конечно хочу иметь контроль над системой, поэтому андроид мне не подходит. Однако под Ubuntu на OrangePi 4G ничего не работает, кроме процессора.
Драйверов нет. Под Android все работает, кроме HDMI, xunlong удалось сделать HDMI, который несовместим с большинством мониторов (невозможно заранее узнать, будет ли ваш монитор совместим с OrangePi 4g).
Дальше я взял OrangePi 4B. Бросается в глаза, что в консоли он называет себя Orange Pi 4. Но на этикетке самого SBC написано 4B (на плате маркировка v1.4).
При установке на него любой версии Армбиана СБК сразу перезагружается под нагрузкой.
Я думал это дефект, но Ubuntu 18 с сайта производителя работает стабильно при многочасовой нагрузке (блок питания покупался от того же xunlong).
Но при запуске та же Ubuntu 18 с сайта производителя зависает на десять секунд с сообщением CONFIG-ERROR) dhd_conf_set_intiovar: ошибка настройки txbf -23 и я даже не представляю, куда копать.
Также общий вывод о SBC. Если есть графический процессор MALI, не покупайте его.
Постоянно публикуется информация, что этот драйвер с открытым исходным кодом наконец-то научился работать с MALI, но все это, скорее всего, закончится каким-нибудь DRI2: не удалось пройти аутентификацию или очень большая головная боль с кросс-компиляцией.
Лично я считаю наиболее перспективным SBC на сегодняшний день СТМ32МП157С-ДК2 Потому что он действительно открытый, а не MALI, и процессоры можно купить даже в розницу.
А дальше я продолжу рассказ на примере OrangePi 4B. Но благодаря тому, что и собирают, и используют Qt Мы будем на одной машине, туториал подходит практически для всех SBC.
Сборка Ubuntu
На Orange Pi 4B Ubuntu 18, скачанная с сайта производителя, на удивление успешно обновилась до Ubuntu 20.04. стандартным способом ( есть нюанс ).Также стоит отметить, что xunlong неожиданно выпустил рабочий скрипт для сборки Ubuntu, вот как можно собрать свою сборку (запускается только на Ubuntu 18 x86_64):
Перед сборкой можно включить нужную и отключить ненужную периферию (spi, uart) в файле rk3399-orangepi-common.dtsi А если вы хотите установить собственное имя пользователя по умолчанию, в файле Configuration.sh есть свойство OPI_USERNAME. В этом же файле можно указать пакеты, которые должны появиться в образе и их не придется переустанавливать.git clone https://github.com/orangepi-xunlong/orangepi-build.git && cd orangepi-build .
/build.sh
Полученный файл .
img можно прошить на microsd через балена .
Начало работы
Прежде чем писать код обновлять компилятор.Здесь нам необходимо уточнить:
- gcc — это компилятор C
- g++ — компилятор C++
- напишите в консоли gcc --version или g++ --version, чтобы увидеть версию компилятора
- g++ является компилятором по умолчанию, но в вашей системе могут быть g++-9 и g++-10, следите за тем, что скрывается в вашей системе.
символическая ссылка g++ (т.е.
проверить версию)
sudo ln -s -f g++-10 /usr/bin/g++
Теперь g++ будет означать версию 10. Для gcc добавьте ее самостоятельно.
Внимательный читатель уже сделал вывод об общей структуре Linux: всегда можно запустить то, что находится в каталоге /usr/bin, хотя бы в виде симлинков.
Все остальное нужно запускать, обращая внимание на каталог, в котором вы сейчас находитесь.
Консольная команда ls очень удобна для самостоятельного поиска.
Если вчера мы писали на C, то его ближайшим родственником в мире SBC является C++.
На нем можно писать полнофункциональные приложения, используя все возможности SBC. А поскольку вам нужно все готовое, я рекомендую Qt. В двух словах, Qt — это дамп, а в дампе, как известно, есть все: графический интерфейс, ком-порт, Ethernet, 3D, рисование графиков, XML-парсер и многое другое… Ubuntu имеет существенное отличие от других операционных систем.
Исполняемость — это атрибут, означающий, что исполняемый файл должен быть помечен как исполняемый, чтобы его можно было запустить.
Также в Ubuntu нет расширений файлов, хотя их никто не запрещает использовать, Ubuntu их не анализирует. Итак, для создания кода на Qt у нас есть два пути.
Соберите код на мощном персональном компьютере и разверните его на SBC или соберите код на самом SBC. С одной стороны, мне не удалось настроить кросс-компиляцию, с другой — мой ноутбук по мощности сравним с OrangePi 4B. Qt — это действительно кроссплатформенный фреймворк.
Это означает, что при работе с Qt вы сталкиваетесь с вещами, о которых не задумываетесь при работе со многими другими продуктами.
IDE Qt Creator и Qt легко скачиваются с официального сайта, но только под x86_64 (у меня AArch64) и там Qt собирается динамически.
Динамическая сборка означает, что Qt не создает ни одного исполняемого файла после сборки, но проект состоит из множества частей.
А чтобы после сборки получить единый исполняемый файл, нужно собрать Qt статически, получить qmake и обрабатывать с помощью этого qmake пользовательские проекты.
Сборка Qt
О сборке Qt 5.15 можно говорить бесконечно.Однако ограничусь примером минималистической сборки.
Итак, мне нужен графический интерфейс, com-порт и инструмент для рисования графиков.
При этом хочется не только писать на C++20, но и чтобы стандартные библиотеки тоже были соответствующей версии.
Вот что происходит, когда стандартные библиотеки (привет std) неправильная версия .
Создание программы в Ubuntu обычно предполагает соблюдение правила сборки вне исходного кода.
Не рекомендую пытаться проводить манипуляции за пределами родительского каталога! Также не рекомендую использовать файловые системы, отличные от ext4, и использовать виртуальные хранилища для сборки.
Итак, у нас есть базовый каталог QtFromGit, Давайте двигаться дальше в него в консоли.
Дальше мы будем следить инструкции Разместим каталог сборки для сборки (в него будет собираться мусор от компилятора) и каталог build_artifacts для результата сборки, где будет находиться заветный qmake в случае успешной сборки.
Загрузите с QtFromGit Qt: git-клон git://code.qt.io/qt/qt5 qt5 && cd qt5 && git checkout 5.15 Далее инициализируем репозиторий, указывая какой модули нам (не) нужно.
Название модулей в системе сборки пишется одним словом, все буквы строчные.
Если вы используете Qt впервые и не понимаете, что вам нужно, лучше скачать Qt на ПК и устраивайтесь поудобнее .
perl init-repository --module-subset=default,qtcharts,qtserialport,-qtactiveqt,-qtcanvas3d,-qtdocgallery,-qtfeedback,-qtserialbus,-qtconnectivity,-qtdeclarative,-qtquickcontrols2,-qtsvg,-qtquickcontrols,-qtwebengine,- qtwayland,-qtandroidextras,-qtdoc,-qtgraphicaleffects,-qtqa,-qttranslations,-qtvirtualkeyboard,-qtquicktimeline,-qtquick3d,-qtrepotools,-qttools,-qtshadertools,-qtimageformats,-qtnetworkauth,-qtwebsockets,-qt5compat,- qtmqtt,-qtopcua,-qtscxml, -qt3d,-qtsensors,-qtquicktimeline,-qtmultimedia,-qtdatavis3d,-qtscript,-qtgamepad,-qtlottie,-qtmacextras,-qtremoteobjects,-qtlocation,-qtspeech,-qtwebchannel,-qtwebglplugin,-qtwebview,-qtwinextras,-qtpurchasing ,-testsuites,-qtxmlpatterns Вариант А: Для использования с X11: cd .
/build && .
/qt5/configure -release -static -opensource -make libs -nomake example -nomaketests -confirm-license -no-pch -no-xcb -no-xcb-xlib -no-gtk - пропустить webengine -skip qtwayland -skip qtdoc -skip qtgraphicaleffects -skip qtqa -skip qttranslations -skip qtvirtualkeyboard -skip qtquicktimeline -skip qtquick3d -skip qt3d -skip qtrepotools -skip qttools -skip qtimageformats -skip qtnetworkau th -skip qtwebsockets -ski п qtactiveqt -skip qtmacextras -skip Winextras -skip qtmultimedia -skip qtgamepad -skip qtserialbus -skip qtspeech -skip qtsensors -skip qtcharts -skip qtlocation -opengl es2 -qpa eglfs -no-ssl -c++std c++2a -prefix .
/build_artifacts Вариант Б.
Для режима киоска: экспорт QT_QPA_EGLFS_INTEGRATION=eglfs_kms экспорт QT_DEBUG_PLUGINS=1 cd .
/build && .
/qt5/configure -release -static -opensource -make libs -nomake example -nomaketests -confirm-license -no-pch -no-xcb -no-xcb-xlib -no-gtk - пропустить webengine -skip qtwayland -skip qtdoc -skip qtgraphicaleffects -skip qtqa -skip qttranslations -skip qtvirtualkeyboard -skip qtquicktimeline -skip qtquick3d -skip qt3d -skip qtrepotools -skip qttools -skip qtimageformats -skip qtnetworkau th -skip qtwebsockets -ski п qtactiveqt -skip qtmacextras -skip Winextras -skip qtmultimedia -skip qtgamepad -skip qtserialbus -skip qtspeech -skip qtsensors -skip qtcharts -skip qtlocation -kms -opengl es2 -qpa eglfs -no-ssl -c++std c++2a -prefix .
/build_artifacts После выбора варианта соберем и установим Qt сделать -j8 сделать установку В процессе сборки следите за потреблением оперативной памяти! Это можно сделать с помощью htop. Если вы превысите разумный предел, используйте файл подкачки! После сборки Qt нам нужно сделать так, чтобы нам было удобно запускать qmake из любого места, чтобы не приходилось каждый раз писать полный путь к qmake. sudo ln -s полный путь/QtFromGit/build_artifacts/bin/qmake/usr/bin/qmake Далее соберем qtcharts. В каталоге QtFromGit создайте каталог с именем build_qtcharts. Перейдите к нему с помощью cd build_qtcharts. qmake .
/qt5/qtcharts/qtcharts.pro INCLUDEPATH+=.
/qt5/qtcharts/include/QtCharts CONFIG+=release сделать -j8 сделать установку Итак, мы установили Qt на Orange Pi 4B. Чтобы использовать ком-порт, не забудьте добавить пользователя в группу дозвона и перезагрузиться.
В случае проблем со сборкой можно вызвать make clean, но это занимает очень много времени, поэтому проще удалить все файлы в папке сборки.
В случае проблем с настройкой (например, Qt не увидел некоторые модули, которые вы установили после настройки), рекомендуется выполнить очистку и перенастройку.
Очистка: cd .
/qt5 && git submodule foreach --recursive "git clean -dfx" && git clean -dfx && cd .
/build
О памяти
В моем случае потребление памяти следующее.Размер папки qt5 (исходники Qt) — 325 МБ.
Размер папки сборки (мусор от компилятора) - 143 МБ.
Папку с исходным кодом и мусором сборки можно удалить после успешной установки Qt. Размер папки build_artifacts, содержащей статически собранный Qt, составлял 150 МБ.
Но цифры могут достигать нескольких десятков ГБ, если настроить Qt с большим количеством модулей.
Потребление оперативной памяти также важно.
В моем случае хватило 4 ГБ ОЗУ и файла подкачки объемом 1,8 ГБ.
По моему опыту этого будет достаточно для сборки Release, но если вы хотите собрать с флагом -developer-build (чтобы иметь много версий Qt на одной машине), то будьте готовы предоставить более 12 ГБ общей оперативной памяти + файл подкачки.
В моем случае сборка заняла около 3 часов.
Применение
Статически собирая Qt, вы получаете файл qmake, который можно использовать для сборки ваших приложений.В принципе, вы можете собрать или установить Qt Creator на SBC и писать код на самом SBC. Но если вы пишете код на другом компьютере, исходные коды необходимо перенести в SBC; это можно удобно сделать, запустив терминал на своем ноутбуке и запустив rsync: rsync -avz myScr а @ $IP:myQtProj где a — имя пользователя SBC, $IP — адрес SBC в локальной сети (локальную сеть можно организовать через роутер, а можно раздать wifi с ноутбука и подключить SBC к этой сети), myQtProj — папка на SBC, куда поместить данные; myScr — это папка на вашем ноутбуке, из которой вы можете получать данные.
Адрес $IP можно установить один раз с помощью переменных среды.
Предполагается, что на вашем ноутбуке также установлен Linux, в целом стоит отметить, что использование однотипной операционной системы (Ubuntu) на основной рабочей станции и на SBC значительно облегчает понимание постоянно возникающих нюансов.
Попытаться справиться с SBC, используя Windows или тому подобное на основном рабочем месте, будет намного и неоправданно сложнее.
Лучше собирать проект, используя правило сборки вне исходного кода, но здесь я покажу, насколько это неправильно: qmake .
/test1.pro CONFIG+=release DESTDIR=~ && make -j6 неправильно находиться в исходном каталоге вашего проекта и засорять его промежуточными файлами сборки; Правильно: создайте папку сборки и собирайте оттуда.
cd build && qmake .
/QtProjSource/test1.pro CONFIG+=release DESTDIR=~ && make -j6 ДЕСТДИР позволяет указать каталог, в котором будет размещен исполняемый файл (в данном случае в каталоге ~ , то есть домой).
Вторая часть посвящен миганию светодиодов.
Это руководство будет полезно программистам, которые перешли с avr или stm32 на одноплатные компьютеры под управлением Ubuntu. Какой именно дистрибутив Linux использовать, решать вам, но Ubuntu — самый дружелюбный дистрибутив.
Теги: #Qt #SBC #Orange Pi #сборка из исходного кода #сборка статического Qt
-
Uwp — Проблема № 227
19 Oct, 24 -
И Снова О Чиновниках
19 Oct, 24 -
Еще Руткиты – «Хорошие» И Разные. Часть Ii
19 Oct, 24