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
Unter View gibt es "Disassmbler". Dprt kannst Du sehen, in welche Assembler-Befehle der Compiler Deine Anweisungen umgesetzt hat.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.