2012-02-04 51 views
10

मैं अपने Beagleboard-xm rev पर चल रहे 'हैलो वर्ल्ड' प्रकार का प्रोग्राम प्राप्त करने की कोशिश कर रहा हूं। सी, विधानसभा से एक सी 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 

सिर्फ एएसएम फ़ाइल का उपयोग करते हुए इस काम करता है की तरह। http://paste.ubuntu.com/829072/

किसी भी संकेत दिए गए:

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

यहाँ कुछ Beagleboard/minicom संबंधित जानकारी कर रहे हैं?

go 0x80200000 

हार्डवेयर और सॉफ्टवेयर नियंत्रण: :)


मैं भी कोशिश की

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

मैं minicom उपयोग कर रहा हूँ और ymodem के माध्यम से फाइल भेजने, तो मैं के साथ इसे चलाने के लिए कोशिश मिनिकॉम में प्रवाह बंद हैं।

उत्तर

3

है कि आप के लिए काम किया जाना चाहिए था।

.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 

: यहाँ कुछ कोड मैं जिस तरह से पीछे से ऊपर खोदा जब, एक beagleboard आज रात सिर्फ यकीन है कि यह संकलित, यह एक समय में काम किया था बनाया पर यह कोशिश नहीं की ...

startup.s है नमस्ते।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 

ऐसा लगता है कि मैं सिर्फ ढेर सूचक छोड़ दिया जहाँ भी बूटलोडर यह था। इसी प्रकार, जैसा कि आपने माना, बूटलोडर ने धारावाहिक बंदरगाह शुरू किया था।

मुझे लगता है कि आपके पास सीरियल पोर्ट एक्सेस काम कर रहा है, तो आप यूबूट देखते हैं और आप बोर्ड प्रोग्राम में इस प्रोग्राम (xmodem, या जो भी) को डाउनलोड करने के लिए कमांड टाइप करने में सक्षम हैं? यदि आप ऐसा नहीं कर सकते हैं तो हो सकता है कि आप सीरियल पोर्ट से जुड़े न हों। बीगलबोर्ड सीरियल पोर्ट खराब है, आपको अपना केबल बनाने की आवश्यकता हो सकती है।

+0

यह काम करता है, धन्यवाद। अब मुझे यह पता लगाने की ज़रूरत है कि मैं क्या गलत कर रहा हूं। यह कोड का पहला टुकड़ा है! = एएसएम जो वास्तव में कुछ प्रिंट करता है। – farnsworth

+0

अगर किसी के साथ समस्या हो रही है तो आगे के संदर्भ के लिए। मैंने मेकफ़ाइल CROSS_COMPILE = arm-none-linux-gnueabi को संशोधित किया क्योंकि मैं linux के लिए codeourcery टूलचेन का उपयोग कर रहा हूं। फ़ाइल को ymodem के माध्यम से लोड के साथ लोड किया गया है, और जब memmap की उत्पत्ति 0x82000000 पर है, तो मैं एग्ड गया और 0x800000 पर जाने के बावजूद इसे 0x800000 पर चला गया। – farnsworth

+0

दोनों हाथ-कोई-लिनक्स-gnueabi और arm-none-eabi कोडोर्सरी से हैं, अगर आप कोई सिस्टम कॉल नहीं करते हैं तो या तो काम करेंगे। माना जाता है कि गैर-लिनक्स संस्करण बेहतर है यदि आप gcclib कॉल का उपयोग करते हैं (विभाजन या मॉड्यूल या उस तरह की चीजों का उपयोग करें)। –

2

आप केवल यूआरएटी को अक्षरों की एक स्ट्रिंग लिख नहीं सकते हैं - आपको प्रत्येक चरित्र पर स्थिति की जांच करने की आवश्यकता है - यह एकल वर्ण उदाहरण में काम करता है क्योंकि यूएआरटी हमेशा पहले चरित्र के लिए तैयार होने जा रहा है, लेकिन दूसरे और बाद के पात्रों के लिए आपको मतदान करने की आवश्यकता है (या बेहतर अभी तक एक आईएसआर का उपयोग करें, लेकिन चलने से पहले चलो चलें)।

यहाँ कुछ अच्छा उदाहरण कोड है: http://hardwarefreak.wordpress.com/2011/08/30/some-experience-with-the-beagleboard-xm-part-2/

+0

चेक बाहर ले पर कोड में यह कर दिया है। मैंने केवल एक चरित्र को मुद्रित करने की कोशिश की और मुझे कोई आउटपुट नहीं मिला, अच्छा आलेख जांच करेगा कि क्या यह समस्या हल करता है, हालांकि मैं वास्तव में जानना चाहता हूं कि मैं क्या गलत करता हूं और कहां। – farnsworth

+0

शायद ऊपर दिए गए लिंक को कोड फॉर्म चलाने का प्रयास करें और देखें कि क्या यह काम करता है? यदि यह काम करता है तो आप अपने कोड से तुलना कर सकते हैं और देख सकते हैं कि क्या अलग है? –

+0

कोशिश की, काम नहीं करता है। – farnsworth

2

मैं पर्याप्त नहीं repetation टिप्पणी करने के लिए है .. लेकिन करने के लिए

वर्क्स किसी भी तरह से मेरी answere। अब अजीब बात यह है कि मैं उदाहरण के लिए uart_send ('सी') के साथ साथ व्यक्तिगत पात्रों मुद्रित कर सकते हैं, लेकिन प्रिंट नहीं कर सकते तार print_string (चार * str) {है, जबकि (* str! = '\ 0') uart_send (* str ++); } print_string ("टेस्ट"); । इस पर कोई विचार?

है:

आप तेजी से उत्पादन बफर में लिखने के रूप में UART भेजने में सक्षम है .. तो तुम जाँच करने के लिए, अगर उत्पादन बफर खाली है, इससे पहले कि आप एक नए चरित्र भेज दिया है।

मैं अपने ब्लॉग (http://hardwarefreak.wordpress.com/2011/08/30/some-experience-with-the-beagleboard-xm-part-2/)

+0

मैं कर रहा हूँ कि :), मैं भी छोड़कर अगर मैं print_char कर ('सी') स्क्रीन पर अभी तक कुछ नहीं .text को rodata स्थानांतरित कर दिया है; – farnsworth

+0

एमएमएच .. इंटरप्ट सक्षम हैं? क्या मैं आपका कोड देख सकता हूं और मेरी तुलना कर सकता हूं? – Hardwarefreak

+0

क्षमा करें, मैंने शुरुआती पता गड़बड़ कर दिया, आपके समय और आपके महान उदाहरण के लिए धन्यवाद :) – farnsworth

संबंधित मुद्दे