Hello world,裸机Beagleboard

我正试图在我的Beagleboard-xm rev上运行一个’hello world’类型的程序。 C,通过从程序puts调用C puts函数。

到目前为止,我一直在使用它作为参考: http : //wiki.osdev.org/ARM_Beagleboard

这是我到目前为止所拥有的,但没有输出。

你好ç

 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 

像这样只使用asm文件。

 .equ UART3.BASE, 0x49020000 start: ldr r0,=UART3.BASE mov r1,#'c' 

这里有一些Beagleboard / minicom相关信息: http ://paste.ubuntu.com/829072/

有什么指针吗? 🙂


我也试过了

 void hello() { *UART3DR = 'c'; } 

我正在使用minicom并通过ymodem发送文件,然后我尝试运行它:

 go 0x80200000 

minicom中的硬件和软件控制流程已关闭。

应该对你有用。 这是我从后面挖出来的一些代码,没有在今晚的beagleboard上尝试它只是确保它编译,它曾经一次工作…

的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 

你好ç :

 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(链接描述文件):

 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 

看起来我只是在引导程序拥有它的地方留下了堆栈指针。 同样,正如您所说,假设引导加载程序已初始化串行端口。

我假设您有串行端口访问工作,您看到uboot并且您可以键入命令以便将此程序(xmodem或其他)下载到板RAM中? 如果你不能这样做,那么你可能没有连接到串口。 beagleboards串口是螺旋式的,可能需要自己制作电缆。

你不能盲目地将一串字符写入UART – 你需要检查每个字符的状态 – 它适用于单个字符的例子,因为UART总是为第一个字符做好准备,但对于第二个字符,您需要轮询的后续角色(或者更好地使用ISR,但是在我们运行之前让我们走路)。

这里有一些很好的示例代码: http : //hardwarefreak.wordpress.com/2011/08/30/some-experience-with-the-beagleboard-xm-part-2/

我没有足够的重复评论..但我的回答是

无论如何都可以。 现在奇怪的是我可以用uart_send(’c’)打印单个字符,但是不能打印字符串print_string(char * str){while(* str!=’\ 0’)uart_send(* str ++); } print_string(“Test”); 。 有什么想法吗?

是:

您可以在输出缓冲区中更快地写入,因为UART能够发送..因此,在发送新字符之前,您必须检查输出缓冲区是否为空。

我在我的博客上的代码中做到了这一点( http://hardwarefreak.wordpress.com/2011/08/30/some-experience-with-the-beagleboard-xm-part-2/