Не так давно состоялся релиз PureBasic версии 6.00, в котором среди прочего добавлена поддержка ARM процессоров. В списке платформ присутствует Raspberry PI, но вероятно должны поддерживаться и другие похожие одноплатные компьютеры. Мною была проверена работа на большинстве моделей Raspberry PI включая самую простую - Zero и топовую на текущий момент - 4B. На всех была установлена Raspberry Pi OS April 4th 2022. Как и ожидалось, PureBasic запустился и нормально работал на всех тестовых Raspberry PI.
Небольшое пояснение для тех кто не знает что такое PureBasic
PureBasic это компилируемый язык программирования, созданный в начале двухтысячных годов для компьютера Amiga. По мере своего развития, были добавлены другие платформы включая Windows, Linux и Mac OS X для процессоров Intel, AMD, ARM и PowerPC. По моему мнению, это один из лучших современных диалектов бейсика. Не последнюю роль в этом сыграла кроссплатформенная библиотека насчитывающая почти 2 тысячи функций различной направленности. Среди них присутствуют функции работы с растровой, векторной, 2D и 3D графикой. Поддержка баз данных типа MySQL, SQLite, PostgreSQL, ODBCD и других. Работа с файлами, с сетью (FTP, HTTP/HTTPS, Mail), GUI и многое другое. Наличие поддержки многопоточности позволяет в полной мере задействовать все ядра процессора в ресурсоемких вычислениях. Ознакомится с полным списком функций можно в онлайн документации https://www.purebasic.com/documentation/
Благодаря кроссплатформенной библиотеке воможно перенести приложения изначально разработанные для компьютера с Windows или MacOS X на Raspberry Pi.
Язык программирования PureBasic довольно прост и его не сложно изучить. Почти все что нужно можно найти в справке входящей в дистрибутив. Она на английском, но в сети есть переведенная на русский.
PureBasic подойдет тем кому нужно разработать приложение для Raspberry Pi или других платформ, без необходимости изучения особенностей операционной системы и функционирования компьютера. С решением большинства задач прикладного уровня справится кроссплатформенная библиотека без необходимости применения функций ОС.
Для установки PureBasic на Raspberry Pi, его следует скачать с официального сайта https://www.purebasic.com Нужно выбирать версию, соответствующую разрядности операционной системы. То есть для 32-ух битной ОС необходим архив для arm32, а для 64-ех битной ОС – arm64.
Установка выполняется путем извлечения архива в любую папку (например, в домашнюю текущего пользователя) на которую есть права доступа. Дальнейшие действия описаны в файле INSTALL из архива.
Фрагмент из файла INSTALL
Installation
Unpack Purebasic
Create in "Private Folder" an Apps folder
Unpack Purebasic into this folder
Rename folder with versions number. Example "purebasic" -> "purebasic-v572"
Install developer packages
Info: Required Webkit not available on Ubuntu bigger version 18.04. Support of Webkit2gtk with Purebasic v6.00 (Ubuntu 20.04/gtk3)
Start Terminal and install packages
Update compiler and default libraries
sudo apt-get install build-essential gcc g++
Developer Libraries
sudo apt-get install libxxf86vm-dev libxine2-dev unixodbc-dev libsdl1.2-dev libsdl2-dev libssl-dev
sudo apt-get install libgtk2.0-dev libgtk-3-dev
Ubuntu 18.04
sudo apt-get install libwebkitgtk-dev libwebkitgtk-3.0-devUbuntu 20.04 / Raspberry PI Desktop
sudo apt-get install libwebkit2gtk-4.0-devRaspberry PI Desktop / Movie Library
sudo apt-get install libvlc-dev
Developer Libraries For Games
sudo apt-get install libgl1-mesa-dev libgl1-mesa-glx
Subsystem qt
sudo apt-get install qtbase5-dev qttools5-dev qtmultimedia5-dev qtdeclarative5-dev libqt5svg5-dev libqt5webkit5-dev libqt5multimedia5-plugins
Canberra for PB-IDE (Raspberry PI not need)
sudo apt install libcanberra-gtk-module
Ubuntu missing default libs (Without developer packages)
gtk2:
sudo apt-get install libgtk2.0
gtk3:
Ubuntu 18.04
sudo apt-get install libwebkitgtk-3.0Ubuntu 20.04 / Raspberry PI Desktop
sudo apt-get install libwebkit2gtk-4.0
qt:
sudo apt install qt5-default
Для компиляции приложений следует установить несколько пакетов разработчика (dev). Их список приведен в файле INSTALL и зависит от типа разрабатываемых приложений. Или можно установить все требуемые пакеты (излишне во многих случаях) выполнив в терминале строку.
sudo apt-get install build-essential gcc g++ libxxf86vm-dev libxine2-dev unixodbc-dev libsdl1.2-dev libsdl2-dev libssl-dev libgtk2.0-dev libgtk-3-dev libwebkit2gtk-4.0-dev libvlc-dev libgl1-mesa-dev libgl1-mesa-glx qtbase5-dev qttools5-dev qtmultimedia5-dev qtdeclarative5-dev libqt5svg5-dev libqt5webkit5-dev libqt5multimedia5-plugins
Весь процесс от скачивания PureBasic, до установки пакетов и запуска тестового приложения можно посмотреть на видео.
В папке examples находятся несколько десятков различных примеров программ. Запуск некоторых из них показан на видео.
Версия PureBasic для Linux предоставляет на выбор три GUI подсистемы – GTK2, GTK3 (по умолчанию) и Qt. Для этого не требуется вносить изменения в код. Достаточно указать подсистему в настройках компилятора.
На Raspberry Pi 4B прекрасно работают примеры 3D приложений, несмотря на то что "малина" не предназначена для 3-ех мерной графики.
Небольшие подергивания картинки из-за записи видео с экрана и его кодирования. Без этого анимация плавная.
Для доступа к железу "малины" сообщество написало ряд библиотек или интерфейсов к существующим. Со списком можно ознакомиться в теме на официальном форуме https://www.purebasic.fr/english/viewtopic.php?t=78338
https://www.purebasic.fr/english/viewtopic.php?t=78440
Рассмотрим один из примеров, считывающий температуру процессора "малины" и отображающий ее в окне.
; Файл из которого нужно считывать температуру.
If ReadFile(0, "/sys/class/thermal/thermal_zone0/temp", #PB_UTF8) = 0
MessageRequester("", "Нет доступа к файлу", #PB_MessageRequester_Error)
End
EndIf
; Создание окна.
OpenWindow(0, 0, 0, 250, 90, "CPU Temp", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
TextGadget(0, 0, 20, 250, 80, "", #PB_Text_Center)
SetGadgetFont(0, LoadFont(0, "FreeSans", 28, #PB_Font_Bold))
; Таймер с периодом 1 секунда.
AddWindowTimer(0, 0, 1000)
PostEvent(#PB_Event_Timer, 0, 0) ; Отправка события таймера чтобы температура появилась сразу, а не через секунду после запуска приложния.
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Timer And EventTimer() = 0 ; Сработал таймер.
FileSeek(0, 0) ; Переход в начало файла.
temp.d = ValD(ReadString(0))/1000 ; Чтение из файла и перевод с тысячных долей градуса в целые.
SetGadgetText(0, StrD(temp, 3)+" °C") ; Отображение в температуры в окне.
EndIf
Until Event = #PB_Event_CloseWindow
CloseFile(0)
В начале программы функция ReadFile() открывает системный файл из которого в дальнейшем будет считываться температура. В случае недоступности файла, появляется соответствующее сообщение и на этом работа программы завершается.
При успешном открытии файла создается окно и текстовое поле в нем методом вызова функций OpenWindow() и TextGadget().
Функция AddWindowTimer() добавляет таймер в окно с периодом 1000 миллисекунд (секунда), и через эти промежутки времени регулярно будет генерироваться событие.
В цикле, функция WaitWindowEvent() ожидает ближайшего события и возвращает его код. Если это событие таймера, производится чтение температуры из файла и отображение в окне.
В случае события закрытия окна, цикл прервется и работа программы на этом завершится.
Комментарии (16)
Schokn-Itrch
03.07.2022 23:55Не так давно состоялся релиз PureBasic версии 6.00, в котором среди прочего добавлена поддержка ARM процессоров.
ARM не процессоры, а архитектура. И это такая дичь, по сравнению с которой любая другая дичь - порядок.
Именно поэтому развитие ARM как универсальной архитектуры буксует. Код предназначенный для x86 будет выполнен на любом x86. Ограничения редки и "ступенчаты". x86/386/P5/P5x/x86-64 и...? 5 ступеней за 40 лет. А ARM? Каждый SOC - "вещь в себе", или он, или никто. В лучшем случае "медленно и упорото".
screwer
04.07.2022 01:26+1Изначальный 4юайтовый ARM совсем не дичь. Дичью он начал становиться с появлением thumb (окей, здесь плотность кода, и для микроконтроллеров рыхлый изначальный арм не супер), thumb 2, thumb 3 - когда стало ясно что 16 битная кодировка thumb не только плотна, но ещё и убога. Посмотрите как кодируется длинный прыжок в 32битах thumb. Это прям запредельный маразм.
После чего сделали aarch64, который гораздо ближе к х86 по богатству команд, имеет много регистров, и без чехарды с разными системами опкодов и разными длинами команд.
Но это все ещё не дичь.
Хотите дичи - добро пожаловать во VLIW и DSP. Например Куалкоммовский Hexagon.
Lintik Автор
05.07.2022 15:39Работаем с тем что есть, а есть Raspberry PI с ядром ARM. Ее ближайшие аналоги с Intel x86 процессором стоят значительно больше. За недорого можно купить апельсин, банан и прочие "фрукты", но все они построены на ARM, а не на Intel.
praeivis
04.07.2022 08:09Код больше напоминает С чем basic - синтаксис очень стираный.
Lintik Автор
05.07.2022 15:43На FreeBasic посмотрите. Он точно Си с синтаксисом бейсика.
PureBasic содержит некоторые операторы (логические, битовые) как в Си, но все же у него языковых конструкций больше из бейсика.
ivanstor
04.07.2022 09:16+3Не помешало бы сообщить, что компилятор платный.
Lintik Автор
05.07.2022 15:34Да платный. Стоимость 79 евро за все существующие версии и выпущенные в дальнейшем для всех платформ. Стоит не много с учетом что поддерживаются Windows, Linux, MacOS, AmigaOS для процессоров x86, x64, PowerPC и ARM. Чего только стоит кроссплатформенная библиотека функций и IDE с поддержкой отладки. Приложения компилируются в натив без виртуальных машин как это часто бывает при кросплатформенности и размеры исполняемых файлов невелики.
axe_chita
04.07.2022 19:49К сожалению FreeBASIC генерить для ARM не умеет. Может кто нибудь добавит в него поддержку RPi?
Lintik Автор
05.07.2022 00:04axe_chita
05.07.2022 19:13Прошу пардону, меня в заблуждение ввел официальный сайт FreeBasic своей цитатой о поддержке только архитектуры x86:
«The FreeBASIC project is a set of cross-platform development tools, consisting of a compiler, GNU-based assembler, linker and archiver, and supporting runtime libraries, including a software-based graphics library. The compiler, fbc, currently supports building for i386-based architectures on the DOS, Linux, Windows and Xbox platforms.»
Хотя поддержка ARM/aarch64, если верить changelog.txt, появилась ещё в версии 1.0.
randomsimplenumber
Синтаксис
ужасныйстранный ;)FileSeek(0, 0) - я, конечно, догадываюсь, это аналог fseek. И один из параметров должен быть file handle. Но почему это не переменная, а константа?
LinXP
nFile=ReadFile(#PB_Any, "example.txt")
FileSeek(nFile, 0)
можно и так
axe_chita
Потому что это Basic, и так исторически сложилось. По факту в Basic, для работы с файлом, его надо открыть через OPEN имя FOR режим AS номер открытого файла, причем номер открытого файла это не хэндл ОС, а абстрактный номер от нуля до MAXFILES (максимальное количество файлов, которые могут быть открыты одновременно OPEN), которым оперирует BASIC при работе с файлом.
Можно ли использовать переменную в место константы? Не помню точно, но скорее всего да можно, но нецелесообразно, так как значение MAXFILES (in old good BASIC) не могло превышать 15.
Lintik Автор
Первый параметр - идентификатор файла. Второй - новая позиция. https://www.purebasic.com/documentation/file/fileseek.html
Пояснение по поводу константных идентификаторов https://www.purebasic.com/documentation/reference/purebasic_objects.html