Обзор bare metal программ для Raspberry Pi

В прошлой заметке я рассказал о таком явлении, как программирование на голом железе и пообещал поделиться тем, что мне удалось накопать по данному вопросу. Однако прежде чем начать рассказывать про первые шаги в этом направлении, стоит провести небольшой экскурс в программное обеспечение, которое написано в данном стиле. Во-первых, это даст понять какого уровня программы можно написать в стиле bare metal. А во-вторых, большинство этих программ распространяется с исходными кодами, и, таким образом, там можно будет подсмотреть как реализован тот или иной момент.

Однако прежде чем начать собственно обзор, я хотел бы остановиться на некоторых нюансах. Стоит иметь ввиду, что бум, если его так можно назвать, bare metal программ для Raspberry Pi приходится на период выхода первой модели этого микрокомпьютера. И, к сожалению, те программы, которые рассчитаны на первую модель, не будут работать на второй и последующих модификациях Raspberry Pi в силу другого, уже многоядерного, процессора и другой адресации периферии. И хотя не составляет большого труда внести коррективы в исходный код, чтобы программа заработала на других моделях, авторы в большинстве своём давно забросили свои разработки и готовые бинарники существуют только под первую Raspberry Pi. Ещё одним серьёзным ограничением является тот факт, что на сегодняшний день не существует полноценного эмулятора Raspberry Pi, на котором можно было бы оценить bare metal программы. Но даже если у вас есть первая модель Raspberry Pi, то вам может помешать оценить bare metal программы на реальном железе система ввода. Дело в том, что для подключения стандартных устройств ввода, таких как клавиатура, мышь и игровые манипуляторы на Raspberry Pi предусмотрены USB-разъёмы. Однако довольно сложно с помощью bare metal организовать полную поддержку USB-стека. Поэтому в большинстве bare metal программ для подключения устройств ввода используется разъём GPIO, который довольно легко программируется под любые нужды. Например, через GPIO можно подключить матричную клавиатуру от реального ZX Spectrum, геймпад от NES или SNES, и даже стандартную PS/2 клавиатуру.

Программы пишут на самых разных языках: ассемблер, Си, С++, Pascal, ZIf. В принципе, я полагаю, что bare metal программы можно писать на любой языке, для которого существуют компиляторы под ARM-процессоры. Лично мне интересен прежде всего ассемблер. Тем не менее в данном обзоре я расскажу о программах, написанных на разных языках.

PiFox

Свой небольшой обзор я хочу начать с игр. И первой на очередь будет PiFox. На мой взгляд, данная игра является самым показательным примером того, чего можно добиться на голом железе Raspberry Pi с помощью ассемблера. PiFox является клоном игры StarFox с игровой приставки SNES. Она была написана группой студентов-первокурсников из Лондона. Для нас игра представляет интерес, так как, во-первых, она полностью написана на ассемблере, а исходные тексты доступны на GitHub. И, во-вторых, игра одна из немногих, является вполне законченным продуктом с неплохим звуком и даже с 3D-графикой. Как я уже упомянул выше, игра рассчитана на запуск только на первой модели Raspberry Pi. Изображение выводится на компонентный разъём, а также на цифровой разъем HDMI. Тем не менее звук через HDMI, как большинстве bare metal приложений, недоступен — его можно послушать лишь через внешние колонки или наушники, подключенные к разъёму mini-jack. В качестве устройства управления поддерживается только геймпад от NES, подключенный к разъёму GPIO. Например, я без проблем подключил 9-пиновый контроллер в форм-факторе геймпада SEGA Genesis от какого-то новодельного клона Dendy.

Авторы PiFox почему-то недавно удалили видео с демонстрацией геймплея игры, на который ссылались все заметки о PiFox. Полагаю, что дело в музыке, которая полностью взята из StarFox с игровой консоли SNES. А, как известно, Nintendo бдительно следит за своей интеллектуальной собственностью. Однако игра настолько хороша, что я снял своё видео с её демонстрацией:

PiFox on Raspberry Pi 1 B+

ARM DOOM

Автор не выложил готовой сборки этой игры. То есть предлагается скомпилировать её самостоятельно. Однако, как выяснилось, современные версии компилятора отказываются переваривать данные исходники, вываливаясь с ошибкой. Пришлось потратить некоторое время, чтобы в итоге получить работающий файл игры.

На авторском видео этой игрой управляют с помощью самодельного контроллера, который состоит из макетной платы с кнопками и подключенной с помощью шлейфа к разъёму GPIO. При этом я сходу не обнаружил упоминания по какой схеме собран и подключен этот контроллер. А между тем при беглом просмотре исходного текста игры встречается упоминание инициализации USB-интерфейса и опроса клавиатуры.

Исходный текст можно скачать отсюда: https://github.com/kcsongor/arm_doom

ARM DOOM

Шахматы

Кроме того, что они написаны на языке ассемблер мне больше сказать нечего. Исходники доступны здесь: https://github.com/xu-ji/assembly_chess

Bare metal шахматы

Мультиплейерная аркадная игра ClashOS

Данная игра не дописана, однако интересна тем, что является bare metla приложением и пишется на языке Zig.

Домашняя страница проекта https://github.com/andrewrk/clashos

ClashOS

К играм также можно отнести и эмуляторы разных игровых приставок и компьютеров. Давайте посмотрим на некоторые из них.

ZXBaremulator

Отличный полноценный эмулятор ZX Spectrum. Написан на языке С++ с использованием библиотеки Circle, которая как раз и предназначена для программирования на голом железе Raspberry Pi.

Эмулятор, как и любое bare metal ПО грузится моментально, обеспечивает хорошую совместимость со Спектрумовским софтом. При желании вы можете даже подключить оригинальную ZX-клавиатуру. Единственный, на мой взгляд, недостаток — это закрытые исходники данного проекта.

Домашняя страница: https://zxmini.speccy.org/

ZXBaremulator

πBacteria

Ещё один эмулятор компьютера ZX Spectrum. Кроме базовой эмуляции модели с 48 Кб памяти ничего больше не умеет. Управление осуществляется с помощью настоящей ZX-клавиатуры, подключенной к порту GPIO микрокомпьютера. Вывод beeper’а и магнитофона также осуществляется через GPIO. Распиновка опубликована на домашней странице. Этот эмулятор, в отличие от предыдущего, написан на ассемблере, а исходники для компилятора nasm доступны для скачивания.

Домашняя страница (на испанском языке): http://πbacteria.speccy.org

Исходные тексты: http://sourceforge.net/p/emusscriptoria/code/HEAD/tree/piBacteria/

BMC64

BMC64 — это эмулятор домашнего компьютера Commodore 64. Я не фанат данной платформы, так что не могу оценить качество эмуляции и уровень совместимости, но в сети я встречал восторженные отзывы о BMC64.

Домашняя страница: https://accentual.com/bmc64/

BMC64

Pi64

Pi64 — ещё один эмулятор Commodore 64. Как и в предыдущем, случае не берусь судить о качестве эмуляции. Данный проект давно заброшен и на сегодняшний день не обновлялся уже 10 лет. Однако проект, как минимум, может быть интересен доступностью исходных текстов, которые вы можете скачать отсюда: https://github.com/sampopeltonen/Pi64

Эмулятор GameBoy by Peter Lemon

Данный эмулятор написан Питером Лемоном и входит в состав его известного пакета примеров bare metal программирования, о котором я обязательно расскажу в одной их следующих заметок. Как и все остальные примеры пакета, этот эмулятор написан на ассемблере. Управление осуществляется с помощью геймпада от NES, подключенного по той же схеме, что и игра PiFox, описанная выше.

Скачать исходные тексты и откомпилированный образ можно со странички автора на Github: https://github.com/PeterLemon/RaspberryPi/tree/master/EMU/GameBoy

CS107E-GB-Emulator

Ещё один эмулятор GameBoy, написанный в процессе образовательного процесса в Стенфорде. В отличие от эмулятора Питера Лемона, данный эмулятор написан на языке Си. Управление осуществляется при помощи контроллера от SNES, подключенного к порту GPIO. Больше мне сказать об этом эмуляторе нечего.

Исходники вы найдёте здесь: https://github.com/angeris/CS107E-GB-Emulator

Faux86

Faux86 представляет из себя эмулятор PC с процессором Intel 8086. Эмулируется графика вплоть до VGA, а также PC speaker, Adlib и Soundblaster. В основе проекта лежит эмулятор другого автора, написанный на языке С. Однако кое-что в ядре и обвязка в Faux86 переписаны на С++.

Страничка на Github: https://github.com/jhhoward/Faux86

Faux86

Ну и здесь же нельзя обойти тему demo, хотя данный вид компьютерного творчества не относится ни к играм, ни к эмуляторам.

Pi on Fire

Одним из популярных направлений на Спектруме является написание демок. Не обошло это явление и Raspberry Pi. Правда, кроме Pi on Fire мне не удалось найти ещё demo, написанных в стиле bare metal.

Дема написана на языке Си под операционную систему VMWos (см. ниже). Сборка представляется из себя монолитный исполняемый файл объёмом 1,5 Мб предназначенный для запуска только на Raspberry Pi 1. Данная демонстрация участвовала в фестивале Demosplash 2019, который проводился 9 ноября 2019 года, и завоевала там второе место в категории Modern Demo. Демка, конечно, незамысловатая, однако даёт представление о возможностях bare metal программирования. Ретрокомпьютерщикам будет также интересно и то, что звуковое сопровождение 6-ти канальное, оно написано в PT3, а для воспроизведения используется эмулятор двух чипов AY-3-8910.

Почитать дополнительную информацию об этой деме, а также скачать исходный код можно на домашней странице: http://www.deater.net/weave/vmwprod/pionfire/

Pi on Fire

И в заключении от развлекательного ПО мне хотелось бы перейти к ПО системному.

Первое, что скорее всего большинству приходит в голову при мыслях о bare metal – заставить работать железяку как компьютер, то есть написать свою операционную систему. Мне попадалось несколько таких самописных систем, но я хочу остановиться на двух, причём одна из них — это не совсем система, а скорее эмулятор.

Многозадачная операционная система VMWos

Написана на Си. Поддерживаются все модели Raspberry Pi, кроме последней 4-й модели. Однако, чтобы иметь возможность сделать что-то полезное в этой системы необходимо подключить консоль через USB или серийный кабель, либо воспользоваться PS/2 клавиатурой, подключенной через GPIO.

Домашняя страница: http://www.deater.net/weave/vmwprod/vmwos/

Исходный код: https://github.com/deater/vmwos

VMWos v0.20

EMUZ80 RPI

Данный софт является эмулятором популярной дисковой системы CP/M. Проект написан на Lazarus / Free Pascal. Как в предыдущей операционной системе, поддерживается вся линейка Raspberry Pi за исключением Raspberry Pi 4.

Домашняя страница: http://www.projekte.daleske.de/prog/11_EMUZ80_RPI/prog_EMUZ80_RPI_en.htm

На домашней странице доступен исходный код эмулятора и полезные программы под CP/M.

На этом мой обзор закончен. Безусловно, я не смог охватить всё то, что написано под голое железо Raspberry Pi. Но даже данная подборка позволяет судить о разнообразии и возможностях такого стиля программирования.

Если вы знаете какой-то другой любопытный bare metal проект, который не вошёл в данный обзор, я буду очень благодарен, если вы дадите на него ссылку.

4 thoughts on “Обзор bare metal программ для Raspberry Pi

  1. creator
    #

    В ZXBaremulator есть поддержка TR-DOS?

    1. CityAceE Автор сообщения
      #

      Точно, нет её! Запамятовал 🙁 Спасибо, исправил эту неточность.

  2. creator
    #

    Вот интересно, существет ли bare metal мультизагрузчик, чтобы распихать все эти программы по папкам типа 1, 2, 3, …. на µSD карте, а затем выбирать из меню, какую из них загружать.

  3. CityAceE Автор сообщения
    #

    При изучении вопроса мне ничего похожего не попадалось. Думаю, что тут попахивает микроосью. По крайней мере нужно уметь читать каталог FAT32 и обрабатывать внешние события (клавиатуру или что-то ещё для управления).

Оставить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Защита от спама * Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.