precio - Hola mundo, bare metal Beagleboard
beaglebone caracteristicas (3)
No se puede simplemente escribir ciegamente una cadena de caracteres en un UART; es necesario verificar el estado de cada carácter; funciona en el ejemplo de un solo carácter porque el UART siempre estará listo para el primer carácter, pero para el segundo y Caracteres posteriores que necesita sondear (o mejor aún, usar un ISR, pero caminemos antes de ejecutar).
Aquí hay un buen código de ejemplo: http://hardwarefreak.wordpress.com/2011/08/30/some-experience-with-the-beagleboard-xm-part-2/
Estoy tratando de ejecutar un programa tipo ''hello world'' en mi Beagleboard-xm rev. C, al invocar una función C puts
del ensamblaje.
Hasta ahora he estado usando esto como referencia: http://wiki.osdev.org/ARM_Beagleboard
Esto es lo que tengo hasta ahora, pero no hay salida.
Hola 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
Usar solo el archivo asm como este funciona.
.equ UART3.BASE, 0x49020000
start:
ldr r0,=UART3.BASE
mov r1,#''c''
Aquí hay alguna información relacionada con Beagleboard / minicom: http://paste.ubuntu.com/829072/
¿Alguna sugerencia? :)
También intenté
void hello() {
*UART3DR = ''c'';
}
Estoy usando minicom y envío el archivo a través de ymodem, luego trato de ejecutarlo con:
go 0x80200000
El flujo de control de hardware y software en minicom está desactivado.
eso debería haber funcionado para ti. Aquí hay un código que desenterré de cuando, esta noche no lo intenté en un beagleboard, solo me aseguré de que compilara, había funcionado al mismo tiempo ...
startup.s:
.code 32
.globl _start
_start:
bl main
hang: b hang
.globl PUT32
PUT32:
str r1,[r0]
bx lr
.globl GET32
GET32:
ldr r0,[r0]
bx lr
Hola C :
extern void PUT32 ( unsigned int, unsigned int );
extern unsigned int GET32 ( unsigned int );
void uart_send ( unsigned char x )
{
while((GET32(0x49020014)&0x20)==0x00) continue;
PUT32(0x49020000,x);
}
void hexstring ( unsigned int d )
{
//unsigned int ra;
unsigned int rb;
unsigned int rc;
rb=32;
while(1)
{
rb-=4;
rc=(d>>rb)&0xF;
if(rc>9) rc+=0x37; else rc+=0x30;
uart_send(rc);
if(rb==0) break;
}
uart_send(0x0D);
uart_send(0x0A);
}
int main ( void )
{
hexstring(0x12345678);
return(0);
}
memmap (secuencia de comandos del enlazador):
MEMORY
{
ram : ORIGIN = 0x82000000, LENGTH = 256K
}
SECTIONS
{
ROM : { startup.o } > ram
}
Makefile:
CROSS_COMPILE = arm-none-eabi
AOPS = --warn --fatal-warnings
COPS = -Wall -Werror -O2 -nostdlib -nostartfiles -ffreestanding
all : hello.bin
hello.bin : startup.o hello.o memmap
$(CROSS_COMPILE)-ld startup.o hello.o -T memmap -o hello.elf
$(CROSS_COMPILE)-objdump -D hello.elf > hello.list
$(CROSS_COMPILE)-objcopy hello.elf -O binary hello.bin
startup.o : startup.s
$(CROSS_COMPILE)-as $(AOPS) startup.s -o startup.o
hello.o : hello.c
$(CROSS_COMPILE)-gcc -c $(COPS) hello.c -o hello.o
clean :
rm -f *.o
rm -f *.elf
rm -f *.bin
rm -f *.list
Parece que acabo de dejar el puntero de la pila donde sea que lo tenga el gestor de arranque. Del mismo modo, como usted, asumió que el gestor de arranque había inicializado el puerto serie.
Supongo que tiene acceso al puerto serie funcionando, ¿ve uboot y puede escribir comandos para descargar este programa (xmodem, o lo que sea) en el ram de las placas? Si no puede hacer eso, entonces puede ser que no esté conectado al puerto serie correcto. el puerto serie de beagleboards es complicado, podría necesitar hacer su propio cable.
No tengo suficiente repetición para comentar ... Pero mi respuesta fue
Funciona de cualquier manera. Ahora lo extraño es que puedo imprimir caracteres individuales con uart_send (''c'') por ejemplo, pero no puedo imprimir cadenas print_string (char * str) {while (* str! = ''/ 0'') uart_send (* str ++); } print_string ("Prueba"); . Tiene alguna idea sobre esto?
es:
Escribe más rápido en el búfer de salida, ya que UART puede enviar ... Por lo tanto, debe verificar si el búfer de salida está vacío antes de enviar un nuevo carácter.
Lo he hecho en el código de mi blog ( http://hardwarefreak.wordpress.com/2011/08/30/some-experience-with-the-beagleboard-xm-part-2/ )