Forum: Mikrocontroller und Digitale Elektronik Prozessorlast messen


von E. H. (emax)


Lesenswert?

Hallo miteinander,

ich befasse mich gerade mit der Frage, wie ich am besten die 
Prozessorauslastung eines Systems messen könnte. Thema ist, dass ich 
einfach wissen möchte, was ich dem Rechenknecht noch so zumuten kann. 
Ich hab nämlich keine Idee, ob die vorhandenen AUsgaben überhaupt noch 
zusätzliche Arbeiten zulassen, oder ich eine leistungsfähigere Lösung 
brauche.

Die Frage soll nicht typspezifisch verstanden werden, vielmehr suche ich 
nach einem Konzept.

Ich hatte das für einen 8051 schon mal ansatzweise kodiert (in C):

- in der mein-routine, also da, wo sich der Prozess herumlümmelt und auf 
Artbeit wartet, hatte ich einen long-wert inkrementiert.
- nach einer festegelgten Zeit wurde der Wert mit dem Wert verglichen, 
der in der gleichen Zeit bei völliger Untätigkeit zu erreichen gewesen 
wäre
- das Verhältnis der beiden Werte entsprach in etwa der Auslastung.
- der jeweils letzte gemessene Wert wurde gesichert und bei Bedarf 
(Tastendruck) auf dem Display ausgegeben.

Sehr primitiv und wegen der nicht kompensierten carry-Verarbeitung (also 
Überträgsadditionen) nicht exakt. Aber es gab mir einen brauchbaren 
Überblick über den Beschäftigungsgrad des Rechners.

Nun gibst sicher elegentere und egnauere Methoden, nur hab ich die hier 
im Forum nicht gefunden.

Wie macht Ihr sowas?

von E. H. (emax)


Lesenswert?

> ob die vorhandenen AUsgaben

Ich meine natürlich "die vorhandenen Au_f_gaben"

von Gebhard R. (Firma: Raich Gerätebau & Entwicklung) (geb)


Lesenswert?

für kurze Zeiten hat sich das setzen und rücksetzen eines Pins mit der 
Zeitmessung über ein Oszi gut bewährt.Für längere Zeiten bietet sich ein 
interruptgesteuerter ms Timer an,den Wert kann man dann über serielle 
Schnittstelle ausgeben.

Grüße

von Purzel H. (hacky)


Lesenswert?

Ich habe eine main() die wartet auf Ereignisse. Interrupts machen was 
sie sollen, setzen ein Flag und das Main macht den passenden Rest. 
Gewartet wird ausschliesslich im Main. Dort lass ich bei jedem Durchgang 
einen Pin pulsen. Aus der Dichte der pulse kann man daher den 
Beschaeftigngsgrad ablesen.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Die Mainloop endet im Sleep und schaltet vor dem Sleep einen Portpin auf 
L. Jeder Interrupt schaltet diesen Portpin auf H.

Mittels Oszilloskop oder anderen geeigneten Messmitteln misst man den 
Tastgrad und damit die Prozessorauslastung. Das macht natürlich nur 
Sinn, wenn man nicht blockierend programmiert, also Warteschleifen aller 
Art (Zeitschleifen, Busywait) meidet.

von Anja (Gast)


Lesenswert?

Edgar Hermanns schrieb:
> Wie macht Ihr sowas?

Hey Noch was schrieb:
> Aus der Dichte der pulse kann man daher den
> Beschaeftigngsgrad ablesen.

So ähnlich habe ich das auch schon gemacht. ich habe zusätzlich noch an 
den Pin ein Drehspulinstrument angeschlossen. (über Kondensator und 
Spitzenwertgleichrichter sowie Poti zum Abgleich). Bei 100uA Endauschlag 
ergeben sich dann 100% Idle-Time.
Bei 0% (0uA) ist entweder der Prozessor abgestürzt oder voll 
ausgelastet.

Gruß Anja

von Thomas S. (klegom)


Lesenswert?

Es gibt noch eine andere Variante:

Einen Hardware Interrupt programmieren, der zyklisch aufgerufen wird 
(Timer oder externer Takt)

Der Interrupt sollte möglichst die höchste Priorität haben.

Innerhalb der Interrupt Routine die Rücksprungadresse auswerten und eine 
Statistik anfertigen.

Die Statistik gibt Auskunft darüber, an welcher Stelle des Programms der 
Prozessor wie oft ist (wenn der Interrupt nicht mit einem anderen Timer 
im System korreliert).

Die einzelnen Stellen (oder Bereiche) kannst Du dann zueinander ins 
Verhältnis setzen. Die Methode ist relativ aufwendig, gibt Dir aber auch 
sehr viel Information. Du erfährst nämlich nicht nur, ob der Prozessor 
noch "freie Zeit" hat (in der er sich in Deiner "idle loop" tummelt) 
sondern auch, in welchen Routinen er die andere Zeit "verbraucht".

Das ist dann nützlich, wenn man Du optimieren musst. Wenn man das 
tatsächlich tut, ist man immer wieder überrascht. Meist verbraucht der 
Prozessor nämlich an ganz anderen Stellen seine Zeit, als man das 
vermutet hätte.

Natürlich darf der Interrupt nicht zu häufig kommen, denn schließlich 
verfälscht er Dein Messergebnis.

Ein großer Vorteil dieser Methode ist, dass Sie (statistisch) 
insbesondere die Routinen erfasst, die Zeit verbrauchen (und die 
interessieren Dich) und auch alle Hardware Interrupt Routinen mit 
erfasst werden (solange deren Priorität kleiner ist, als die Priorität 
des Messinterrupts)

von E. H. (emax)


Lesenswert?

Der grosse Nachteil dieserRoutine ist, dass sie mit einiger 
Wahrscheinlichkeit falsche Ergebisse liefern kann: Wenn die statistische 
Erfassung -wie vorgeschlagen- zyklisch geschieht, ist die 
Wahrscheinlichkeit, eine oder mehrere ebenso zyklisch wiederkehrende 
Interruptroutinen auf Dauer genau zu verpassen gar nicht so niedrig.

Profiling ist ohnehin ein ganz anderes Thema.

Hier geht's "Freizeit", und die Voschläge bislang bieten schon 
interessante Denkansätze. Die Auslastung per Analoginstrument anzeigen 
ist dabei noch das Schärfste: ein Drehzahlmesser für den µP :-)

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.