Ich habe einen ISR, der eine Anzeige mit einer festen Frequenz aktualisiert. Ich möchte meine Routine optimieren, um den Overhead zu minimieren und so viel CPU-Zeit wie möglich für andere Verarbeitungen offen zu halten, aber ich habe keine gute Möglichkeit, Metriken zu sammeln, um meine CPU-Auslastung zu bestimmen.
Ich könnte mir die Baugruppe ansehen und die Routine analysieren, aber ich habe nicht die Geduld oder die Fähigkeit, dies genau zu tun. Ich habe auch nicht das Gefühl, dass ich schrecklich feinkörnige Ergebnisse brauche, nur einen einfachen Prozentsatz der CPU-Zeit, die von der isr belegt wird.
Ich könnte einen Pin nur dann hoch setzen, wenn der isr aktiv ist, und ihn extern messen. Das hat ein Minimum an Overhead im Code, aber ich weiß nicht, womit ich es messen soll. Ich habe kein Oszilloskop oder ähnliches. Gibt es eine einfache IC oder eine einfache Möglichkeit, ein anderes Mikro zur Messung des Arbeitszyklus zu verwenden? Ich habe von dedizierten Frequenzzählerchips gehört, aber gibt es etwas für den Arbeitszyklus?
quelle
Setzen Sie einen Ausgangspin, wenn Sie den ISR eingeben, und löschen Sie ihn, bevor Sie von ihm zurückkehren. Filtern Sie den Ausgang mit einem RC-Filter. Die Spannung am Kondensator sollte Ihnen das ISR-Tastverhältnis geben.
Wenn Ihre Stromversorgung beispielsweise 3,3 V beträgt und Sie 33 mV messen, verbringen Sie 1% der Zeit im ISR.
quelle
Der einfachste Weg, dies zu tun, besteht darin, den Code im Simulator auszuführen und die Zyklen zu messen, die von der Interruptroutine ausgeführt werden. Der Microchip MPLAB-Simulator verfügt beispielsweise über eine praktische Stoppuhrfunktion, die für diesen Zweck sehr nützlich ist.
Andernfalls kann es hilfreich sein, zu Beginn des Interrupts einen Stift anzuheben und am Ende abzusenken. Der einfachste Weg, dies zu betrachten, ist mit einem Oszilloskop. Wenn Sie Mikrocontroller- und Elektronikprojekte durchführen, sollten Sie sich trotzdem eines zulegen.
Ohne Zielfernrohr können Sie die Pin-Spannung einfach tieffiltern und dann mit einem Voltmeter messen. Diese Spannung geteilt durch die Prozessorleistungsspannung gibt Ihnen den Bruchteil der Zeit, in der der Pin hoch ist. Wenn der Prozessor beispielsweise mit 3,3 V betrieben wird und die tiefpassgefilterte Pin-Spannung 800 mV beträgt, ist der Pin in 24% der Fälle hoch 800 mV / 3,3 V =.
Da Sie anscheinend einen Compiler verwenden, müssen Sie diese Antwort etwas herabsetzen. Der Compiler fügt wahrscheinlich einen Interrupt-Eingabecode hinzu, bevor Ihr Code ausgeführt wird, und einen Interrupt-Exit-Code, nachdem Ihr Code ausgeführt wird. Die wahre Unterbrechungszeit verlängert einige Zyklen auf beiden Seiten des Impulses. Wenn Sie sich für das Interrupt-Timing interessieren, sollten Sie natürlich überhaupt keinen Compiler verwenden.
quelle