Forum: Compiler & IDEs Wie avr-gcc starten?


von Günther (Gast)


Lesenswert?

Hallo,
kann mir jemand schreiben, wie man unter
Windows98  das avr-gcc starten kann?
Wenn man es direkt anklickt, huscht des DOS-Fenster
über den Bildschirm, wenn man ein DOS-Eingabefenster
öffnet und avr-gcc aufruft, kommt eine Fehlermeldung
von wegen keiner Inputdatei.

Ich erinnere mich dunkel, daß man es irgendwie starten
konnte und sich dann nur noch zum Verzeichnis mit
der C-Datei und der makefile navigieren mußte.
Aber mir fällt partout nicht mehr ein, wie das erreicht wurde.
Sicher ein Frühsympton von Alzheimer.
Kann mir jemand helfen?
Vielen Dank
Günther

von Sebastian Schildt (Gast)


Lesenswert?

Also falls du WinAVR installiert hast (solltest du, falls du es noch
nicht hast), dann schaue mal in das Verzeichnis

WnAVR/examples/demo

Da ist ein Beispielprojekt. Prinzipiell muss man nur in das VErzeichnis
wchseln und "make all" eingeben.

Man kann das Projekt als Beispiel für seine eigenen verwenden.
Zusätzlich  .c un .h File müssen dann lediglich im Makefile eingefügt
werden.

Mit "make extcoff" kann man ein .cof File erzeugen, welches das
Debuggen im AVRStudion von Atmel erlaubt (ab Vesion 4.0.8).

Helfen dir die Hinweise wieder auf die Sprünge ? :)

MfG

Sebastian

von Sven Bohner (Gast)


Lesenswert?

hi,

hab zwar bis jetzt die AVRs in assembler programmiert (werde ich auch
weiterhin, nach 7 jahren assemblererfahrung)

aber die infos kann ich dir geben....

die GCC - Compiler kommen ursprünglich aus der Linuxecke
    (konsolenfetischisten, sorry)

d.h.: der gcc ist ein textbasiertes kommandozeilen-konsolenprogramm,
für den es aus der windowswelt noch kaum einer geschafft eine GUI zu
schreiben,
   bis auf einer
      Software:   "AVREdit"
      kostet:     nix
      gibts bei:  http://www.avrfreaks.net/AVRGCC/index.php?
                  PHPSESSID=cd58cd644299ed00eca56431657081ff
           -> bildschirm nach unten scrollen der zweite eintrag un
              downloaden...

generell: würde ich an deiner stelle, jedoch üben, den gcc direkt zu
verwenden... bei www.avrfreaks.net gibts da einen guten startpunkt, um
sich über den avrgcc zu informieren...

von Jörg Wunsch (Gast)


Lesenswert?

Vorsicht: soweit ich weiß, schleppt AVRedit eine hornalte Version von
Compiler und Bibliothek mit sich rum.  Nicht benutzen.

Daß Unixer ,,Consolenfetischisten'' seien, ist ein Gerücht, daß sich
in Windows-Kreisen ganz hartnäckig hält. ;-) Nein, ich drücke
beispielsweise auf die Taste F5, um den Job zu compilieren, oder mit
der mittleren Maustaste (ein Luxus, den es seit der Microsoftschen
Segnung der Wühlmaus ja nun auch für Windowser gibt :-) auf eine
Fehlermeldung, um zur entsprechenden Codezeile zu kommen.  GUI?  Hmm,
einfach Emacs.  Ein Texteditor für alles: zum Schreiben und Debuggen
von Code (gleiches ,,GUI'' für alle Plattformen, AVR, IA32,
Kerneldebugging, ... -- Windows ist heute noch lange nicht dort), von
emails, Textdokumenten, oder selbst zum Posten in diesem Forum.

Ansonsten bringt wohl WinAVR ebenfalls einen Editor mit, den man so
einigermaßen als IDE für den Job ansehen kann.

von Sven Bohner (Gast)


Lesenswert?

Wollte nicht falsch verstanden werden...
bin doch selbst auf linux...

zu gui: günther hat ja anscheinend eine gui erwartet, als er es in
seinem (wahrscheinlich) explorer "doppelklickte". zumindest erwartete
er eine ui (user interface) (übrigens kenne ich den emacs, und ich hab
ihn nicht gemeint, und ich liebe in ebenfalls... :-))

man kann avredit übrigens ohne bedenken benutzen, schliesslich wurden
avrs mit dieser compilerversion sehr lange und auch erfolgreich
programmiert... also wozu unnötige Panikmache mit !!!nicht
benutzen!!!??????

Jörg Wunsch :
"Ansonsten bringt wohl WinAVR ebenfalls einen Editor mit, den man so
einigermaßen als IDE für den Job ansehen kann." -> dann schreib ihm
doch rein wie er es machen muß, und hack nicht beleidigt auf meinem
post rum...
er kann den avrgcc auch ganz einfach ins AVRStudio 3.56 einbetten und
hat ne komplette IDE!!! wie das im detail funktioniert ist auch unter
www.avrfreak.net beschrieben....

übrigens günther, was zu makefiles, und beispielmakefiles findest du
hier:
 http://www.avrfreaks.net/AVRGCC/index.php

und jörg:
  tut mir leid, dich mit konsolenfetischist beleidigt zu haben...

von Jörg Wunsch (Gast)


Lesenswert?

> man kann avredit übrigens ohne bedenken benutzen, schliesslich
> wurden avrs mit dieser compilerversion sehr lange und auch
> erfolgreich programmiert... also wozu unnötige Panikmache mit
> !!!nicht benutzen!!!??????

Weil es dafür keinerlei Support mehr gibt, weil es keine Doku gab
damals (so daß die Leute hier dieselben uralten Fragen alle nochmal
stellen), etc. pp.

AVR Studio 3 ist ebenfalls tot.  Wenn es Probleme mit einem COFF-File
dort gibt, wird Atmel sie nicht mehr beseitigen.

> dann schreib ihm doch rein wie er es machen muß, ...

Windows löschen, FreeBSD installieren, Emacs benutzen. :-))

Sorry, ich habe keine wirkliche Ahnung, wie man das unter Windows
anstellen muß.  Schließlich benutze ich extra kein Windows, damit ich
mich nicht mit dessen Problemen herumschlagen muß.  Aber viele andere
sind mit den existierenden Anleitungen für WinAVR und PN
zurechtgekommen, es kann also gar nicht so sehr schwer sein.

Ich habe allerdings Ahnung von der avr-libc, zumindest so viel, daß
ich dort einer der Entwickler bin, und habe selbst genügend Stunden
auch in die Doku gesteckt, als daß ich hier vor der Benutzung von
überalterten Versionen warnen möchte.  Das war das Hauptanliegen
meines Postings.

von Günther (Gast)


Lesenswert?

Hallo,
vielen Dank für die Antworten.
Es funktioniert jetzt ganz gut, seitdem ich gemerkt habe,
daß ich im DOS-Fenster nicht gcc, sondern make aufrufen
muß. Ich benutze jetzt pn2, make und TwinAVR nebeneinander
und seitdem ich W2k gelöscht und Win98 installiert habe,
geht es ganz gut, um nicht zu sagen, hervorragend.

Allerdings finde ich auch, daß die Dokumentation
erweiterungsbedürftig ist. Ich versuche verzweifelt,
da und dort ein paar Zeilen Assembler in einem C-Programm
unterzubringen, aber man findet kaum etwas, und solche
Konstuktionen wie asm("Anweisung") "/n/t" verschmäht
der Compiler.
Man hat es halt nicht leicht.
Gruß
Günther

von Jörg Wunsch (Gast)


Lesenswert?

Umm, hast Du denn die Doku überhaupt mal gesucht?  Gerade der
inline-Assembler ist ausnehmend gut dokumentiert worden.

Ganz davon abgesehen: gerade am Anfang solltest Du wohl von inline asm
erstmal absehen.  Es gibt nur ganz selten Gründe, warum man das machen
will, fast immer ist ein C-Konstrukt, selbst wenn er auf den ersten
Blick gar nicht so ,,schlank'' aussieht, im Kompilat am Ende genauso
effektiv.  Das klassische Beispiel ist sowas wie:

PORTB |= _BV(2);

...dem man sicher auf den ersten Blick nicht ansieht, daß ein einziger
SBI-Befehl dabei rauskommt.

von Christian Schifferle (Gast)


Lesenswert?

Hi Günther

Wenn du schon mit PN2 arbeitest kannst du den Aufruf von Make ganz
einfach als Tool integrieren. Dann braucht's keine DOS-Box mehr.
Das geht so:
-Im Menu Tools den Eintrag Options auswählen.
-Im Options-Dialog auf Tools klicken.
-Als Scheme C/C++ auswählen.
-Auf Add klicken.
-Formular ausfüllen:
-  Name: beliebig, z.B. Make all
-  Command: make
-  Folder: leer lassen
-  Parameters: all
-  Capture Output: aktivieren und use an individual output window
-  Clear output before running: aktivieren
-  Use the built in error parser: aktivieren

Das Ganze gut umrühren, speichern und loslegen.

Ich habe mir übrigens auch entsprechende Einträge für andere Tools
(z.B. PonyProg2000) auf die gleiche Weise eingerichtet.

Gruss
Christian

von mthomas (Gast)


Lesenswert?

kleiner Nachtrag, falls die von Christian beschriebene Methode etwas
"bockt": bei Folder ein %d eintragen.

von Günther (Gast)


Lesenswert?

Hi
 Jörg
doch in der AVR-doku lese ich auch, ich finde
sie sehr gut, aber für einen Anfänger
nicht ausreichend. Und das Kapitel mit dem
asm inline habe ich noch nicht erfolgreich
nachvollzogen.
Die Assemblerzeilen ist nur ein Notbehelf
mangels solider C-Kenntnisse (ich schaffe es
z.B. nicht, bei der I2C-Ansteuerung die wörtlich (!)
aus dem ATmega-Manual abgeschriebene while-
Schleife mit ";" zum Laufen zu bringen. Wenn
ich in ein Unterprogramm springe und ein
paar Lämpchen blinken lasse, geht es, wenn
ich dann wieder zum ";" oder wenigstens zu einer
Delayschleife zurückkehre, geht es nicht mehr.
Deshalb mein Bedarf nach Assembler-inline
Günther

von Jörg Wunsch (Gast)


Lesenswert?

Analyse des Problems wäre aber besser, als sich nur nach der Methode
,,Zurechtwurschteln, bis da was funktioniert'' rumzudrücken.

Erster Versuch: Du benutzt einen ATmega128 im Auslieferungszustand?

Das wäre wieder ein typischer Fall für FAQ nicht gelesen...

von Günther (Gast)


Lesenswert?

@Jörg
ich habe einen ATmega16 auf einem Entwicklungsboard
von Olimex. Den programmiere ich mit TwinAVR.
Im Auslieferungszustand ist er nicht mehr, allerdings
ist der Compiler fabrikfrisch, also noch nicht für die max.
Speichergröße (avr5) eingestellt, weil ich das
für meine Exercitien z.Zt. nicht brauche.
Aber zu meinen Problemen mit C, warum z.B. Funktionen
nicht aufgerufen werden, kann ich in meinen Manuals
nichts finden.
Es bleibt nichts anderes übrig, als weiter zu suchen
- auch in den FAQs.
Gruß
Günther

von Jörg Wunsch (Gast)


Lesenswert?

Mit der Bemerkung:

> Im Auslieferungszustand ist er nicht mehr, allerdings ist der
> Compiler fabrikfrisch, also noch nicht für die max.  Speichergröße
> (avr5) eingestellt, weil ich das für meine Exercitien z.Zt. nicht
> brauche.

Heißt das, daß Du den richtigen MCU-Typ beim Compilieren nicht
verwendest?  Dann brauchst Du Dich auch nicht wundern, warum Deine
Funktionsaufrufe nicht funktionieren...

Dein Problem ist vermutlich eine falsche Initialisierung des
Stackpointers, aber mit den paar Brocken, die Du durchblicken lassen
hast, kann man das schwer einschätzen.

Eigenwerbung:

http://www.sax.de/~joerg/mfile/

falls Du Dich jetzt erstmal noch nicht mit den Details von `make'
befassen willst, aber schnell zum Zuge kommen möchtest.

von Günther (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Jörg
>Heißt das, daß Du den richtigen MCU-Typ beim Compilieren nicht
>verwendest?
doch, natürlich schon, aber sonst nabe ich in der makefile
nichts verändert, insbesondere den Optimierungsgrad nicht.
Und in einer FAQ habe ich gelesen, daß manche Delayschleifen
einfach wegoptimiert würden, wenn man nicht "volatile" an passender
Stelle einfügt.

>Dein Problem ist vermutlich eine falsche Initialisierung des
>Stackpointers, aber mit den paar Brocken, die Du durchblicken lassen
>hast, kann man das schwer einschätzen.

Ich schicke Dir sehr gern das Programm. Es wäre nett, wenn Du mal
einen Blick draufwerfen künntest. Es ist nur ganz kurz und ein
geübter C-Programmierer hat sicher mit einem Blick den Fehler entdeckt.

Es handelt sich um die Ansteuerung eines I2C-Bausteins. Ich habe ea
aus dem AVR-Manual genommen, nicht weil ich Deine Ein-Bier-Lizenz
aus avr-libc nicht bezahlen wollte (eigentlich schulde ich Dir
inzwischen mehr als nur ein Bier für die anderen Informationen aus
avr-libc), sondern weil das Manualbeispiel nur das Gerippe für TWI
enthält.

>Eigenwerbung:
>http://www.sax.de/~joerg/mfile/
Kenne ich. Noch einfacher: makefile aus gcctest anpassen.
Vielen Dank
Günther

von Jörg Wunsch (Gast)


Lesenswert?

> doch, natürlich schon, aber sonst nabe ich in der makefile nichts
> verändert, insbesondere den Optimierungsgrad nicht.

D. h. -O0?  Das ist immer eine schlechte Idee.  Der dabei entstehende
Code ist um ein Vielfaches größer als optimierter Code, viele Fehler
werden erst durch die Optimierung offensichtlich.  Aus diesem Grunde
taugt Weglassen der Optimierung m. E. nicht einmal fürs Debuggen.
Kommt hinzu, daß viele Compilerwarnungen erst durch die
Codeflußanalyse des Compilers produziert werden können, die bei -O0
nicht aktiviert ist.

Für Verzögerungsschleifen nimmt man ohnehin besser die Makros aus
<avr/delay.h> statt irgendwelcher Versuche, das mit einer einfachen
for-Schleife zu tun.  Die haben wenigstens den Vorteil, daß schon mal
jemand durchgerechnet hat, wie lange ein Schleifendurchlauf braucht.
(Mit -O0 stimmen die Angaben allerdings trotzdem nicht exakt, weil der
Compiler dann die inline-Aufforderung ignoriert.)

> Ich schicke Dir sehr gern das Programm. Es wäre nett, wenn Du mal
> einen Blick draufwerfen künntest.

Ich kann Dir nicht exakt beschreiben warum, aber irgendwie finde ich
es von der Formatierung her sehr unübersichtlich und schwer zu lesen.
Dadurch werde ich auch kaum irgendwelche Fehler sehen können.

> Die while-Schleifen (unten markiert durch xxxxxxxxxxxxx ).  Nimmt
> man den Sprung zu blink(...) heraus, endet das Programm in der
> if-Zeile, d.h. TWSR nicht ok.

Unverständlich.  Wenn Du mal gegen meinen Beispielcode vergleichst
(den ich natürlich getestet habe und der im Wesentlichen auch nur aus
der Atmel-Doku abgeschrieben ist), funktioniert die leere
while-Schleife dort sehr wohl.

> int main()
>   {
> DDRC=252;     /* Port 1 u.2.(TWI) naturbelassen, Rest Ausgänge */
> /* AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA  */
>     {led=119; k=99000 ; blink(k,led);}    /* gn rt außen = 119*/
>     start();
>     main();

Hmm, meinst Du wirklich, daß es sinnvoll ist, aus main() heraus wieder
main() aufzurufen? ;-)

von Sebastian (Gast)


Angehängte Dateien:

Lesenswert?

Das Muesste Dir weiterhelfen !

http://www.avrfreaks.com/Tools/ToolFiles/376/install_config_WinAVR.pdf

mfg
Sebastian

von Günther (Gast)


Lesenswert?

>D. h. -O0?  Das ist immer eine schlechte Idee.
Nein, ist "naturbelassen", steht auf -O2.

>Ich kann Dir nicht exakt beschreiben warum, aber irgendwie finde ich
>es von der Formatierung her sehr unübersichtlich und schwer zu lesen.
Stimmt genau, ist aber nur die erste Version auf dem Weg zu einer
ordentlichen Struktur. Ich wollte bei schrittweiser Veränderung testen
ob alles noch funktioniert und bin schon beim allerersten Schritt
gescheitert. Zuvor war alles in einem Sück, wo es
zwar funktionierte, aber nicht zur Weiterverwendung taugte.

>Dadurch werde ich auch kaum irgendwelche Fehler sehen können.
Nun enttäusche einen Anfänger nicht; wer, wenn nicht Du.

> Wenn Du mal gegen meinen Beispielcode vergleichst
>(den ich natürlich getestet habe und der im Wesentlichen auch nur aus
>der Atmel-Doku abgeschrieben ist), funktioniert die leere
>while-Schleife dort sehr wohl.
Bei funktionierte die dritte Schleife ja auch. Ich werde Deinen
Code nochmals genau durchsehen und ggf. übertragen. Aber findet Du
an meinen while-Schleifen syntaktische Fehler?

>Hmm, meinst Du wirklich, daß es sinnvoll ist, aus main() heraus wieder
main() aufzurufen? ;-)
Im Prinzip ja, damit man das Leuchten der LED's schön lange sieht,
auch wenn sie nur kurz geschaltet werden.
Zum Gebrauch des Programms muß der ganze Kram natürlich raus.

Gruß
Günther
nospam.schubert@ine.fzk.de

von Jörg Wunsch (Gast)


Lesenswert?

>> Dadurch werde ich auch kaum irgendwelche Fehler sehen können.

> Nun enttäusche einen Anfänger nicht; wer, wenn nicht Du.

Mach's halblang, ich bin doch nicht Jesus. ;-)

> Aber findet Du an meinen while-Schleifen syntaktische Fehler?

Zumindest keine auf Anhieb offensichtlichen.

>> Hmm, meinst Du wirklich, daß es sinnvoll ist, aus main() heraus
>> wieder main() aufzurufen? ;-)

>Im Prinzip ja, damit man das Leuchten der LED's schön lange sieht,
>auch wenn sie nur kurz geschaltet werden.

Trotzdem nicht: main() ruft ja wieder main() auf, das wieder main()
aufruft... bis irgndwann Dein Stack übergelaufen ist.

Nee, wenn Du die LEDs verzögern willst, nimm einen Timer.

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
Noch kein Account? Hier anmelden.