PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Interrupt nach Aktivierung auslösen...



Flario
07.10.2009, 23:16
Hallo,

ich habe folgendes problem:

Ich möchte Impulse von einem Stromzähler mittels Interrupt zählen und die Daten über LAN verschicken.

Dazu speichere ich jede Minute die Summe der letzten Impulse in einen Array. Eine "Counter" Variable zeigt mir immer auf die letzte befüllt Adresse im Array. Immer wenn möglich werden die Daten des Arrays von unten weg versendet und der Counter um eins zurückgezählt.

Wenn nun während des Sendevorganges bzw. an einer anderen Stelle im Programm, wo der "Counter" gebraucht wird, der Interrupt diesen um 1 erhöht, würden unvorhersebare Probleme entstehen.

Als Lösung wäre mir eingefallen dass ich während des Sendens mir den "Counter" in eine andere Variable abspeichere und danach ihn mit dem "Counter" vergleiche um zu sehen ob der Interrupt in dieser Zeit aktiv war. Danach müsste ich lediglich die Lücke in dem Array beseitigen. Das einzige Problem nun währe dass der Interrupt beim aufräumen wieder Probleme verursachen könnte.

Eine andere denkbare Lösung währe, den Interrupt für die Sendezeit zu deaktivieren und danach wieder zu Aktivieren, dabei könnte ich jedoch einen "Tick" verpassen. Is es möglich den Interrupt beim Aktivieren auslösen zu lassen, wenn ein Tick in der zwischenzeit gekommen wär. Nur könnte ich dabei 2 Ticks verpassen und am Ende nur 1nen rausbekommen.

Fällt euch eine bessere Lösung zu dem Problem ein, oder wie würdet ihr das angehen?

Freundliche Grüße
Philipp Reitter

for_ro
08.10.2009, 00:14
Du könntest z.B. zwei Pointer verwenden.
Einer zeigt immer auf die letzte beschriebene Zelle (oder auf die nächste zu schreiben) und der zweite immer auf die zuletzt gelesene (oder auf die nächste zu lesen).
Wenn der Lese-Pointer gleich dem schreib-Pointer wird, heißt das, dass alle Werte übertragen wurden. Wird der Schreib-Pointer gleich dem Lese-Pointer, ist dein Array voll.
Kommen denn deine Impulse vom Zähler überhaupt so schnell, dass du nicht genügend Zeit zum Senden hast?


Hallo,
Is es möglich den Interrupt beim Aktivieren auslösen zu lassen, wenn ein Tick in der zwischenzeit gekommen wär.
Das geschieht automatisch. Während der Abarbeitung einer ISR sind weitere Interrupts gesperrt. Allerdings werden die entsprechenden Flags gesetzt, wenn eine Interrupt Bedingung zutrifft. Sobald dann die ISR verlassen wird, werden die interrupts wieder global zugelassen. Bereits gesetzte Flags führen dann zum Aufruf der zugehörigen ISR.
Allerdings nur jeder Typ einmal, wie du schon vermutet hast.

Flario
08.10.2009, 14:35
Kommen denn deine Impulse vom Zähler überhaupt so schnell, dass du nicht genügend Zeit zum Senden hast?

Die Imulse können je nach verwendeten Zähler und fließendem Strom in Zahntel bis Sekundenbereich Abständen kommen, meine Angst dass ich einen verpasse kommt mehr davon dass es sich im netzwerk Stauen könnte, und ich ja den "Ack" vom Server raussuchen will um sicher zu gehn dass meine Daten angekommen sind.

Aber das ist jetzt eh egal dank deiner Lösung.
Vielen Dank für deine Antwort!

Freuntliche Grüße
Philipp