如何在ARM上运行HelloWorld

时间:2017-02-21 15:43:21

标签: c++ arm qemu

我需要在手臂上运行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 个答案:

答案 0 :(得分:2)

qemu-system-arm -machine help
...
lm3s811evb           Stellaris LM3S811EVB
...

从lm3s811数据表或查看qemu arm硬件上stellaris后端的来源。 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是你可以购买的硅中第一个cortex-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 -Wall -O2 -nostdlib -nostartfiles -ffreestanding -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?,不应该太难搞清楚)

你可以获得大多数皮质m的拇指感觉(m0基本上不是m3,你可以找到一个armv7-一台你可以运行thumb2内置代码的机器(仍然像手臂而不是皮质m的靴子) )。例如

realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8

可能几乎可以使用newlib,需要更改crt0.s或者这些天所称的任何内容,如同一只手臂而不是一个cortex-m。其余的可以使用armv7m构建,理论上可行。

或者从stellaris开始,只需为你的真实目标做出自己的hw支持,并在发现问题时修复cortex-m3核心。