PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : avr-gcc: unrecognized option '--ooformat=ihex'



Prophet05
18.08.2006, 22:27
Moin,

ich und ein freund von mir machen gerade die ersten erfahrungen mit einem Atmel atmega8. Bei ihm haben wir mehr schlecht als recht mit hilfe von AtmelStudio4, WinAVR und PonyProg unseren Controller ansprechen können.

Nun bin ich zu hause mehr unter linux oder mac als unter windows. Daher wollte ich mich mal mit dem avr-gcc beschäftigen.

Nach mehreren Stunden intensiven lesens habe ich mir folgende anweisung zusammengelesen:

avr-gcc -mmcu=atmega8 -Wl,--ooformat=ihex -omain.hex main.c

Ich hoffe das ist richtig. Ich möchte nur eine Binärdatei für den atmega8 erstellen (hex-format). Mehr nicht. In der main.c habe ich nur avr/io.h eingebunden und eine leere int main funktion.

Mein problem ist das ich immer folgende fehler-meldung erhalte:

/usr/lib/gcc/avr/3.4.3/../../../../avr/bin/ld: unrecognized option '--ooformat=ihex'
/usr/lib/gcc/avr/3.4.3/../../../../avr/bin/ld: use the --help option for usage information

Ich verstehe nicht warum das so ist. Ich habe das ganze fast 1 zu 1 aus dieser eschreibung genommen: https://www.roboternetz.de/wissen/index.php/Avr-gcc

Freue mich über hilfe.

Wenn ich das ganze gerade sehr ungeschickt angehe bitte zeigt mir den "eleganteren" weg. Ich bin noch ziemlich unerfahren mit Commandozeilem compilation. Also bitte keine fremdwort gefüllten kurznachrichten die mehr fragen als antworten aufwerfen ;)

mfg Prophet05

izaseba
18.08.2006, 23:22
Ich verstehe nicht warum das so ist. Ich habe das ganze fast 1 zu 1 aus dieser Beschreibung genommen

Ja eben fast 1 zu 1
die Option heißt --oformat und nicht --ooformat :-)

Außerdem ist es besser/einfacher auf das make Programm zuzugreifen und sich ein Makefile erstellen, oder erstellen lassen, Stichwort
mfile.
Man muß sich ja nicht unnötig mit den ganzen Flags herumschlagen, es sei den man ist voll der Hardcore Programmierer :-)

Gruß Sebastian

EDIT:
Ich lese es gerade, Du möchtest keine Kurzbeschreibungen, ich persönlich benutze dieses Makefile:


MCU = atmega8


#Tagret einstellen
TARGET = display
#Sourcefiles
SRC = $(TARGET).c

SRC +=

FORMAT = ihex

#Assemblerfiles
ASRC=

OPT = s

#Compilerflags
CFLAGS = -g -O$(OPT) \
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums \
-Wall -Wstrict-prototypes \
-Wa,-ahlms=$(<:.c=.lst)

#Assemblerflags
ASFLAGS = -Wa,-ahlms=$(<:.S=.lst),-gstabs

#Linkerflags

LDFLAGS = -Wl,-Map=$(TARGET).map,--cref

# Additional libraries
#
# Minimalistic printf version
#LDFLAGS += -Wl,-u,vfprintf -lprintf_min
#
# Floating point printf version (requires -lm below)
#LDFLAGS += -Wl,-u,vfprintf -lprintf_flt
#
# -lm = math library
LDFLAGS += -lm

# Define programs and commands.
SHELL = sh

CC = avr-gcc

OBJCOPY = avr-objcopy
OBJDUMP = avr-objdump
SIZE = avr-size

REMOVE = rm -f
COPY = cp

HEXSIZE = $(SIZE) --target=$(FORMAT) $(TARGET).hex
ELFSIZE = $(SIZE) -A $(TARGET).elf

FINISH = echo Errors: none
BEGIN = echo -------- begin --------
END = echo -------- end --------




# Define all object files.
OBJ = $(SRC:.c=.o) $(ASRC:.S=.o)

# Define all listing files.
LST = $(ASRC:.S=.lst) $(SRC:.c=.lst)

# Combine all necessary flags and optional flags.
# Add target processor to flags.
ALL_CFLAGS = -mmcu=$(MCU) -I. $(CFLAGS)
ALL_ASFLAGS = -mmcu=$(MCU) -I. -x assembler-with-cpp $(ASFLAGS)



# Default target.
all: begin gccversion sizebefore $(TARGET).elf $(TARGET).hex $(TARGET).eep \
$(TARGET).lss sizeafter finished end


# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@$(BEGIN)

finished:
@$(FINISH)

end:
@$(END)


# Display size of file.
sizebefore:
@if [ -f $(TARGET).elf ]; then echo Size before:; $(ELFSIZE);fi

sizeafter:
@if [ -f $(TARGET).elf ]; then echo Size after:; $(ELFSIZE);fi



# Display compiler version information.
gccversion :
$(CC) --version




# Convert ELF to COFF for use in debugging / simulating in
# AVR Studio or VMLAB.
COFFCONVERT=$(OBJCOPY) --debugging \
--change-section-address .data-0x800000 \
--change-section-address .bss-0x800000 \
--change-section-address .noinit-0x800000 \
--change-section-address .eeprom-0x810000


coff: $(TARGET).elf
$(COFFCONVERT) -O coff-avr $< $(TARGET).cof


extcoff: $(TARGET).elf
$(COFFCONVERT) -O coff-ext-avr $< $(TARGET).cof

# Create final output files (.hex, .eep) from ELF output file.
%.hex: %.elf
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@

%.eep: %.elf
-$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@

# Create extended listing file from ELF output file.
%.lss: %.elf
$(OBJDUMP) -h -S $< > $@



# Link: create ELF output file from object files.
.SECONDARY : $(TARGET).elf
.PRECIOUS : $(OBJ)
%.elf: $(OBJ)
$(CC) $(ALL_CFLAGS) $(OBJ) --output $@ $(LDFLAGS)


# Compile: create object files from C source files.
%.o : %.c
$(CC) -c $(ALL_CFLAGS) $< -o $@


# Compile: create assembler files from C source files.
%.s : %.c
$(CC) -S $(ALL_CFLAGS) $< -o $@


# Assemble: create object files from assembler source files.
%.o : %.S
$(CC) -c $(ALL_ASFLAGS) $< -o $@






# Target: clean project.
clean: begin clean_list finished end

clean_list :
$(REMOVE) $(TARGET).hex
$(REMOVE) $(TARGET).eep
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).cof
$(REMOVE) $(TARGET).elf
$(REMOVE) $(TARGET).map
$(REMOVE) $(TARGET).obj
$(REMOVE) $(TARGET).a90
$(REMOVE) $(TARGET).sym
$(REMOVE) $(TARGET).lnk
$(REMOVE) $(TARGET).lss
$(REMOVE) $(OBJ)
$(REMOVE) $(LST)
$(REMOVE) $(SRC:.c=.s)
$(REMOVE) $(SRC:.c=.d)


# Automatically generate C source code dependencies.
# (Code originally taken from the GNU make user manual and modified
# (See README.txt Credits).)
#
# Note that this will work with sh (bash) and sed that is shipped with WinAVR
# (see the SHELL variable defined above).
# This may not work with other shells or other seds.
#
%.d: %.c
set -e; $(CC) -MM $(ALL_CFLAGS) $< \
| sed 's,\(.*\)\.o[ :]*,\1.o \1.d : ,g' > $@; \
[ -s $@ ] || rm -f $@


# Remove the '-' if you want to see the dependency files generated.
-include $(SRC:.c=.d)



# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion coff extcoff \
clean clean_list program






Hab es mal irgendwo so abgekupfert und benutze es bei jedem Programm
das kannst Du so 1 zu 1 übernehmen, einfach alles per copy/paste
in einen Editor Deiner Wahl und als Makefile speichern.
das muß dann in das Projektverzeichnis rein, wo auch Dein Programm drin liegt.
Das einzigste, was Du anpassen mußt ist die Zeile


TARGET = display
MCU = atmega8

anstatt von display schreibst Du den Namen deines Programmes dahin ohne .c z.B. main.c Target = main
MCU kommt dann halt noch der entsprechende Prozessor hin

Jetzt nur noch im Projektverzeichnis make eintipen und sich über eine schöne main.hex freuen.

Prophet05
18.08.2006, 23:50
Danke für deine schnelle und ausführliche antwort!

Ich habe dein Makefile entsprechen angepasst und make im verzeichnis aufgerufen. Ich erhalte jedoch nur eine Fehlermeldung:

prophet@prophet-ubuntu:~/default-avr-projekt$ make
Makefile:87: *** missing separator. Schluss.

Das entspricht bei mir (ich habe einige kommentarzeilen hinzugefügt):

# Eye candy.
# AVR Studio 3.x does not check make's exit code but relies on
# the following magic strings to be generated by the compile job.
begin:
@$(BEGIN) # Zeile 87

finished:
@$(FINISH)

end:
@$(END)

Anbei:
> Kann ich diese lösung auch unterwindows (mit WinAVR) verwenden?
> Ist es normal das man "make" extra installieren muss? Bei mir fehlte das tool. Ich musste erst das entsprechende paket installieren...
> Sehe ich es richtig das nach 'ALL_ASFLAGS' nur noch informationen kommen welche zum aufräumen gedacht sind? Könnte man diese theoretisch löschen? (Bei compilation unter window auch problemlos verwenden?)

izaseba
19.08.2006, 00:04
Dann sag ich einfach nur ka**ke :-(

Das liegt an der besonderen Formatierung von Makefile der Fehler sagt aus, daß man als Separatoren Tabs benutzen muß und ich denke, die sind hier irgendwo verloren gegangen...

zu Deiner 1. Frage klar macht man das so unter Windows, bei Windows wird ja noch mfile mitgeliefert es ist ein Programm, das Dir Makefile erstellt.
Da ich kein Windows habe, kann ich aber keine weiteren Angaben dazu machen, es gibt das auch für Linux, ich komme aber bis jetzt ohne aus...

Es kann sein, daß man make extra installieren muß, war bei meinem Gentoo auch so

Ja danach kommen Infos um aufzuräumen, aufgerufen wir es mit make clean :-)

Hier (http://www.sax.de/~joerg/mfile/) findest Du Infos zu mfile.

Im Anhang Makefile, Du mußt nur die Erweiterung .txt wegmachen, das Forum erlaubt es nicht anders zu posten.

Gruß Sebastian


EDIT:

Hier (http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Exkurs:_Makefiles) kann man auch vieles drüber nachlesen

Prophet05
19.08.2006, 00:21
Nachdem ich alle einrückungen durch tabs ersetzt habe ging es problemlos. Ob die HEX datei funktioniert muss ich noch testen. Abersoweit schonmal vielen dank!

Mit WinAVR und MFile werde ich mich wohl noch beschäftigen müssen, aber danke für die vielen inputs. Das zusammenspiel der komponenten ist mir nun ein wenig klarer geworden.

EDIT: Oh danke für die datei...

Das tutorial unter microcontrollers.net war eine der lektüren die ich bereits seit mehreren stunden studiert habe und trotzdem nicht voran gekommen bin. Erst in eurer wiki habe ich etwas verstanden (in hinsicht auch den compiler).

izaseba
19.08.2006, 00:23
Kein Problem,
Ich freue mich, wenn jemand auch mal unter die Haube schauen möchte.

Viel Spaß mit avr-gcc

Gruß Sebastian