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


von Johannes (Gast)


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

von Mehmet K. (mkmk)


Lesenswert?

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

von Johannes (Gast)


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

von Johannes (Gast)


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

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.