Frage zu ATMega16 und AVR Studio

Gast #336774
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
Gast #336776
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
Gast #336777
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.