Hallo, gibt es eigentlich ne Möglichkeit genau festzustellen wie ausgelastet ein µC ist (die zudem nicht viel Arbeit macht) ? Ich mache meistens in die Main-Schleife (while(1))eine Variable die ich bei jedem Durchlauf erhöhe. Nach 10 Sekunden schaue ich mir dann an wie oft der da war. (Das Programm läuft hauptsächlich über Interrupts. In der main wird nix außer der initialisierung ... Gruß
du kannst in der main imme einen Port auf 0 Schalten. Und im Interrupt immer auf 1. Wenn du jeztt mit einem LogicAnalyser oder Speicheroszi oder LED rangehst, siehst du wie ausgelastet dein Controller ist.
Ja, man hat die Warteschleife im Main und jedesmal wenn der Prozess da reingeht setzt man einen Pin hoch und wider tief. Dann kann man mit dem Scope zuschauen.
Was "ausgelastet" bedeutet, kannst nur Du entscheiden. Der Controller an sich ist immer zu 100% ausgelastet, es sei denn, er schläft (sleep). Wenn Du mit "ausgelastet" = "nicht in der Main-Loop" meinst, ist die von Dir verwendete Methode wohl am geeignetsten.
Ja, das meinte ich damit. Ausgelastet in dem fall = nicht in der main (Weil er da ja nix macht und nur strom verschwendet ;)
Du hast vielleicht auch einen Timer (und ein paar RAM-Bytes) frei, den könntest Du auch hernehmen um die Zyklen zu messen, die so verbraucht werden. Vorteil: Macht Dir der Prozessor eigentlich als Abfallprodukt. Nachteil: So wie ich das sehe, müsstest Du jeden Interrupt verändern.
Meine (neueren) Programme (AVR, in ASM) laufen alle mit Interrupts und benutzen den Sleep. Wenn mich (nur bei umfangreicheren Programmen) die Auslastung interessiert, nutze ich einen freien Portpin, setze ihn zu Beginn jeder ISR auf H und direkt vor Sleep (Mainloop) wieder auf L. Nun kann man mit einem Tastgrad-Messgerät die Auslastung direkt ablesen. Mit einem Oszi erkennt man neben der Auslastung auch, ob einige Mainloop-Jobs länger als die Pause zwischen zwei Timer-Interrupts dauern. ...
Wenn du deinen µC in den Pausen nicht schlafen schickst und in der Main() ausser einer Warteschleife sonst nichts steht, könntest du es vielleicht mal damit versuchen: In der Main() einen Endlosloop mit folgendem Inhalt einbauen:
1 | DDRB |= 1<<PB0; // PB0 als Ausgang setzen |
2 | PORTB |= 1<<PB0; // PB0 auf definierten Wert (High) setzen |
3 | |
4 | while(1) |
5 | {
|
6 | cli(); // Interrupts disablen |
7 | PORTB ^= 1<<PB0; // Portpin auf 0 setzen |
8 | PORTB ^= 1<<PB0; // Portpin auf 1 setzen |
9 | sei(); // Interrupts enablen |
10 | };
|
Damit erhältst du an PB0 ein PWM-Signal, dessen Tastverhältnis durch die abzuarbeitenden Interrupts moduliert wird. An diesem Portpin kann nun ein Tiefpassfilter (RC-Glied) angeschlossen werden um dann eine analoge Spannung zu erhalten. Diese Spannung kann bequem mit einem Multimeter gemessen werden. Nachteile dieser Methode wären: - der Spannungsverlauf ist nicht proportional zur Prozessorauslastung - bei 0% Prozessorauslastung beträgt die analoge Spannung nicht 0V ( --> Offsetspannung; kann aber zur Not experimentell ermittelt werden) Gruß, Magnetus
Tja, da ist 'CBI PORTB,PB0' und 'SBI PORTB,PB0' weniger kryptisch. Aber man kann nicht alles haben... ;-) Duck&wech... ...
Fehlerteufel wrote: > Hahaha > ich hab eine 0 gegen eine 1 vertauscht!! Ach wirklich...? Wo denn...?!? staun
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.