Hallo, ich habe den Assembler-Source-Code für ein LED Blink für den mega328p in den ports von FreeBSD habe ich den avr-gcc und zum übertragen avrdude gefunden. /* Compiler Aufruf - fuer den assembler code - es ist kein Inline-C */ avr-gcc -c test.sx -mmcu=atmega328p -o test.o /* Linker */ avr-ld test.o -o test.elf /* Intelkonforme Hexdatei mit MaschinenCode erzeugen */ avr-objcopy -O ihex test.elf test.hex Passt das so?
Compiler und linker werden dir schon mitteilen, wenn denen was nicht passt. Also tipp es einfach mal ein, und schau, was passiert. Oliver
:
Bearbeitet durch User
Walter K. schrieb: > /* Linker */ > avr-ld test.o -o test.elf Wird nicht passen, AVR ist multi-lib. Da nimmt man zum Linken den GCC als Frontend, also auch einfach "avr-gcc". Auch da ist der MCU Typ anzugeben.
Jim M. schrieb: > Wird nicht passen, AVR ist multi-lib. Da nimmt man zum Linken den GCC > als Frontend, also auch einfach "avr-gcc" Ja o.k. Danke Ich nehm dann einfach hier aus Euren Wiki das Make-File und pass das an: TARGET=blink MCU=atmega328p SOURCES=blink.c PROGRAMMER=arduino #auskommentieren für automatische Wahl PORT=-P/dev/ttyS0 BAUD=-B115200 #Ab hier nichts verändern OBJECTS=$(SOURCES:.c=.o) CFLAGS=-c -Os LDFLAGS= all: hex eeprom hex: $(TARGET).hex eeprom: $(TARGET)_eeprom.hex $(TARGET).hex: $(TARGET).elf avr-objcopy -O ihex -j .data -j .text $(TARGET).elf $(TARGET).hex $(TARGET)_eeprom.hex: $(TARGET).elf avr-objcopy -O ihex -j .eeprom --change-section-lma .eeprom=1 $(TARGET).elf $(TARGET)_eeprom.hex $(TARGET).elf: $(OBJECTS) avr-gcc $(LDFLAGS) -mmcu=$(MCU) $(OBJECTS) -o $(TARGET).elf .c.o: avr-gcc $(CFLAGS) -mmcu=$(MCU) $< -o $@ size: avr-size --mcu=$(MCU) -C $(TARGET).elf program: avrdude -p$(MCU) $(PORT) $(BAUD) -c$(PROGRAMMER) -Uflash:w:$(TARGET).hex:a clean_tmp: rm -rf *.o rm -rf *.elf clean: rm -rf *.o rm -rf *.elf rm -rf *.hex
Man könnte auch einfach mal die Doku lesen. http://www.nongnu.org/avr-libc/user-manual/assembler.html Oliver
Oliver S. schrieb: > Man könnte auch einfach mal die Doku lesen. Man könnte auch einfach schweigen - wenn man ausser RTFM nichts mittzuteilen hat ;-)
Alles bisher gesagte ist aber nur dann richtig, wenn es sich bei dem "Assembler-Source-Code" auch tatsächlich um welchen für den Assembler aus dem avr-gcc Packet handelt. Sollten die Sourcen allerdings für den "AVR Assembler" von Atmel/Microchip sein, dürfte es etliche Fehlermeldungen hageln. http://www.atmel.com/webdoc/avrassembler/
guest schrieb: > Alles bisher gesagte ist aber nur dann richtig, wenn es sich bei > dem "Assembler-Source-Code" auch tatsächlich um welchen für den > Assembler aus dem avr-gcc Packet handelt. > Sollten die Sourcen allerdings für den "AVR Assembler" von > Atmel/Microchip sein, dürfte es etliche Fehlermeldungen hageln. > http://www.atmel.com/webdoc/avrassembler/ Das ist mir schon klar, Danke für den Hinweis. Allerdings entsteht jetzt die Frage, ob der Ansatz mit avr-gcc zum Lernen und Einstieg richtig ist. Ich hatte den avr-gcc gewählt, weil ich selbst aus dem C Bereich komme - später sicher auch mehr mit C und Inline Assembler machen werde ... für den Anfang aber erst mal mit reinen Assembler beginnen wollte
hunsbuckel schrieb: > Allerdings entsteht jetzt die Frage, ob der Ansatz mit avr-gcc zum > Lernen und Einstieg richtig ist. > Ich hatte den avr-gcc gewählt, weil ich selbst aus dem C Bereich komme - > später sicher auch mehr mit C und Inline Assembler machen werde ... für > den Anfang aber erst mal mit reinen Assembler beginnen wollte Mach es umgekehrt. Fang mit C an und ersetze dann einzelne Funktionen in Assembler. Mit avr-gcc problemlos, mit avrasm2 unmöglich. Viele Beispiele sind allerdings für avrasm2, von daher spricht auch einiges für das Atmel/Microchip Teil.
Jim M. schrieb: > Walter K. schrieb: >> /* Linker */ >> avr-ld test.o -o test.elf > > Wird nicht passen, AVR ist multi-lib. Da nimmt man zum Linken den GCC > als Frontend, also auch einfach "avr-gcc". Auch da ist der MCU Typ > anzugeben. Dann muss man aber noch explizit dafür sorgen, dass Startup-Code und Standardlib für C nicht mitgelinkt werden, also -nostdlib als zusätzlichen Parameter übergeben.
Walter K. schrieb: > /* Intelkonforme Hexdatei mit MaschinenCode erzeugen */ > avr-objcopy -O ihex test.elf test.hex Kannst du einsparen, muss man nicht haben. AVRDUDE kann seit geraumer Zeit die ELF-Files auch direkt lesen. Dabei ist ein „-U foo.elf“ die Kurzform für „-U flash:w:foo.elf:e“, d. h. es wird nur der für den Flash bestimmte Anteil aus dem ELF-File genommen und programmiert.
Beitrag #5265016 wurde von einem Moderator gelöscht.
Rolf M. schrieb: > Jim M. schrieb: >> Walter K. schrieb: >>> /* Linker */ >>> avr-ld test.o -o test.elf >> >> Wird nicht passen, AVR ist multi-lib. Da nimmt man zum Linken den GCC >> als Frontend, also auch einfach "avr-gcc". Auch da ist der MCU Typ >> anzugeben. > > Dann muss man aber noch explizit dafür sorgen, dass Startup-Code und > Standardlib für C nicht mitgelinkt werden, also -nostdlib als > zusätzlichen Parameter übergeben. Müssen? Man kann auch den C Startup-Code in Assembler verwenden, etwa für
1 | .data |
2 | .global var |
3 | var: |
4 | .word 42 |
5 | ;; Triggert Teil des Startup-Codes |
6 | .global __do_copy_data |
bereits beim Einsprungpunkt in den Assmbler-Code (main) initialisiert zu haben. Außerdem hat man damit bereits eine Vector-Tabelle aus dem crt und man kann also auch ohne jegliches C-Modul vom C-Startup profitieren. Ein minimales main.S wäre dann z.B.:
1 | #include <avr/io.h> |
2 | |
3 | .text |
4 | |
5 | ;;; C-Startup definiert vectors-Tabelle, und avr/io.h definiert |
6 | ;;; ISR names wie INT0_vect. |
7 | |
8 | .global INT0_vect |
9 | INT0_vect: |
10 | ;; Code |
11 | reti |
12 | |
13 | ;;; C-Startup springt nach Initialisierung von .data und .bss nach main |
14 | |
15 | .global main |
16 | main: |
17 | ;; Code |
und einfach übersetzen mit
1 | avr-gcc main.S -o main.elf -mmcu=... |
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.