Forum: Mikrocontroller und Digitale Elektronik Konzept: Schnittstellen API an Interrupt Routine


von Eike J. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Tom M. (Gast)


Lesenswert?

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.

von Peter D. (peda)


Lesenswert?

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

von Eike J. (Gast)


Lesenswert?

@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.

von Florian P. (db1pf)


Lesenswert?

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

von Eike J. (Gast)


Lesenswert?

@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

von StinkyWinky (Gast)


Lesenswert?

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?

von Eike J. (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.