Как запустить HelloWorld на ARM
Мне нужно запустить HelloWorld на руку. Я запускаю:
$ arm-none-eabi-g++ -mthumb -mcpu=cortex-m3 -c test.cpp -o test
$ file test
test: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), not stripped
$ qemu-arm test <br>
Error while loading test: Permission denied
1 ответ
qemu-system-arm -machine help
...
lm3s811evb Stellaris LM3S811EVB
...
Из таблицы данных lm3s811 или из источника исходного кода stellaris на оборудовании qemu arm. Базовый адрес Uart0 - 0x4000C000, регистр данных (rx и tx) - 0x000. Исходя из опыта, серверы qemu не беспокоятся о том, что буфер tx занят...
flash.s
.cpu cortex-m0
.thumb
.thumb_func
.global _start
_start:
.word 0x20001000
.word reset
.word hang
.word hang
.word hang
.word hang
.word hang
.thumb_func
reset:
bl notmain
b hang
.thumb_func
hang: b .
.thumb_func
.globl PUT32
PUT32:
str r1,[r0]
bx lr
uart01.c
void PUT32 ( unsigned int, unsigned int );
#define UART0BASE 0x4000C000
int notmain ( void )
{
unsigned int rx;
for(rx=0;rx<7;rx++)
{
PUT32(UART0BASE+0x00,0x30+rx);
}
return(0);
}
flash.ld
MEMORY
{
rom : ORIGIN = 0x00000000, LENGTH = 0x1000
ram : ORIGIN = 0x20000000, LENGTH = 0x1000
}
SECTIONS
{
.text : { *(.text*) } > rom
.rodata : { *(.rodata*) } > rom
.bss : { *(.bss*) } > ram
}
Да, stellaris был первым кортексом-m3 в кремнии, который вы могли купить, и я указал cortex-m0. В основном предотвращение расширений thumb2 или большинства из них. Более портативный, может легко изменить это, если хотите.
arm-none-eabi-as --warn -mcpu=cortex-m0 flash.s -o flash.o
arm-none-eabi-gcc -Wall -O2 -nostdlib -nostartfiles -ffreestanding -mcpu=cortex-m0 -mthumb -c uart01.c -o uart01.o
arm-none-eabi-ld -o uart01.elf -T flash.ld flash.o uart01.o
arm-none-eabi-objdump -D uart01.elf > uart01.list
arm-none-eabi-objcopy uart01.elf uart01.bin -O binary
затем
qemu-system-arm -M lm3s811evb -m 16K -nographic -kernel uart01.bin
и вывод
0123456
ctrl-a затем нажмите x, чтобы выйти из qemu. или же
qemu-system-arm -M lm3s811evb -m 16K -kernel uart01.bin
затем Ctrl-Alt-3 (3 не F3) и последовательная консоль появляется с последовательным выходом. когда вы закрываете эту последовательную консоль, QEMU закрывается.
Я хочу вспомнить, как кто-то говорил мне, что поддержка qemu cortex-m3 не так хороша.
обычные ядра рук должны быть хорошо протестированы, так как они используются для кросс-компиляции для всех видов досок-мишеней рук. не знаю точно, какие ядра хорошо протестированы, но вы могли бы делать что-то для большого пальца, если вы загружались, как рука, но сделали все остальное на большом пальце, загрузившись с
.globl _start
_start:
b reset
b hang
b hang
b hang
reset:
mov sp,#0x20000
bl notmain
hang:
b hang
машина
versatilepb ARM Versatile/PB (ARM926EJ-S)
имеет UART в 0x101f1000, так
for(ra=0;;ra++)
{
ra&=7;
PUT32(0x101f1000,0x30+ra);
}
может создать ваше приложение с
arm-none-eabi-gcc -стена -O2 -nostdlib -nostartfiles -для просмотра -mcpu=arm7tdmi -mthumb -c uart01.c -o uart01.o
измените свой скрипт компоновщика, чтобы он был полностью основан на RAM.
MEMORY
{
ram : ORIGIN = 0x00000000, LENGTH = 32K
}
SECTIONS
{
.text : { *(.text*) } > ram
.bss : { *(.text*) } > ram
}
а потом
qemu-system-arm -M versatilepb -m 128M -nographic -kernel hello.bin
(хммм, эта нагрузка в 0x0000 или 0x8000? не должна быть слишком сложной для определения)
в основном вы можете почувствовать большой палец cortex-m (m0 в основном не m3, вы можете найти armv7- машину, на которой вы, вероятно, можете запустить встроенный код thumb2 (по-прежнему загружается как рука, а не cortex-m)). например
realview-pb-a8 ARM RealView Platform Baseboard for Cortex-A8
Вероятно, можно использовать newlib почти как есть, нужно изменить crt0.s или как это называется в наши дни, чтобы загружаться как рука, а не cortex-m. Остальные могут строить с помощью armv7m и теоретически будут работать.
И или начните со stellaris и просто сделайте собственную поддержку hw для любой вашей реальной цели и исправьте ядро cortex-m3, если / когда вы обнаружите проблемы.