Hallo, ich benutze den ADuC7021 und habe dort 2 Interruptroutinen (eine für die schnellen Interrupts FIQ und eine für die langsamen Interrupts IRQ) in c implementiert (mit KEIL Vision 3.x). Im Datenblatt ist als maximale Interruptlatenzzeit 1,4 µsec angegeben. Gemessen habe ich aber 2,4 bis 2,8 µsec. Woran kann diese längere Interruptlatenzzeit liegen? Am KEIL Compiler, der vielleicht viele Register beim Einsprung sichert? Oder weil ich dide Interruptroutine in c Implementiert habe? Würde eine Assemblerimplementation der Interruptroutine helfen? Kann man im KEIL µVision 3 irgendwo einstellen, dass er beim Interrupteinsprung nur die aller nötigsten Register sichert? Oder habt ihr andere Tips und Tricks? Danke Gruß Samuel
Das Datenblatt gibt die Latenz bis zum ersten Assembler-Befehl des Handlers an. Du misst hingegen die Latenz bis zur ersten Zeile in C. Dazwischen liegt der Wasserkopf einer C-Funktion als Handler. Speziell beim FIQ ist Assembler ziemlich hilfreich, weil man dort anders als in C vorrangig die automatisch umgeschalteten Register verwenden kann, ggf. vorinitialisiert mit irgendwelchen benötigten Basisadressen. Apropos 1,4µs: Woraus ergibt sich das? Ein Datasheet dürfte das nicht in absoluter Zeit sondern in Takten angeben. Zudem scheint mir das ausserordentlich viel zu sein. Wenn ein IRQ/FIQ-Handler auf ADuC schnell sein soll, dann sollte er als nativer ARM Code im RAM laufen.
Die Interruptzeit ist ausserdem beim aduc wegen der Pipeline nie Konstant. Im Handbuch steht deshalb "bis zu 84 Taktzyklen".
Konstante Latenzen sind eher selten. Egal bei welchen Controller.
Beim Cortex-M3, dem Nachfolger vom ARM7, sind die Latenzen konstant. 12 Zyklen für einen IRQ, dazu 6, falls ein höherpriorer dazwischenhaut.
Mag sein, aber ich möchte mal das Controller-Programm sehen, das nicht irgendwo mal für ein paar Befehle die Interrupts ausschaltet.
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.