Hallo,
ich habe ein paar Zeilen Code, es spielt sich absolut alles in der ISR
ab, von daher ist die Frage, ob die ISR hier "naked" sein darf. Der
Pro-/Epilog einer normalen ISR macht schon ganz ordentlich Laufzeit bei
einem Systemtakt von 128kHz.
Rein theoretisch sollte die Endlosschleife im Hauptprogramm zu einem
einfachen jmp zusammenschrumpfen, dem es egal ist, ob die ISR
zwischenzeitlich Register oder Flags ändert.
Rein praktisch solltest du dir den generierten Assemblercode anschauen,
ob das auch so tatsächlich ist.
Oliver
Ich würde mir überlegen ob es in diesem konkreten Fall nicht sogar
sinnvoller wäre komplett auf den Interrupt zu verzichten und
stattdessen in der main-loop das entsprechende Timer-Bit zu pollen und
alles in der main zu machen.
Bernd K. schrieb:> Ich würde mir überlegen ob es in diesem konkreten Fall nicht sogar> sinnvoller wäre komplett auf den Interrupt zu verzichten und> stattdessen in der main-loop das entsprechende Timer-Bit zu pollen und> alles in der main zu machen.
Wo wäre da der Vorteil gegenüber der jetzigen Lösung? Ich würde sie in
diesem Fall sogar als absolut gleichwertig sehen
Ingo L. schrieb:> Wo wäre da der Vorteil gegenüber der jetzigen Lösung? Ich würde sie in> diesem Fall sogar als absolut gleichwertig sehen
Nö, die Loop hat mehrere Vorteile:
Bit testen, löschen und zurück springen geht schneller als
Interrupteinsprung und Return.
Der Compiler merkt, daß die Loop nie verlassen wird und
wird viele Variablen in Registern halten.
Ingo L. schrieb:> while ( "Cycling" );
Ist jetzt nicht so die feine Art, einen Stringpointer als Bool zu
vergewaltigen.
C erlaubt viele Schweinereien, man sollte sie aber nicht grundlos
verwenden.
Heutzutage ist es hip, der Lesbarkeit den Vorzug zu geben.
Peter D. schrieb:>> while ( "Cycling" );>> C erlaubt viele Schweinereien, man sollte sie aber nicht grundlos> verwenden.> Heutzutage ist es hip, der Lesbarkeit den Vorzug zu geben.
Also wenn lesbar dann so:
while ("my guitar gently weeps");
Peter D. schrieb:> Bit testen, löschen und zurück springen geht schneller als> Interrupteinsprung und Return.
Dafür kann man hier keinen Power Down Modus nutzen; wenn man Interrupts
nimmt, kann man in der while-Schleife einen solchen aktivieren um
Energie zu sparen. Beim AVR braucht das aber ggf. Register-Zugriffe...
Ingo L. schrieb:>> stattdessen in der main-loop das entsprechende Timer-Bit zu pollen und>> alles in der main zu machen.> Wo wäre da der Vorteil gegenüber der jetzigen Lösung? Ich würde sie in> diesem Fall sogar als absolut gleichwertig sehen
Konkretes Beispiel:
Ich hab hier einen aktuellen Fall wo ich eine 80kHz PLL auf einem Silabs
8051 (EFM8BB10) implementierte. Der erste Versuch verwendete den
ADC-Interrupt (der dann mit 320kHz kam) und fast die ganze CPU-Zeit ging
dafür drauf in den Interrupt hinein und wieder hinaus zu springen,
zusätzlich noch der Overhead bis 4 zu zählen und jedesmal zu schauen
welche der 4 Werte (I, Q, -I, -Q) jetzt gerade gesampelt wurde. Ich war
schon bei 80% CPU allein vom Grundgerüst ohne schon irgendwas anderes zu
machen als nur Samples einzulesen und zuzuordnen. Die Zeit hat nicht
mehr gereicht noch irgendwas sinnvolles damit zu machen, es ging so
nicht.
Im zweiten Anlauf machte ich eine main-loop die pro Durchlauf 4 mal auf
das conversion complete bit wartet, danach jeweils ein bisschen was tut
(erst dies, dann das, eben alles was einmal pro Periode zu tun ist schön
verteilt), die Zeit reicht jetzt gut aus für alles und könnte jetzt
sogar bis 100kHz gehen wenn ich wollte.
Niklas G. schrieb:> Dafür kann man hier keinen Power Down Modus nutzen; wenn man Interrupts> nimmt, kann man in der while-Schleife einen solchen aktivieren um> Energie zu sparen.
Guter Einwand. Dumm nur, daß der Timer dann nicht läuft.
Thomas E. schrieb:> Guter Einwand. Dumm nur, daß der Timer dann nicht läuft.
Kommt auf den konkreten Modus an... Im am wenigsten sparsamen Modus
("Idle"?) ist die Peripherie noch komplett an, nur der Prozessor ist
aus, der ja aber typischerweise der größte Verbraucher ist.
Thomas E. schrieb:> Vorhin wolltest du noch Power Down.
Ich meinte damit allgemein "einen der Sparmodi", nicht konkret den einen
"Power Down" Mode. Habe nicht genau im Kopf welcher beim AVR jetzt was
macht.
Thomas E. schrieb:> Dann schreib das auch. Das heißt Sleep Mode. Sind wir hier bei> gutefrage.net?
Verzeih dass ich nicht jeden Controller-spezifischen Begriff auswendig
weiß. Die Grundaussage ist das was zählt.
Niklas G. schrieb:> Verzeih dass ich nicht jeden Controller-spezifischen Begriff auswendig> weiß. Die Grundaussage ist das was zählt.
Nein, das heißt immer Sleep Mode.
Thomas E. schrieb:> Nein, das heißt immer Sleep Mode.
Bei den STM32F103 heißt das "Low-power modes". "Sleep mode" ist beim
STM32F103 das was beim AVR der "Idle" ist.
Peter D. schrieb:> Bernd K. schrieb:>> Also wenn lesbar dann so:>>>> while ("my guitar gently weeps");>> Nein.> Entweder 1 oder true.
Humordetektor kaputt?
Peter, du solltest doch nun wirklich alt genug sein, um den
entsprechenden Beatles-Titel noch zu kennen …
egberto schrieb:> Wenn das mal richtig läuft, kannst du den kompletten Code ja unter> "Fahrzeugelektronik" Thema E-Bike Tuning posten ;-)
Funktioniert doch, ich habe die CPU jetzt auf 300kHz laufen, damit
schaffe ich 2kHz Timerinterrupt.
Vielen Dank.
Nur für mein Verständnis...eine (leere) Interruproutine für den ext.
Interrupt braucht man nicht?
Debouncing (oder ist da ein Hallsensor dran)?
Grüße,
egberto
egberto schrieb:> Nur für mein Verständnis...eine (leere) Interruproutine für den ext.> Interrupt braucht man nicht?
Nicht, wenn man sich mit einem Fehler von maximal 1ms in der Umlaufzeit
zufrieden gibt.
egberto schrieb:> Debouncing (oder ist da ein Hallsensor dran)?
Gut das du es sagst, ein Reed-Kontakt prellt natürlich auch... Bau ich
gleich mal ein
Der Code in der ISR hat den Vorteil, dass er immer exakt x Mikrosekunden
nach dem Bit stattfindet. Bei einem Polling hast du einen Jitter von
mehreren Taktzyklen.
Dennis Restle schrieb:> Der Code in der ISR hat den Vorteil, dass er immer exakt x Mikrosekunden> nach dem Bit stattfindet. Bei einem Polling hast du einen Jitter von> mehreren Taktzyklen.
Der aber bei einer Zeitauflösung von 500µs und einer
Ausführungsgeschwindigkeit von 3 1/3µs pro Takt nicht auffällt...
Hier die Entprellte Version:
Nach meinem Verständnis versucht der Mikrocontroller bei Interrupt doch
über den entsprechenden Vector die zugehörige Routine anzuspringen -
oder ist das nicht immer so?
egberto schrieb:> Nach meinem Verständnis versucht der Mikrocontroller bei Interrupt doch> über den entsprechenden Vector die zugehörige Routine anzuspringen -> oder ist das nicht immer so?
Wenn man ihm das sagt ( hier wäre es: GIMSK |= (1<<INT0) ), dann schon.
Da ich das aber nicht mache, benötige ich auch die dazugehörige ISR
nicht...