Программирование голого железа Raspberry Pi
Я уже затрагивал тему программирования голого железа (bare metal). Заметку на эту тему опубликовал здесь же на форуме. Сейчас решил вернуться к этой теме. Но понял, что она слишком обширна и, наверное, не до конца отвечает тематике нашего форума. В общем, в этой теме буду по мере появления у меня настроения потихоньку публиковать материалы по теме, а также отвечать на вопросы, если таковые возникнут.
Начну с того, без чего невозможно стартануть, чтобы запустить свой код на голом железе. Необходимо понимать как организован процесс загрузки Raspberry Pi. В какой файл нужно поместить свой код, с какого адреса скомпилировать и т.д. Вот ссылка на заметку Как загружается Raspberry Pi. Не стал публиковать эту информацию на форуме, чтобы не засорять его непрофильной информацией.
Программа "Hello, World!"
Для тех, кто хотел бы сделать первый шаг и, возможно, немного поэкспериментировать, приведу последовательность действий, которые необходимо произвести, чтобы запустить простейшую программу на ассемблере на голом железе под эмулятором. Здесь я буду описывать процесс для Windows.
Итак, для начала скачайте и установить эмулятор QEMU. Последнюю сборку под Windows можно скачать отсюда: https://qemu.weilnetz.de/w64/
Также нам потребуется кросс-ассемблер FASMARM для Windows. Скачать его можно отсюда: https://arm.flatassembler.net/
Далее скопируйте текст программы в блокнот и сохраните в файл HelloWorld.s:
Код:
org 0x6001000
mov r0, 0x9000 ; Загружаем в регистр r0 адрес консоли 0x10009000, вначале младшую половину
movt r0, 0x1000 ; а потом старшую половину
adr r1,text ; Загружаем в регистр r1 адрес начала текста
mov r2,0 ; Обнуляем счётчик в регистре r2
loop:
ldrb r3,[r1,r2] ; Загружаем в регистр r3 код следующего символа надписи
str r3,[r0] ; Выводим в консоль код символа из регистра r3
add r2,1 ; Увеличиваем счётчик на единицу
cmp r3,10 ; Сравниваем код символа с кодом перевода строки
bne loop ; Переходим к следующему символу, если код символа не равен коду перевода
finish:
b finish ; В конце программы зацикливаем строку саму на себя
text:
db "Hello, World!", 10
Сам я лично вместо стандартного блокнота пользуюсь Notepad++ и подсветкой синтаксиса, которую сделал похожей на привычный мне PyCharm:
https://pic.maxiol.com/images2/16928...helloworld.png
Распакуйте архив с ассемблером. Оттуда понадобится только исполняемый (.exe) файл. И положите рядом с ним ваш HelloWorld.s. Теперь всё готово для компиляции! Открываем консоль, переходим в папку с ассемблером и нашим файлом, и подаём команду:
Код:
fasmarm HelloWorld.s
https://pic.maxiol.com/images2/16928...84.compile.png
На выходе получаем файл HelloWorld.bin объёмом 54 байта. Теперь осталось только его запустить под эмулятором. Для запуска подаём такую команду в консоли:
Код:
"c:\Program Files\qemu\qemu-system-arm.exe" -M vexpress-a9 -serial stdio -kernel HelloWorld.bin
И наслаждаемся результатом:
https://pic.maxiol.com/images2/16928....consolehw.png
Появились вопросы? Задавайте!