मैं अपने 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 के माध्यम से फाइल भेजने, तो मैं के साथ इसे चलाने के लिए कोशिश मिनिकॉम में प्रवाह बंद हैं।
यह काम करता है, धन्यवाद। अब मुझे यह पता लगाने की ज़रूरत है कि मैं क्या गलत कर रहा हूं। यह कोड का पहला टुकड़ा है! = एएसएम जो वास्तव में कुछ प्रिंट करता है। – farnsworth
अगर किसी के साथ समस्या हो रही है तो आगे के संदर्भ के लिए। मैंने मेकफ़ाइल CROSS_COMPILE = arm-none-linux-gnueabi को संशोधित किया क्योंकि मैं linux के लिए codeourcery टूलचेन का उपयोग कर रहा हूं। फ़ाइल को ymodem के माध्यम से लोड के साथ लोड किया गया है, और जब memmap की उत्पत्ति 0x82000000 पर है, तो मैं एग्ड गया और 0x800000 पर जाने के बावजूद इसे 0x800000 पर चला गया। – farnsworth
दोनों हाथ-कोई-लिनक्स-gnueabi और arm-none-eabi कोडोर्सरी से हैं, अगर आप कोई सिस्टम कॉल नहीं करते हैं तो या तो काम करेंगे। माना जाता है कि गैर-लिनक्स संस्करण बेहतर है यदि आप gcclib कॉल का उपयोग करते हैं (विभाजन या मॉड्यूल या उस तरह की चीजों का उपयोग करें)। –