Sto cercando di ottenere un programma di tipo "Hello World" in esecuzione sul mio Beagleboard-xm rev. C, chiamando una funzione C puts
dall'assemblaggio.Hello world, bare metal Beagleboard
Finora ho usato questo come un punto di riferimento: http://wiki.osdev.org/ARM_Beagleboard
Ecco quello che ho finora, ma non c'è uscita.
ciao.c
volatile unsigned int * const UART3DR = (unsigned int *)0x49020000;
void puts(const char *s) {
while(*s != '\0') {
*UART3DR = (unsigned int)(*s);
s++;
}
}
void hello() {
puts("Hello, Beagleboard!\n");
}
boot.asm
.global start
start:
ldr sp, =stack_bottom
bl hello
b .
linker.ld
ENTRY(start)
MEMORY
{
ram : ORIGIN = 0x80200000, LENGTH = 0x10000
}
SECTIONS
{
.hello : { hello.o(.text) } > ram
.text : { *(.text) } > ram
.data : { *(.data) } > ram
.bss : { *(.bss) } > ram
. = . + 0x5000; /* 4kB of stack memory */
stack_bottom = .;
}
Makefile
ARMGNU = arm-linux-gnueabi
AOPS = --warn --fatal-warnings
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding
boot.bin: boot.asm
$(ARMGNU)-as boot.asm -o boot.o
$(ARMGNU)-gcc-4.6 -c $(COPS) hello.c -o hello.o
$(ARMGNU)-ld -T linker.ld hello.o boot.o -o boot.elf
$(ARMGNU)-objdump -D boot.elf > boot.list
$(ARMGNU)-objcopy boot.elf -O srec boot.srec
$(ARMGNU)-objcopy boot.elf -O binary boot.bin
Utilizzando solo il file asm come questo funziona.
.equ UART3.BASE, 0x49020000
start:
ldr r0,=UART3.BASE
mov r1,#'c'
Ecco alcuni Beagleboard/Minicom informazioni correlate: http://paste.ubuntu.com/829072/
Tutti gli indicatori? :)
Ho anche provato
void hello() {
*UART3DR = 'c';
}
sto usando minicom e inviare il file tramite Ymodem, poi cerco di eseguirlo con:
go 0x80200000
hardware e software di controllo il flusso in minicom è spento.
Funziona, grazie. Ora ho bisogno di capire cosa sto facendo male. È il primo pezzo di codice! = ASM che effettivamente stampa qualcosa. – farnsworth
Per ulteriori riferimenti se qualcuno ha problemi con questo. Ho modificato il Makefile CROSS_COMPILE = arm-none-linux-gnueabi mentre sto usando la toolchain di codesourcery per linux. Caricato il file con loady via ymodem, e mentre de memmap ha origine a 0x82000000 sono andato avanti e l'ho eseguito con 0x80200000 anche se si imposta l'origine su 0x82000000. – farnsworth
sia arm-none-linux-gnueabi che arm-none-eabi provengono da codesourcery, se non fai nessuna chiamata di sistema allora funzionerà. Presumibilmente la versione non linux è migliore se usi le chiamate gcclib (usa divide o modulo o cose del genere). –