你好世界,裸机Beagleboard
我想要得到一个'你好世界'类型的程序运行在我的Beagleboard-xm rev。 C,通过从程序集调用C puts
函数。你好世界,裸机Beagleboard
到目前为止,我一直在使用这个作为参考:http://wiki.osdev.org/ARM_Beagleboard
这里是我到目前为止,但没有输出。
的hello.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
只需使用ASM文件中像这样的作品。
.equ UART3.BASE, 0x49020000
start:
ldr r0,=UART3.BASE
mov r1,#'c'
这里有一些的BeagleBoard /小型机相关信息:http://paste.ubuntu.com/829072/
任何指针? :)
我也试过
void hello() {
*UART3DR = 'c';
}
我使用的小型机,并通过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
你好。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(连接脚本):
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,或其他)到电路板内存中?如果你不能这样做,那么它可能是你没有连接到串行端口的权利。 beagleboards的串口很拧,可能需要制作自己的电缆。
你不能盲目地写一串字符到UART - 你需要检查每个字符的状态 - 它在单个字符的例子中工作,因为UART总是准备好第一个字符,但对于需要轮询的第二个和随后的角色(或者更好地使用ISR,但是在我们运行之前让我们走)。
这里也有一些很好的例子代码在这里:http://hardwarefreak.wordpress.com/2011/08/30/some-experience-with-the-beagleboard-xm-part-2/
退房的LE做到了这一点。我也尝试打印只有一个字符,我没有得到任何输出,好文章将检查它是否解决问题,但我真的想知道我做错了什么,在哪里。 – farnsworth 2012-02-04 18:23:11
也许试试从上面给出的链接运行代码,看看是否有效?如果它确实有效,那么你可以与你的代码进行比较,看看有什么不同? – 2012-02-04 18:25:39
尝试过,不起作用。 – farnsworth 2012-02-04 18:41:08
我已经没有足够的repetation评论... 但我的answere到
仍然可以正常工作。现在奇怪的是,我可以用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/)
我这样做:),我也已经移动到.text文本但没有在屏幕上,除非我做print_char('c'); – farnsworth 2012-02-06 14:22:35
Mmh ..是否启用中断? 我可以看到您的代码并与我的对比吗? – Hardwarefreak 2012-02-06 14:33:36
对不起,我搞砸了开始的地址,谢谢你的时间和你的伟大榜样:) – farnsworth 2012-02-06 15:05:50
它的工作原理,谢谢。现在我需要弄清楚我做错了什么。这是第一块代码!= ASM,它实际上打印了一些东西。 – farnsworth 2012-02-05 11:26:43
如果有人对此有任何疑问,请参阅此处。我修改了Makefile CROSS_COMPILE = arm-none-linux-gnueabi,因为我正在使用linux的codesourcery toolchain。使用loady通过ymodem加载文件,而de memmap有它的原点在0x82000000我去agead并运行它与去0x80200000即使您将原点设置为0x82000000。 – farnsworth 2012-02-05 11:28:45
arm-none-linux-gnueabi和arm-none-eabi都来自codesourcery,如果你不做任何系统调用,那么两者都可以工作。据推测,如果你使用gcclib调用(使用除法或模或类似的东西),非linux版本会更好。 – 2012-02-05 11:52:51