Как запустить 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, если / когда вы обнаружите проблемы.

Другие вопросы по тегам