Quote by Harry
Hallo SD-Karten-Profis,
ist es sinnvoll/notwendig/unnötig vor einer Schreib-/Leseoperation auf einer SD-Karte die schreibende/lesende Procedure zu locken?
Code
Lock(self);
WriteLn(GPSLog,GPSLT);
UnLock(self);
Gleiche Frage für F16_GetDiskFree?
Gruss
Harry
Hallo Harry,
also ich mache das nicht. Ich achte nur darauf, das kein anderer Process oder Task auf die SD-Card zugreift oder irgendwas anderes auf den SPI-Port zugriff hat.
Ich meine auch das rolf, da irgendwas mal geschrieben hatte, das beim Zugriff der Treiber sowieso bis zum ende für andere Tätigkeiten geblockt ist. Aber ich würde die anderen Processe nicht in dieser Zeit blockieren. Zumal ich das mit den LOGs über eine entsprechend große Pipe handhabe. Der SD-Log wird bei mir in einem Process durchgeführt:
Code
...
type
// Logbuch Record
TLogBuch = record
strlogDate : string[6]; // strlog 01042018
strlogTime : string[6]; // strlog 235920
strLog : string[41]; // Logbuch
end;
var
// Meldungssystem
LogPipe : Pipe[5] of TLogBuch; // PIPE of byte für LOGBUCH
Code
...
//--------------------------------------------------------------
// Display Process oberer Menü und Statusbereich;
//--------------------------------------------------------------
process LCD_Displ(256, 512 : iData; 5); {Stacksize = 256 bytes, Framesize = 512 bytes, 5 Systicks}
begin
WDTrig; // WD TRriggern wenn eingeschaltet
DispMenu2; // Menü im LCD-Unit aufrufen
end LCD_Displ;
//--------------------------------------------------------------
// Display Process Fuss und LOGs speichern;
//--------------------------------------------------------------
process LCD_DisplBott(256, 512 : iData; 5); {Stacksize = 256 bytes, Framesize = 512 bytes, 5 Systicks}
begin
WDTrig; // WD TRriggern wenn eingeschaltet
DispBottom; // Statuszeile mit Uhr, Zustand usw.
Save_LogPipe; // Prüfen ob Meldungen vorhanden sind, dann auf SD ablegen
Schedule; // Rechenzeit freigeben
end LCD_DisplBott;
...
Code
...
//---------------------------------------------------------------
// Log speichern Pipe
procedure Save_LogPipe;
var
wResBlockWrite : Word;
dosTime, dosDate : word;
xFor, xstrNo, strNo : byte;
bufferLog : TLogBuch;
begin
// überprüfe Pipe
xstrNo:= PipeStat( LogPipe );
if xstrNo > 0 then
sdAktive(); // Timer für SD Anzeige
// DebugOut('xstrNo: '+ByteToStr(xstrNo));
// erzeuge Datum und Zeit für Datei
dosTime := F16_StrToTime( RTCZeitBlock.strzeit);
dosDate := F16_StrToDate( RTCZeitBlock.strdatum );
// Dateiname erzeugen
Datei_Name := '20'+ByteToHex(RTCZeitBlock.jahr)+ByteToHex(RTCZeitBlock.monat)+'.log';
// Pfad setzen
//LogDir := 'log';
LogDir := '';
F16_FileAssign(Log_Datei, LogDir, Datei_Name);// Handle mit FileNamen verknüpfen
if F16_FileExist(LogDir, Datei_Name,faAnyFile) then
F16_FileAppend(Log_Datei); // vorhandene Datei öffnen
// SD_Error := 101; DebugOut('101');
else // File Exist
//Create_New_File(DosTime, DosDate);
F16_FileCreate(LogDir, Datei_Name, [faArchive], DosTime, DosDate,0);
SD_Error := 102; DebugOut('102');
endif; // File Exist
// Schreibe Log-Zeile
for xFor := 1 to xstrNo do
PipeRecv( LogPipe, bufferLog ); // ziehe ersten Record aus Pipe
F16_BlockWrite (Log_Datei, @bufferLog, 1 ,wResBlockWrite );
endfor;
LogRecords:= F16_FileSizeH(Log_Datei); //Anzahl der Datenrecords im File
//DebugOut('Records im Log: ' +LongToStr(LogRecords));
//SD_Error := 103; DebugOut('103');
if not F16_FileClose(Log_Datei) then // File schließen
SD_Error := 104; DebugOut('104');
endif; // CloseFile
if not F16_FileSetDate(LogDir, Datei_Name, DosTime, DosDate) then // TimeStamp
SD_Error := 105; DebugOut('105');
endif; // CloseFile
if not F16_FileSetAttr(LogDir, Datei_Name, [faArchive]) then // TimeStamp
SD_Error := 106; DebugOut('106');
endif; // CloseFile
endif; // xstrNo
end Save_LogPipe;
Gruß
Thorsten