В настоящее время я пытаюсь протестировать код сборки руки, который я написал. Я работаю над Ubuntu, поэтому скачал цепочку инструментов кросс-компилятора (arm-linux-gnueabi), чтобы скомпилировать свой код, а затем протестировать его с помощью qemu-arm. Но когда я пытаюсь скомпилировать с помощью arm-none-eabi-gcc, он компилируется, но не работает с qemu-arm. Я предполагаю, что это не работает, потому что я компилирую для голой металлической среды. Мой вопрос заключается в том, как я могу использовать qemu-system-arm вместо qemu-arm для имитации среды с голой металлической рукой и тестирования моего кода?
перекрестная компиляция сборки руки и имитация среды руки без ОС с помощью qemu в Linux
Ответы (1)
Вам нужна сборка, вам нужен только binutils, не используйте компилятор C для сборки, он может работать, но разве это не оставляет неприятный привкус во рту? Вероятно, вы не скомпоновали отдельно и/или оставили стандартный скрипт начальной загрузки и компоновщика с помощью arm-non-eabi-gcc. Пример ниже не заботится о arm-none-eabi- vs arm-linux-gnueabi-
Уарты Qemu, как правило, фактически не реализуют количество времени ожидания выхода символа и не требуют никакой инициализации, YMMV.
карта памяти
MEMORY
{
ram : ORIGIN = 0x00000000, LENGTH = 32K
}
SECTIONS
{
.text : { *(.text*) } > ram
}
so.s
.globl _start
_start:
b reset
b hang
b hang
b hang
b hang
b hang
b hang
b hang
hang: b hang
reset:
ldr r0,=0x101f1000
mov r1,#0
top:
add r1,r1,#1
and r1,r1,#0x07
orr r1,r1,#0x30
str r1,[r0]
b top
строить
arm-linux-gnueabi-as --warn --fatal-warnings -march=armv5t so.s -o so.o
arm-linux-gnueabi-ld so.o -T memmap -o notmain.elf
arm-linux-gnueabi-objdump -D notmain.elf > notmain.list
arm-linux-gnueabi-objcopy notmain.elf -O binary notmain.bin
бегать
qemu-system-arm -M versatilepb -m 128M -nographic -kernel notmain.bin
затем ctrl-a, затем x, чтобы выйти из консоли qemu обратно в командную строку.
Это напечатает 1234567012345670... навсегда или до тех пор, пока вы его не остановите
Другой способ бега
qemu-system-arm -M versatilepb -m 128M -kernel notmain.bin
а затем ctrl-alt-3 (не F3, а 3) переключится на консоль serial0, и вы сможете увидеть вывод и закрыть консоль qemu, когда закончите.
Есть и другие машины, с которыми можно поэкспериментировать. Их периферийные устройства, конечно, будут различаться, как и архитектура, большинство из них должны быть совместимы либо с инструкциями руки armv4, либо с инструкциями большого пальца, если это cortex-m.
Добавить функции C к этому довольно просто.