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.
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.
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.
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.
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?
> 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. ...
Hannes Lux wrote:
> Ich programmiere AVRs allerdings in ASM.
Meinst du, in Cobol oder FORTH würde man das komplett anders lösen?
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.