Hallo allerseits,
ich habe ein Problem mit dem Zugriff auf eine SD-Card in einer INterruptroutine.
Ich setze einen Mega1284p ein, 16 Mhz, 5V, Timer 3 wird dabei so eingestellt, dass alle 1 ms der
Interrupt TIMER3COMPA; aufgerufen wird.
Klappt auch alles gut.
In der Routine wird ein A/D-Wert abgerufen, die Daten sollen dann auf die SD-Card geschrieben werden. Das geht auch, nur scheint sich der Controller zu "verhaspeln". Ich konnt noch keinen Grund dafür finden, daher versuche ich es mal hier.
Ich öffne die Datei auf der SDcard und schreibe dann im Interrupt Daten hinein.
Wenn RECTIME beio 10.000 angekommen ist schließe ich die Datei wieder.
Die Routine ist:
Interrupt TIMER3COMPA;
begin
if REC then
excl(LED1);
ADC_AVERAGE; // Speichert die Daten in "Dataset", 16 Bytes
RECTIME:= RECTIME + 1;
f16_blockwrite(fd, @Dataset, sizeof(Dataset), res);
incl(LED1);
endif;
end;
Außerhalb der Routine ist dann noch:
loop
....
if (RECTIME >= 10000) then
RECSTOP:= true;
closesdcard;
endif;
endloop;
Das schließt die Datei.
Ohne das f16_blockwrite habe ich sauber alle 1 ms einen Interrupt.
Mit der Routine auch, nur alle paar tausend Zugriffe ist auf dem Oszi auf einmel eine Reihe von Verzögerungen zu sehen, dann läuft es weiter, wenn auch nicht mehr so gleichmäßig wie ohne f16_blockwrite..
Was könnte diese Verzögerungen bzw. Ungleichmäßigkeiten auslösen? Sperrt der Treiber den Interrupt?
Ich teste das immer mit einem Port (hier LED1) den ich toggle. Da kann man per Oszi schön sehen was sich zeitmäßig tut.
Wenn ich ohne den Interrupt in die Datei schreibe läuft es ohne Verzögerungen, 27 µs pro Datentransfer, also normal viel Zeit in der 1ms die ich im Interrupt habe, also zu langsam scheint sie nicht zu sein.
Bin wirklich ratlos...
Louis
ich habe ein Problem mit dem Zugriff auf eine SD-Card in einer INterruptroutine.
Ich setze einen Mega1284p ein, 16 Mhz, 5V, Timer 3 wird dabei so eingestellt, dass alle 1 ms der
Interrupt TIMER3COMPA; aufgerufen wird.
Klappt auch alles gut.
In der Routine wird ein A/D-Wert abgerufen, die Daten sollen dann auf die SD-Card geschrieben werden. Das geht auch, nur scheint sich der Controller zu "verhaspeln". Ich konnt noch keinen Grund dafür finden, daher versuche ich es mal hier.
Ich öffne die Datei auf der SDcard und schreibe dann im Interrupt Daten hinein.
Wenn RECTIME beio 10.000 angekommen ist schließe ich die Datei wieder.
Die Routine ist:
Interrupt TIMER3COMPA;
begin
if REC then
excl(LED1);
ADC_AVERAGE; // Speichert die Daten in "Dataset", 16 Bytes
RECTIME:= RECTIME + 1;
f16_blockwrite(fd, @Dataset, sizeof(Dataset), res);
incl(LED1);
endif;
end;
Außerhalb der Routine ist dann noch:
loop
....
if (RECTIME >= 10000) then
RECSTOP:= true;
closesdcard;
endif;
endloop;
Das schließt die Datei.
Ohne das f16_blockwrite habe ich sauber alle 1 ms einen Interrupt.
Mit der Routine auch, nur alle paar tausend Zugriffe ist auf dem Oszi auf einmel eine Reihe von Verzögerungen zu sehen, dann läuft es weiter, wenn auch nicht mehr so gleichmäßig wie ohne f16_blockwrite..
Was könnte diese Verzögerungen bzw. Ungleichmäßigkeiten auslösen? Sperrt der Treiber den Interrupt?
Ich teste das immer mit einem Port (hier LED1) den ich toggle. Da kann man per Oszi schön sehen was sich zeitmäßig tut.
Wenn ich ohne den Interrupt in die Datei schreibe läuft es ohne Verzögerungen, 27 µs pro Datentransfer, also normal viel Zeit in der 1ms die ich im Interrupt habe, also zu langsam scheint sie nicht zu sein.
Bin wirklich ratlos...
Louis