Siro
07.06.2011, 16:08
Ich habe eine Abragefunktion um Festzustellen, ob mein EEPROM alle Daten fertig geschrieben hat oder nicht. Diese heisst ee_busy. Ist das EEPROM noch nicht fertig, liefert sie FALSE zurück, sonst TRUE.
Der "SystemTickCount" zählt bei mir automatisch jede milli Sekunde eins hoch. Also ein Millisekundenzähler seit dem Einschalten des Gerätes. Um erneut in das EEPROM zu schreiben, muss ich warten bis der letzte Schreibzyklus fertig ist.
Da ich aber nicht unendlich warten möchte und zudem weis, daß ein Schreibzyklus xx milliSekunden benötigt habe ich folgendes geschrieben.
BOOL ee_busy(void)
{
blablabla
return TRUE wenn fertig
}
time = SystemTickCount + 100;
while (ee_busy())
{
if ((SystemTickCount > time) return FALSE; /* FEHLER, EEPROM wird nicht fertig */
}
sieht eigentlich ganz okay aus, funktioniert auch. Aber......
wenn innerhalb der Schleife ein zusätzlicher Interrupt auftaucht, kann es passieren, daß SystemTickCount schon größer geworden ist als time.
Dies wird dann als Fehler interpretiert, obwohl jetzt ee_busy TRUE liefern würde. Aber zu dieser erneuten Abfrage kommt die Sofware unter Umständen garnicht.
Also habe ich die Funktion so abgeändert:
time = SystemTickCount + 100;
do
{
if ((SystemTickCount > time) return FALSE; /* FEHLER, EEPROM wird nicht fertig */
} while (ee_busy());
Hier habe ich das Problem aber nur verschoben, es kann wieder vorkommen (bei zusätzlichem Interrupts), daß SystemTickCount > time wird bevor die ee_busy
ein TRUE zurückliefert.
Also habe ich es jetzt so gemacht:
time = SystemTickCount + 100;
while (ee_busy())
{
if ((SystemTickCount > time) && (ee_busy()) return FALSE;
}
Das sieht irgendwie "doppeltgemoppelt" aus, aber nur so kann ich sicher sein, daß es wirklich klappt.
Vielleicht bin ich "Betriebsblind" geworden, geht das nicht anders ????
Ich danke Euch für evtl. Info
Siro
Der "SystemTickCount" zählt bei mir automatisch jede milli Sekunde eins hoch. Also ein Millisekundenzähler seit dem Einschalten des Gerätes. Um erneut in das EEPROM zu schreiben, muss ich warten bis der letzte Schreibzyklus fertig ist.
Da ich aber nicht unendlich warten möchte und zudem weis, daß ein Schreibzyklus xx milliSekunden benötigt habe ich folgendes geschrieben.
BOOL ee_busy(void)
{
blablabla
return TRUE wenn fertig
}
time = SystemTickCount + 100;
while (ee_busy())
{
if ((SystemTickCount > time) return FALSE; /* FEHLER, EEPROM wird nicht fertig */
}
sieht eigentlich ganz okay aus, funktioniert auch. Aber......
wenn innerhalb der Schleife ein zusätzlicher Interrupt auftaucht, kann es passieren, daß SystemTickCount schon größer geworden ist als time.
Dies wird dann als Fehler interpretiert, obwohl jetzt ee_busy TRUE liefern würde. Aber zu dieser erneuten Abfrage kommt die Sofware unter Umständen garnicht.
Also habe ich die Funktion so abgeändert:
time = SystemTickCount + 100;
do
{
if ((SystemTickCount > time) return FALSE; /* FEHLER, EEPROM wird nicht fertig */
} while (ee_busy());
Hier habe ich das Problem aber nur verschoben, es kann wieder vorkommen (bei zusätzlichem Interrupts), daß SystemTickCount > time wird bevor die ee_busy
ein TRUE zurückliefert.
Also habe ich es jetzt so gemacht:
time = SystemTickCount + 100;
while (ee_busy())
{
if ((SystemTickCount > time) && (ee_busy()) return FALSE;
}
Das sieht irgendwie "doppeltgemoppelt" aus, aber nur so kann ich sicher sein, daß es wirklich klappt.
Vielleicht bin ich "Betriebsblind" geworden, geht das nicht anders ????
Ich danke Euch für evtl. Info
Siro