
Zitat von
helipaddi
Meint ihr es ist sinnvoll, statt 9 mal die Funktion zum schreiben auf die SD aufzurufen erst alles zu einen String zusammen zu fassen und dann komplett auf die Karte zu schreiben? Komme leider aus der C# Welt und da macht man sich nicht so viele Gedanken über die Performance...
Das kann durchaus sinnvoll sein, viele Speichermedien sind beim Schreiben von großen Datenblöcken am Stück schneller. Wie das bei SD-Karten ist kann ich dir allerdings nicht sagen, da ich selbst bisher noch keine verwendet habe.
Der von mir angesprochene Ringpuffer kann dir bei sowas übrigens auch helfen:
Code:
void ISR()
{
// Daten abholen und in Ringpuffer speichern
}
void main()
{
while(1)
{
if (Ringpuffer Füllstand > 0)
{
if ((Ringpuffer Füllstand > x) || (mehr als y Sekunden seit letztem Speichern))
{
Gesamten Inhalt des Ringpuffers auf SD-Karte schreiben
}
}
}
}
Die ISR muss nur die Werte auslesen und im Puffer speichern, was natürlich möglichst schnell erfolgen sollte (wie werden die Werte eingelesen?). Und die Hauptschleife entleert den Puffer in regelmässigen Abständen, oder sobald er voll genug ist, auf die SD-Karte.
Alternativ zu dieser Implementierung kann man es auch wieder so machen wie in meinem ersten Beispiel, also in der ISR nur ein Flag setzen. In diesem Fall hätte man in der Hauptschleife einen Teil der mit der ISR synchronisiert ist und in dem die Daten abgeholt werden, und einen Teil der asynchron nebenher läuft und die Daten bei Gelegenheit auf die SD-Karte schreibt.
edit:
das schaut dann etwa so aus
Code:
void ISR()
{
if (!bNewData)
bNewData = true;
else
ErrCnt++;
}
void main()
{
while(1)
{
if (bNewData) // ISR synchron
{
// Daten abholen und in Ringpuffer speichern
bNewData = false;
}
if (Ringpuffer Füllstand > 0) // asynchron
{
if ((Ringpuffer Füllstand > x) || (mehr als y Sekunden seit letztem Speichern))
{
// Gesamten Inhalt des Ringpuffers auf SD-Karte schreiben
}
}
}
}
Lesezeichen