Guten Morgen, ich habe folgendes Problem: Ich habe eine fertige Anwendung, an die eine Schnittstelle angebunden werden soll. Die fertige Anwendung (grauer Kasten) ist fix und kann in keinster Weise verändert werden. Das Problem entsteht dadurch, dass die API-Funktionen aus Interrupt Routinen aufgerufen werden. Bevor meine Funktionen aufgerufen werden, werden alle anderen Interrupts deaktiviert und nach meiner Funktion wieder aktiviert. Teilweise ist die Laufzeit meiner Funktionen nicht unerheblich. Dadurch blockieren sich die API-Funktionen gleichzeitig. Es gibt bereits eine solche API (d.h. es ist möglich), allerdings liegt diese nicht im Quellcode vor. Ich hoffe, ihr habt einen Vorschlag, wie man das Problem lösen kann.. Grüße Eike
Du musst die Laufzeit deiner Callback Funktionen in den Griff kriegen und aufwändige Teile asxmchron laufen lassen. Im Callback also nur Daten wegspeichern und ein Flag setzen, dadas du im Hauptprogramm sporadisch prüfst.
So allgemein läßt sich die Frage nicht beantworten. Du mußt mindestens sagen, auf welchem Target, welchem OS, welchem Compiler das läuft. Mehr Informationen wären noch besser. Peter
@Tom: Das Problem ist ja, dass ich an das Hauptprogramm (main()) nicht heran komme. Sonst würde ich natürlich nur ein Flag setzen. @Peter: Das ganze läuft auf einem TI TMS320F28335 DSP. Ich weiß, dass das ganze etwas unlogisch klingt, aber was mich daran stört ist, dass ich eine API (wie gesagt nicht quelloffen) habe, mit der das ganze einwandfrei funktioniert.
Hallo, mein Vorschlag: Generiere dir einen Timer-Interrupt, der deine eigene 'main'-Funktion periodisch auf ruft. (Du kannst beim Eintritt in diese Funktion die anderen Interrupts wieder aktivieren, dadurch sollte die black-Box wie gewohnt arbeiten.) In den Callback-Funktionen setzt du einfach nur Flags, die dann in deiner main-Funktion ausgewertet werden. Um das ganze zu beschleunigen könntest du noch zusätzlich in der Callback-Funktion den Timerwert kurz vor den Überlauf stellen, so dass der Timerinterrupt sofort ausgeführt wird, sobald die Callbackfunktion abgearbeitet ist. Oder, falls von dem Controller unterstützt, Software-Interrupts verwenden. Das ganze ist zwar alles andere als schön, könnte aber funktionieren... Grüße, Florian
@Florian: Genau die Idee hatte ich auch schon, allerdings hat der Controller nur 3 Timer. Einer wird standardmäßig schon für die Schnittstelle benötigt. Wenn ich jetzt noch einen nehme, hab ich schon 2/3 nur für die Schnittstellen verbraucht. Als Notlösung geht das natürlich. Dazu kommt aber noch, dass das fertige API ja auch ohne den zweiten Timer auskommt. Ich würde es ja gerne genauso elegant lösen. Habt ihr noch andere Ideen? Grüße Eike
Erwartet denn der API-Aufruf einen Rückgabewert? Könnte es sein, dass der API-Call so oft wiederholt wird, bis "fertig" zurückgemeldet wird?
Also der API-Call gibt teilweise einen Rückgabewert zurück. Aber alle Calls werden pro ISR nur einmal aufgerufen. Als Beispiel: ISR_xy{ //alle anderen Interrupts disablen res = fkt(); //alle anderen Interrupts enablen } int fkt(){ //do action return res; } Und ich habe wie gesagt nur die Möglichkeit fkt() zu gestalten. Auf alles andere habe ich keinen Zugriff, kann es aber lesen. Und die Laufzeit von fkt() ist bei deaktivierten Interrupts definitiv zu lang.
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.