Eine neue SD-Karten-Frage

Harry
Moderator
Avatar
Geschlecht:
Herkunft: zwischen Augsburg und Ulm
Alter: 60
Beiträge: 2155
Dabei seit: 03 / 2003
Betreff:

Eine neue SD-Karten-Frage

 · 
Gepostet: 06.02.2019 - 14:31 Uhr  ·  #1
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
pvs-deck
PowerUser
Avatar
Geschlecht:
Alter: 54
Beiträge: 1344
Dabei seit: 02 / 2009
Betreff:

Re: Eine neue SD-Karten-Frage

 · 
Gepostet: 06.02.2019 - 15:44 Uhr  ·  #2
Zitat geschrieben von 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
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 15 · Cache Hits: 14   50   64 · Page-Gen-Time: 0.037583s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI