Eine neue SD-Karten-Frage

Harry
Moderator
Avatar
Gender:
Location: zwischen Augsburg und Ulm
Age: 59
Posts: 2134
Registered: 03 / 2003
Subject:

Eine neue SD-Karten-Frage

 · 
Posted: 06.02.2019 - 14:31  ·  #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
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1341
Registered: 02 / 2009
Subject:

Re: Eine neue SD-Karten-Frage

 · 
Posted: 06.02.2019 - 15:44  ·  #2
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
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 15 · Cache Hits: 14   50   64 · Page-Gen-Time: 0.026583s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI