10

Beagleboard-xmrevで「helloworld」タイプのプログラムを実行しようとしています。putsC、アセンブリからC関数を呼び出すことによって。

これまでのところ、これを参照として使用しています:http ://wiki.osdev.org/ARM_Beagleboard

これが私がこれまでに持っているものですが、出力はありません。

こんにちは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 .

リンカー.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のハードウェアとソフトウェアの制御フローがオフになっています。

4

3 に答える 3

3

それはあなたのために働いたはずです。これが私が昔から掘り起こしたコードです。今夜ビーグルボードで試してみませんでしたが、コンパイルされたことを確認しただけで、一度は機能していました...

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など)をボードRAMにダウンロードするためのコマンドを入力できますか?それができない場合は、シリアルポートに正しく接続されていない可能性があります。beagleboardsのシリアルポートはねじれているため、独自のケーブルを作成する必要がある場合があります。

于 2012-02-05T08:53:08.890 に答える
2

UARTに文字列を盲目的に書き込むことはできません-各文字のステータスを確認する必要があります-UARTは常に最初の文字の準備ができているので、単一の文字の例で機能しますが、2番目の文字とポーリングする必要のある後続の文字(またはISRを使用する方がよいですが、実行する前に歩きましょう)。

ここにいくつかの良いサンプルコードがあります:http://hardwarefreak.wordpress.com/2011/08/30/some-experience-with-the-beagleboard-xm-part-2/

于 2012-02-04T18:19:33.867 に答える
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/

于 2012-02-06T13:57:21.410 に答える