WinAVR und Lib

Hallo, ich habe mal eine Frage bezüglich des WINAVR.

Wir haben eine Library mit dem Codevision AVR erstellt. Diese Lib stellen wir Kunden zur Verfügung. Den Sourcecode davon rücken wir nicht raus.

Jetzt gibt es aber einige Kunden die wollen unbedingt den Winavr benutzen.

Ich gehe jetzt mal davon aus, das die Lib nicht sofort übernehmbar ist?

Kann ich im Winavr eine Lib erzeugen?

Nein, ich habe mir noch nicht die ganze Doku angeschaut, mir geht es erstmal um eine Abschätzung bevor ich das tue .

Andreas

Reply to
Andreas Ruetten
Loading thread data ...

Andreas Ruetten schrieb:

Winavr ist doch gcc, oder? Klar kann man damit auch Bibliotheken erzeugen. Evtl. musst Du aber Deinen Code anpassen, bevor er sich mit dem avr-gcc compilieren lässt. Dann musst Du eigentlich nur noch die kompilierten Objektdateien mit "ar" in ein Archiv packen (und sinnvollerweise "ranlib" drüber laufen lassen), schon hast Du Deine Bibliothek.

CU Christian

--
Christian Zietz  -  CHZ-Soft  -  czietz (at) gmx.net
WWW: http://www.chzsoft.com.ar/
PGP/GnuPG-Key-ID: 0x6DA025CA
Reply to
Christian Zietz

Falls Codevision nicht gerade ELF-Format mit dem ABI vom AVR-GCC produziert (wovon ich nicht ausgehe), wird das wohl nicht gehen.

Das ABI ist mehr oder minder schlecht hier beschrieben:

formatting link

avr-ar kann eine Bibliothek aus vorher compilierten Objektmodulen erzeugen, die avr-ld als Linker dann zugreifen kann. Der Unix-Linker arbeitet dabei so, dass er für jedes global undefinierte Symbol an der Stelle, an der eine Bibliothek auf der Kommandozeile angegeben ist, einen Modul aus der Bibliothek reinzieht (komplett, mit allen enthaltenen Funktionen, falls dies mehrere sind), sofern dieser Modul das Symbol definiert. Anschließend wird noch geschaut, ob daraus neue undefinierte Symbole entstanden sind und dies für die aktuelle Bibliothek so lange wiederholt, bis sie nichts mehr auflösen helfen kann. Danach geht es mit dem nächsten Objektmodul bzw. der nächsten angegebenen Bibliothek weiter.

Das Compiler-Frontend linkt üblicherweise als letztes in der Reihenfolge gegen die Systembibliothek(en). Beim GCC ist das typischerweise die Folge -lc -lgcc -lc, d.h. es werden im Systembibliotheksverzeichnis der Reihe nach libc.a, libgcc.a, und abschließend noch einmal libc.a durchsucht.

--
cheers, J"org               .-.-.   --... ...--   -.. .  DL8DTL

http://www.sax.de/~joerg/                        NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
Reply to
Joerg Wunsch

Andreas Ruetten schrieb:

Hallo!

Ich habe da mal ein Makefile geschrieben (geht aus dem "standard Makefile" von Eric B. Weddington, Jörg Wunsch u.s.w hervor):

#**************************************************************** #* Beispiel Makefile für den AVR-GCC * #* Geschrieben von Heiko Lechner * #**************************************************************** # # Der GCC sollte im Pfad stehen, dass Make ihn von überall aufrufen kann # Weiterhin sollte, die Dateien rm.exe (REMOVE), ar.exe (Archive) im # Pfad stehen (ist z.B. bei WinAVR dabei). Es wird auch mkdir benutzt, # jedoch in der # GNU- Version, weil die MS-Version beschränkt ist. Es wird eine Datei # mit dem Namen gnumkdir.exe im Pfad vorausgesetzt. # Alternativ können auch alle Dateien mit dem Makefile in einem Pfad # stehen. # # Unterstützte angaben: # make all # make clean

#-------------------------------------- # Angabe über den benutzten Prozessor # Also einfach das "#" vor dem gewünschten Prozessor entfernen und # darauf achten, # dass alle anderen noch dran sind :)

# MCU = avr1 # MCU = avr2 # MCU = avr3 # MCU = avr4 # MCU = avr5 # MCU = at90s1200 # MCU = attiny10 # MCU = attiny11 # MCU = attiny12 # MCU = attiny15 # MCU = attiny28 # MCU = at90s2313 # MCU = at90s2323 # MCU = at90s2333 # MCU = at90s2343 # MCU = attiny22 # MCU = attiny26 # MCU = at90s4433 # MCU = at90s4414 # MCU = at90s4434 # MCU = at90s8515 # MCU = at90s8535 # MCU = at90c8534 # MCU = at86rf401 # MCU = attiny13 # MCU = attiny2313 # MCU = attiny261 # MCU = attiny461 # MCU = attiny861 # MCU = attiny24 # MCU = attiny44 # MCU = attiny84 # MCU = attiny25 # MCU = attiny45 # MCU = attiny85 # MCU = atmega603 # MCU = atmega103 # MCU = at43usb320 # MCU = at43usb355 # MCU = at76c711 # MCU = atmega48 # MCU = atmega8 # MCU = atmega83 # MCU = atmega85 MCU = atmega88 # MCU = atmega8515 # MCU = atmega8535 # MCU = at90pwm2 # MCU = at90pwm3 # MCU = atmega16 # MCU = atmega161 # MCU = atmega162 # MCU = atmega163 # MCU = atmega164p # MCU = atmega165 # MCU = atmega165p # MCU = atmega168 # MCU = atmega169 # MCU = atmega169p # MCU = atmega32 # MCU = atmega323 # MCU = atmega324p # MCU = atmega325 # MCU = atmega329 # MCU = atmega3250 # MCU = atmega3290 # MCU = atmega406 # MCU = atmega64 # MCU = atmega640 # MCU = atmega644 # MCU = atmega644p # MCU = atmega128 # MCU = atmega1280 # MCU = atmega1281 # MCU = atmega645 # MCU = atmega649 # MCU = atmega6450 # MCU = atmega6490 # MCU = at90can32 # MCU = at90can64 # MCU = at90can128 # MCU = at90usb646 # MCU = at90usb647 # MCU = at90usb1286 # MCU = at90usb1287 # MCU = at94k

#-------------------------------------- # Angabe des späteren Library-Datei "Rumpfnamens"

TARGET = test

#-------------------------------------- #Angabe des Pfades für die Sourcedateien

SRCPATH=source/

#-------------------------------------- #Angabe des Pfades für die Objektdateien (Zwischenschritt)

OBJPATH=buildlib/

#-------------------------------------- # Weitere Orte für Include- Dateien

EXTRAINCDIRS =

#-------------------------------------- # Die Quelldateien

SRC = a.c SRC += b.c SRC += c.c

#-------------------------------------- # Angabe von Assembler- Quelldateien

ASRC =

#-------------------------------------- # Code- Optimierung (erklärt sich wohl von selbst- Os bedeutet # Optimierung auf Platz)

# OPT = O1 # OPT = O2 # OPT = O3 # OPT = O0 OPT = Os

#-------------------------------------- # C- Standard- Level # # Aus dem Handbuch: # # Determine the language standard. This option is currently only # supported when # compiling C or C++. A value for this option must be provided; possible # values # are # 'c89' # 'iso9899:1990' ISO C90 (same as '-ansi'). # 'iso9899:199409' ISO C90 as modified in amendment 1. # 'c99' # 'iso9899:1999' # 'gnu89' Default, ISO C90 plus GNU extensions # (including some C99 features). # 'gnu99' # 'c++98' The 1998 ISO C++ standard plus # amendments. # 'gnu++98' The same as '-std=c++98' plus GNU extensions. # This is the default for C++ code.

# CSTANDARD = c89 # CSTANDARD = iso9899:1990 # CSTANDARD = iso9899:199409 # CSTANDARD = c99 # CSTANDARD = iso9899:1999 CSTANDARD = gnu89 # CSTANDARD = gnu99 # CSTANDARD = c++98 # CSTANDARD = gnu++98

#-------------------------------------- # Hier kann man z.B. -D or -U Optionen einfügen (-D u.a. müssen explizit # angegeben werden) CDEFS =

#-------------------------------------- # Ab hier sollte nichts mehr eingetragen werden müssen #--------------------------------------

# Zusammenfassen der Compileroptionen CFLAGS = -mmcu=$(MCU) #CFLAGS += -$(DEBUG) #CFLAGS += $(CDEFS) CFLAGS += -$(OPT) #patsubst(x,y,z) sucht in z nach Leerzeichengetrennten Wörtern mit dem #Muster x und ersetzt diese durch y CFLAGS += $(patsubst %,-I%,$(EXTRAINCDIRS)) #Hier wird also in EXTRAINCDIRS nach Leerzeichen " " gesucht und diese #dann durch "-I " ersetzt CFLAGS += -std=$(CSTANDARD)

# Assembler Flags ASFLAGS = -$(MCU)

# Linker Flags LDFLAGS =

# Ausgabepfad OUTPUTPATH=LIB_$(MCU)/

# Benutzte Programme CC = avr-gcc REMOVE = rm -f COPY = cp AR = ar MD = gnumkdir -m666 -p NM = nm

# Standardausgaben definieren # Deutsch MSG_ERRORS_NONE = Fehler: keine MSG_BEGIN = -------- Anfang -------- MSG_END = -------- Ende -------- MSG_ARCHIEVING = Archivieren: MSG_COMPILING = Kompilieren: MSG_ASSEMBLING = Assemblieren: MSG_CLEANING_OBJ = Projekt bereinigen .o: MSG_CLEANING_TGT = Projekt bereinigen .a: MSG_COPYING = In .hex kopieren: MSG_SHOW_ARCHIVE = Funktionen der Library:

# Den Namen der Objektdateien bestimmen (Die .c Dateien werden zu .o # Dateien) OBJ = $(SRC:.c=.o) $(ASRC:.S=.o) OBJ2 = $(patsubst %,$(OBJPATH)%,$(OBJ))

#Den neuen Targetnamen bestimmen TARGET2 = lib$(TARGET)

# make all all: begin avrgccversion clean_obj build show_archive end

begin: @echo @echo $(MSG_BEGIN)

end: @echo $(MSG_END) @echo

avrgccversion: @$(CC) --version

build: lib

lib: $(TARGET2).a

# archieve: create .a output file from object files. # "$

Reply to
Heiko Lechner

d.h. ich könnte bei dieser Link-Reihenfolge z.B. printf() durch eine selbstdefinierte Funktion im Programm einfach überschreiben, ohne das der Linker meckert?

Cool, man lernt nie aus! Muss ich morgen mal ausprobieren.

Reply to
Thomas Kindler

Heiko Lechner schrieb:

usw .....

Argh ich habe es geahnt. Und die Doku schreib ich dann in Latex :)

Ich weiß schon warum wir den Codevision verwenden. Wenn nur an die Register und an EEPROM Variablen denke.

Danke schon mal für die Info.

Reply to
Andreas Ruetten

Du hast die Eleganz eines Makefiles nur noch nicht erkannt. :-)

Nö, in SGML, Stichwort "docbook".

Gruß Henning

Reply to
Henning Paul

Thomas Kindler schrieb:

Nein. ;-)

Ja, meckern wird er nicht. Aber du hast in C (genauer gesagt: in einem hosted environment) nicht das Recht, Funktionen der Standardbibliothek selbst zu überschreiben. Dies gibt dem Compiler die Möglichkeit, Optimierungen auf der Basis seines Wissens über die Standardfunktionen vorzunehmen. Wenn du also irgendwo schreibst:

... dosomething("This string", strlen("This string"));

dann darf der Compiler daraus machen:

dosomething("This string", 11);

da er weiß, was die Funktions strlen() mit einem konstanten String macht. GCC beispielsweise ersetzt:

printf("Foo!\n");

durch

puts("Foo!");

In einem freestanding environment (-ffreestanding) darf er das zwar nicht machen, dann kannst du die Bibliotheksfunktionen auch überschreiben, aber dir entgehen eben u. U. auch einige Optimierungen. Da heutzutage auch embedded applications typischerweise einiges aus der Systembibliothek benutzen (die sich wiederum soweit möglich an die C-Standard-Bibliothek anlehnt), sind sie gar nicht mehr so recht der klassische Fall von freestanding environment, für die man sie zuerst halten könnte.

--
cheers, J"org               .-.-.   --... ...--   -.. .  DL8DTL

http://www.sax.de/~joerg/                        NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
Reply to
Joerg Wunsch

Henning Paul schrieb:

Irgendsowas wird sein Codevision auch benutzen... nur dass er es nicht (ohne weiteres) modifizieren kann.

Oder halt in Doxygen. Dann wird sie wenigstens mit dem Code auch parallel gleich mit gepflegt.

--
cheers, J"org               .-.-.   --... ...--   -.. .  DL8DTL

http://www.sax.de/~joerg/                        NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
Reply to
Joerg Wunsch

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.