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?
> ob die vorhandenen AUsgaben
Ich meine natürlich "die vorhandenen Au_f_gaben"
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
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.
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.
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
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)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.