Forum: Mikrocontroller und Digitale Elektronik AVR Instruction Set für C


von blub (Gast)


Lesenswert?

Hallo ich wollte mal fragen ob es auch sowas wie "Instruction Set" für C 
Befehle gibt oder ob ich mir die ASM Befehle ableiten muss.
Im Grunde interessiert mich wie lange der µC für einen gewissen 
Codeabschnitt braucht und wie viel CPU Last entsteht.

Wäre nett wenn mir jemand helfen könnte.

von Lorenz .. (lorenz)


Lesenswert?

Hallo,

Das kommt auf viele Faktoren an. Der verwendete Compiler optimiert je 
nach eingestelltem Grad unterschiedlich, so dass du da keine generellen 
Aussagen treffen kannst. Wenn du genau wissen willst wie lange eine 
Passage braucht: Schau im Output des Compilers nach, da stehen die 
ASM-Befehle drin die du dann mit den entsprechenden Zeiten aufsummieren 
kannst. So weißt du dann wie lange jede Sequenz genau braucht.

von Andreas K. (a-k)


Lesenswert?

Sowas gibt es nicht und kann es nicht geben. Zumal das absolut gleich 
aussehende C-Statement abhängig von allerlei Randbedingungen mal 0 
Takte, mal 100 Takte dauern kann.

Wenn dich das exakt interessiert, dann wirst du kaum darum herum kommen, 
in den vom Compiler erzeugten Code reinzuschauen. Beim GCC wäre das LSS 
File dafür geeignet. Oder du misst die Zeit.

von 900ss (900ss)


Lesenswert?

Angenommen Du nutzt den GCC....
Du findest das ganze im Listingfile, das avr-objdump generieren kann.
Dort sind die C-Source Zeilen aufgeführt und dazu die Assembler-
anweisungen. Z.B. so:

avr-objdump -h -S executable.elf  > executable.lss

Man kann nicht pauschal sagen, was der Compiler daraus generiert,
da es von den Optimierungen abhängt. Wenn Du eine Optimierungssufe
wählst, dann mußt Du im Listig schon etwas aufpassen um den 
dazugehörigen
Assemblercode ausfindig zu machen. Geht aber.

von blub (Gast)


Lesenswert?

ok danke schön das reicht mir ja auch schon wenn ich den asm code hab 
kann ich die zeit ja auch aus rechnen. und wie sieht es mit der cpu 
auslastung aus?

von Ekschperde (Gast)


Lesenswert?

LOL

Wie wärs mit 100%?

von Hannes L. (hannes)


Lesenswert?

> und wie sieht es mit der cpu
> auslastung aus?

Ich lese die CPU-Auslastung gern mit Oszilloskop oder der 
Tastgradmessung des Multimeters aus. Dazu schalte ich zu Beginn jeder 
ISR einen Portpin ein, den ich am Ende der Mainloop vor dem Befehl SLEEP 
wieder ausschalte. Ich programmiere AVRs allerdings in ASM.

...

von Joan P. (joan)


Lesenswert?

hehe

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hannes Lux wrote:

> Ich programmiere AVRs allerdings in ASM.

Meinst du, in Cobol oder FORTH würde man das komplett anders lösen?

von Hannes L. (hannes)


Lesenswert?

Jörg Wunsch wrote:
> Hannes Lux wrote:
>
>> Ich programmiere AVRs allerdings in ASM.
>
> Meinst du, in Cobol oder FORTH würde man das komplett anders lösen?

Mit Sicherheit nicht. Ich wollte damit begründen, warum ich auf den 
anderen Teil der Frage (Liste der AVR-C-Befehle) nicht weiter eingehe.
Dann wollte ich mir damit auch die Nachfrage ersparen, mit welchen 
"AVR-C-Befehlen" man das realisiert. ;-)

Ich wollte damit keinesfalls etwas gegen C sagen, höchstens, dass ich zu 
doof dazu bin.

Vielleicht solltest Du beim Lesen meiner Texte aber einfach nur mal das 
Humor-Flag in Deinem SREG setzen und nicht jedes Wort auf die Goldwaage 
legen...

Beste Grüße,
Hannes

von Timmo H. (masterfx)


Lesenswert?

Wenn du AVR Studio verwendest kannst du mit dem eingebauten Simulator 
genau anzeigen lassen wieviele Takte schon vergangen sind. Das kann dir 
viel Rechenarbeit ersparen.
Die Auslastung ist quasi immer 100%, da du ja immer was machst. Eine 
while(1) Schleife wartet ja nicht, sondern führt ständig Sprungbefehle 
aus.
Wenn du eine Schleife hast, in der 100 Additionen gemacht werden 
passiert das immer mit der maximalen Geschwindigkeit, braucht jedoch 
insgesamt 100 Takte (im Optimalfall) für einen Durchlauf. Wenn du eine 
Schleife hast in der 10 Additionen durchgeführt werden dauert das nur 10 
Takte, aber gerechnet wird dennoch mit der gleichen Geschwindikeit. Die 
Auslastung bleibt daher 100%, da er einfach nicht schneller rechnen 
kann. Man könnte die Auslastung mehr oder weniger nur Schätzen, indem du 
guckst wieviel Takte du mit sinnvollen Arbeiten machst (also alles außer 
while(1) wenn du so willst). Wenn du 1000 Takte wartest und nur 100 
Takte rechnest ist die Auslastung daher 10%. Da bei einem µC erstmal 
kein Betriebssystem drauf ist, das den zeitlichen Ablauf der Prozesse 
und Threads steuert, kann nur sequentiell gearbeitet werden. Ein 
betriebssystem würde hingegen einen anderen Prozess arbeiten lassen 
wärend der andere wartet.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Hannes Lux wrote:

> Mit Sicherheit nicht. Ich wollte damit begründen, warum ich auf den
> anderen Teil der Frage (Liste der AVR-C-Befehle) nicht weiter eingehe.

Ach so...

> Vielleicht solltest Du beim Lesen meiner Texte aber einfach nur mal das
> Humor-Flag in Deinem SREG setzen und nicht jedes Wort auf die Goldwaage
> legen...

Danke, gleichfalls. ;-)  Ich hatte auch nur vergessen, den Smiley
dahinter zu setzen (bzw. hatte geglaubt, dass die Wahl zweier eher
exotischer Programmiersprachen dies implizit andeuten würde).

Die Programmiersprache C kennt übrigens den Terminus "Befehl" gar nicht.

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.