Не так давно состоялся релиз 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-dev

  • Ubuntu 20.04 / Raspberry PI Desktop
    sudo apt-get install libwebkit2gtk-4.0-dev

  • Raspberry 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.0

  • Ubuntu 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)


  1. randomsimplenumber
    03.07.2022 23:28
    +1

    Синтаксис ужасный странный ;)

    FileSeek(0, 0) - я, конечно, догадываюсь, это аналог fseek. И один из параметров должен быть file handle. Но почему это не переменная, а константа?


    1. LinXP
      04.07.2022 09:14

      nFile=ReadFile(#PB_Any, "example.txt")
      FileSeek(nFile, 0)

      можно и так


    1. axe_chita
      04.07.2022 09:41

      Потому что это Basic, и так исторически сложилось. По факту в Basic, для работы с файлом, его надо открыть через OPEN имя FOR режим AS номер открытого файла, причем номер открытого файла это не хэндл ОС, а абстрактный номер от нуля до MAXFILES (максимальное количество файлов, которые могут быть открыты одновременно OPEN), которым оперирует BASIC при работе с файлом.
      Можно ли использовать переменную в место константы? Не помню точно, но скорее всего да можно, но нецелесообразно, так как значение MAXFILES (in old good BASIC) не могло превышать 15.


    1. Lintik Автор
      04.07.2022 15:28

      Первый параметр - идентификатор файла. Второй - новая позиция. https://www.purebasic.com/documentation/file/fileseek.html

      Пояснение по поводу константных идентификаторов https://www.purebasic.com/documentation/reference/purebasic_objects.html


  1. 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 - "вещь в себе", или он, или никто. В лучшем случае "медленно и упорото".


    1. screwer
      04.07.2022 01:26
      +1

      Изначальный 4юайтовый ARM совсем не дичь. Дичью он начал становиться с появлением thumb (окей, здесь плотность кода, и для микроконтроллеров рыхлый изначальный арм не супер), thumb 2, thumb 3 - когда стало ясно что 16 битная кодировка thumb не только плотна, но ещё и убога. Посмотрите как кодируется длинный прыжок в 32битах thumb. Это прям запредельный маразм.

      После чего сделали aarch64, который гораздо ближе к х86 по богатству команд, имеет много регистров, и без чехарды с разными системами опкодов и разными длинами команд.

      Но это все ещё не дичь.

      Хотите дичи - добро пожаловать во VLIW и DSP. Например Куалкоммовский Hexagon.


    1. Lintik Автор
      05.07.2022 15:39

      Работаем с тем что есть, а есть Raspberry PI с ядром ARM. Ее ближайшие аналоги с Intel x86 процессором стоят значительно больше. За недорого можно купить апельсин, банан и прочие "фрукты", но все они построены на ARM, а не на Intel.


  1. Kremleb0t
    04.07.2022 04:04
    +2

    Жаль только этот Raspberry Pi перестал продаваться в России ещё до начала войны.


    1. sintech
      04.07.2022 08:24

      И не только в России. За ррц нигде нет.


  1. praeivis
    04.07.2022 08:09

    Код больше напоминает С чем basic - синтаксис очень стираный.


    1. Lintik Автор
      05.07.2022 15:43

      На FreeBasic посмотрите. Он точно Си с синтаксисом бейсика.

      PureBasic содержит некоторые операторы (логические, битовые) как в Си, но все же у него языковых конструкций больше из бейсика.


  1. ivanstor
    04.07.2022 09:16
    +3

    Не помешало бы сообщить, что компилятор платный.


    1. Lintik Автор
      05.07.2022 15:34

      Да платный. Стоимость 79 евро за все существующие версии и выпущенные в дальнейшем для всех платформ. Стоит не много с учетом что поддерживаются Windows, Linux, MacOS, AmigaOS для процессоров x86, x64, PowerPC и ARM. Чего только стоит кроссплатформенная библиотека функций и IDE с поддержкой отладки. Приложения компилируются в натив без виртуальных машин как это часто бывает при кросплатформенности и размеры исполняемых файлов невелики.


  1. axe_chita
    04.07.2022 19:49

    К сожалению FreeBASIC генерить для ARM не умеет. Может кто нибудь добавит в него поддержку RPi?


    1. Lintik Автор
      05.07.2022 00:04

      1. axe_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.