closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

Eine neue SD-Karten-Frage



Harry offline
PowerUser
Avatar
Gender: male
Location: GERMANY  zwischen Augsburg und Ulm
Age: 53
Posts: 1456
Registered: 03 / 2003
Private message
Subject: Eine neue SD-Karten-Frage  -  Posted: 06.02.2019 - 14:31   -  
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
Elektronik arbeitet mit Rauch - wenn man den Rauch raus läßt, funktioniert es nicht mehr.
Electronics works with smoke - if you let the smoke out, it works no longer.
go down go up
pvs-deck offline
Schreiberling
Avatar
Gender: male
Location: GERMANY 
Age: 47
Posts: 965
Registered: 02 / 2009
Homepage Private message
Subject: Re: Eine neue SD-Karten-Frage  -  Posted: 06.02.2019 - 15:44   -  
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
---------------------------------------------------------
Nichts ist unmöglich in der Elektronik und der Software, die Grenzen
setzt nur das Budget, Zeit und der Entwickler! ( P V S - D E C K )
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 21.02.2019 - 03:03