mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frage zu ATMega16 und AVR Studio


Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin neu bei AVR Studio, nicht neu bei ATMega16.

Ich will AVR Studio verwenden um zu simulieren und zu debuggen, meine
Programme testen...  und find AVR Studio bislang dazu ganz gut(noch
ganz am Anfang).

folgendes Codefragment in C:

char a,b,c;
a=1;
b=2;
c=3;
a=a+b;

Beim Debuggen schaue ich mir unter Processor die Felder "Stop Watch"
und "Cycle Counter" an. Fuer eine solche Anweisung (a=1; oder a=a+b)
werden 5 cycles verbraucht, bei einer Frequenz von 16MHz werden also
knapp ueber 300ns bei der Stop Watch dazugezaehlt.

Ich dachte diese Anweisungen gehen in einem Takt bei den AVR uCs. Der
AVR-GCC(den ich verwende) muesste doch locker so schlau sein, diese
Befehle in jeweils einen ASM-Befehl umzuwandeln.

Warum werden in der Simulation 5 Cycles fuer einen der obigen Befehle
verbraucht? Ist das dann auch in einem echten Mega16 der Fall?

mg,
Johannes

Autor: Mehmet Kendi (mkmk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Unter View gibt es "Disassmbler". Dprt kannst Du sehen, in welche
Assembler-Befehle der Compiler Deine Anweisungen umgesetzt hat.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke fuer den Tip! Seh sowas zum erstenmal...
ok, eine Anweisung dauert also zwei Schritte LDI und STD, das versteh
ich, das erklaert mir aber immer noch nicht die 5 Taktzyklen, die
verbaucht werden. Irgendwie ist das komisch. Oder nicht?

mg,
Johannes

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich geb zu es hat lage gedauert, bis ich drauf gekommen bin.  Nur falls
es jemand anders auch interessiert, schreib ich hier kurz wies
funktioniert.

Ein C Befehl wird vom (meistens)Compiler in mehrere Assemblerbefehle
uebersetzt. Einige Befehle werden in einem Taktzyklus, andere aber in 2
oder auch mehreren Taktzyklen abgearbeitet.

Beispiel:
C-Code (Schreiben in ein 16bit register)
OCR1A = 0x0008;

Assembleruebersetzung der AVR-GCC
(Auszug aus Disassembler view in AVR Studio)
+00000080: E088      LDI  R24,0x08    Load immediate
+00000081: E090      LDI  R25,0x00    Load immediate
+00000082: 9390004B  STS  0x004B,R25  Store direct to data space
+00000084: 9380004A  STS  0x004A,R24  Store direct to data space

LDI-Befehle benoetigen einen Taktzyklus auf AVRs, STS-Befehle brauchen
2 (siehe Datenblatt). Fuer eine einfache Zuweisung in C werden also
immerhin 1+1+2+2 = 6 Taktzyklen benoetigt.

Sorry fuer alle Assembler Spezialisten, dass ich euch langweile. Ich
programmiere immer nur C und fand es jetzt interessant diese Dinge im
konkreten Beispiel herauszufinden. Vielleicht will es irgendwer
irgendwann mal nachlesen ;)

mg,
Johannes

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.