Как скомпилировать код ARMv8 для Raspberry pi 3 - PullRequest
0 голосов
/ 07 апреля 2019

Я следовал этому уроку на здесь , чтобы запрограммировать базовую ОС для моего raspberry pi. Я прочитал документацию и изменил регистры так, чтобы они работали, но поскольку Raspberry Pi 3 является 64-битной и, следовательно, использует ARMv8, lsl выходит за пределы. Я использую Mac, поэтому использовал YAGARTO и не знаю, как и где получить другой компилятор для 64-битных.

Код для всех, кто интересуется:

.section .init
.globl _start
_start:

ldr r0,=0x3f200000


mov r1,#1
lsl r1,#21
str r1,[r0,#16]


mov r1,#1
lsl r1,#47
str r1,[r0,#28]

loop$: 
b loop$

1 Ответ

1 голос
/ 08 апреля 2019

Я бы предложил взглянуть на примеры aarch64 Дэвида Уэлча для RaspberryPi 3 здесь .Его загрузчик позволяет загружать файлы в формате .hex для удобства.Для записи вы можете создать .hex из скомпилированного исполняемого файла, используя следующую команду:

aarch64-none-objcopy program.elf -O ihex example.elf example.hex

Что касается цепочки инструментов, Linaro и ARM, насколько я знаю, предоставляют только цепочки инструментов для Linux и mingw.Но вы можете использовать наборы инструментов, созданные отдельными лицами для OSX, такие как , этот , предоставленный Sergio Benitez.

Обновление: удобной альтернативой может быть установка u-boot на вашу SD-карту на основе превосходной процедуры, описанной здесь .

Предполагается, чтов / opt должен быть установлен набор инструментов aarch64-none, поэтому путь к aarch64-none-gcc будет:

/opt/aarch64-none/bin/aarch64-none-gcc

Упрощенная процедура, подходящая для ваших нужд, будет:

Создание минимального config.txt на вашей SD-карте,

enable_uart=1
arm_control=0x200
kernel=u-boot.bin

Копирование bootcode.bin , fixup.dat и start.elf на SD-карту,

Сборка u-boot,

wget ftp://ftp.denx.de/pub/u-boot/u-boot-2019.01.tar.bz2
tar Jxf u-boot-2019.01.tar.bz2
cd u-boot-2019.01
make CROSS_COMPILE=/opt/aarch64-none/bin/aarch64-none- ARCH=arm64  rpi_3_defconfig all

Копирование u-boot.bin на SD-карту - теперь оно должно содержать следующие файлы:

2019-04-08  06:03 PM               108 config.txt
2019-04-08  04:11 PM         2,873,444 start.elf
2019-04-08  04:11 PM            52,296 bootcode.bin
2019-04-08  04:11 PM             6,701 fixup.dat
2019-04-08  04:08 PM           479,872 u-boot.bin

Установка SD-карты в Raspberry-pi3, при условии, что у вас установлен ключ последовательного интерфейса к USB и эмулятор терминала настроен на использование последовательного порта USB со следующими настройками:

115200 bps, 8 data bits, 1 stop bit, no parity, no hardware flow control

Теперь вы можете включить устройство и нажать CTRL+C как можно скорее, чтобы прервать процесс загрузки:

U-Boot 2019.01 (Apr 08 2019 - 16:07:23 -0400)

DRAM:  948 MiB
RPI 3 Model B (0xa22082)
MMC:   mmc@7e202000: 0, sdhci@7e300000: 1
Loading Environment from FAT... *** Warning - bad CRC, using default environment

In:    serial
Out:   vidconsole
Err:   vidconsole
Net:   No ethernet found.
starting USB...
USB0:   scanning bus 0 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
Hit any key to stop autoboot:  0
U-Boot> <INTERRUPT>

Переменная среды загрузки установлена ​​на 2(в секундах), вам нужно установить его на -1 (бесконечно), чтобы избежать использования CTRL+C при каждой загрузке:

U-Boot> printenv bootdelay
bootdelay=2
U-Boot> setenv bootdelay -1
U-Boot> saveenv
Saving Environment to FAT... OK
U-Boot>

Если вы введете команду сброса, пи перезагрузится, ноu-boot остановится:

U-Boot> reset
resetting ...
U

‡t-Boot 2019.01 (Apr 08 2019 - 16:07:23 -0400)

DRAM:  948 MiB
RPI 3 Model B (0xa22082)
MMC:   mmc@7e202000: 0, sdhci@7e300000: 1
Loading Environment from FAT... OK
In:    serial
Out:   vidconsole
Err:   vidconsole
Net:   No ethernet found.
starting USB...
USB0:   scanning bus 0 for devices... 3 USB Device(s) found
       scanning usb for storage devices... 0 Storage Device(s) found
U-Boot>

Теперь вы можете использовать все доступные команды u-boot для проверки / изменения памяти и загрузки / выполнения программы:

Создайте файл с именем hello-aarch64.s со следующим содержимым:

                  .title "hello-aarch64.s"
                  .arch  armv8-a
                  .equ   AUX_MU_IO_REG, 0x3F215040  
                  .equ   AUX_MU_LSR_REG, 0x3F215054 
                  .text
                  .section .text.startup,"ax"    
                  .globl Reset_Handler
Reset_Handler:    stp  x29, x30,  [sp, #-16]!        
                  adr  x19, msg
                  ldr  x20,= AUX_MU_IO_REG
                  ldr  x21,= AUX_MU_LSR_REG
loop:             ldrb w0, [x19], 1                  
                  cbz  w0, done               
wait:             ldrb w1, [x21]
                  tbz  w1, #5, wait
                  strb w0, [x20]
                  b    loop
done:             ldp  x29,x30,  [sp], #16                 
                  ret
                  .balign 16
msg:              .asciz "Hello, aarch64 bare-metal world!\r\n"
                  .end

Поскольку мы будем вызывать программу из u-boot и не хотим ее аварийно завершать, программа должна соответствовать стандарту ARM Процедура вызова для64-битная архитектура ARM - это несколько излишне, потому что мы не вызываем какую-либо функцию, но это не имеет значения.

Программа может быть скомпилирована и файл s-записи создан с использованиемследующие команды:

CROSS_COMPILE= /opt/aarch64-none/bin/aarch64-none-
AS=${CROSS_COMPILE}as
LD=${CROSS_COMPILE}ld
OBJCOPY=${CROSS_COMPILE}objcopy
OBJDUMP=${CROSS_COMPILE}objdump
${AS} -o hello-aarch64.o hello-aarch64.s
${LD} -e Reset_Handler --section-start .text=0x00200000 -Map=hello-aarch64.map -o hello-aarch64.elf hello-aarch64.o 
${OBJCOPY} hello-aarch64.elf -O srec hello-aarch64.srec

Теперь можно загружать и запускать программу: введите в u-boot следующую команду:

U-Boot> loads
## Ready for S-Record download ...

Из эмулятора терминала отправьте файл hello-aarch64.srec в u-boot (без x-modem, без kermit, только файл как есть).

## First Load Addr = 0x00200000
## Last  Load Addr = 0x00200067
## Total Size      = 0x00000068 = 104 Bytes
## Start Addr      = 0x00200000
U-Boot>

Используйте команду go из u-boot для выполнения вашей программы (команда go на самом деле call one).

U-Boot> go 0x00200000
## Starting application at 0x00200000 ...
Hello, aarch64 bare-metal world!
## Application terminated, rc = 0x0
U-Boot>

Вот и все, теперь у вас должна быть отличная и стандартная среда для изучения языка ассемблера aarch64.

Извините, что многословно, но цель состояла в том, чтобы предоставить минималистский, но полныйпроцедура для людей, которым она понадобится.

...