Dateizugriff Fehlerhaft bei vollen SD-Karten - Korrupte Dateien

Sehr langsamer Dateizugriff bei machen Dateien / Fehlerhafter Inhalt beim Erstellen

  • 1
  • 2
  • 3
  • Page 2 of 3
NilsMeilwes
Benutzer
Avatar
Gender:
Age: 37
Posts: 14
Registered: 05 / 2016
Subject:

Re: Dateizugriff Fehlerhaft bei vollen SD-Karten - Korrupte Dateien

 · 
Posted: 06.04.2017 - 12:58  ·  #9
Hallo,

die Überlegung mit den Ordnern ist jetzt geplant und wird zeinah umgesetzt und getestet.

Dann werde ich an dem Frame noch ein wenig forschen. Taucht ja durchaus das ein oder andere interesannte Verhalten auf, wenn die Größe nicht passt.
Prozessor wechseln ist sehr schlecht, da einige Geräte im Feld sind, bei denen wir ungerne Hardwaremäßig eine Änderung vornehmen möchten.

Ich teste und melde mich.

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

Re: Dateizugriff Fehlerhaft bei vollen SD-Karten - Korrupte Dateien

 · 
Posted: 06.04.2017 - 19:35  ·  #10
Ich hab bei mir auch eine Framegröße von $400 (XMega) eingestellt ....dezimal 1024. Auch der Stack ist übertrieben groß: $400. Stört mich nicht, der uC hats ja :D

Hab grad geschaut, da ich diese Aufzeichnung auch auf einem Mega644 am Laufen hab: Stack&Frame auf $100 (dez.256).

Harry
NilsMeilwes
Benutzer
Avatar
Gender:
Age: 37
Posts: 14
Registered: 05 / 2016
Subject:

Re: Dateizugriff Fehlerhaft bei vollen SD-Karten - Korrupte Dateien

 · 
Posted: 10.04.2017 - 12:33  ·  #11
Hallo Zusammen,

den Frame habe ich jetzt auf $384 erhöht und einen Dauertest gestartet, mal sehn.

Bei der ganzen Untersuchung ist mir jetzt aufgefallen, dass meine Rountine zum schreiben eines Datensatzes extrem lange dauert. Bei näherer Betrachtung habe ich festgestellt, dass das DiskReset mit fast 600 ms ziemlich lange dauert. Mein Kollege hatte beim erstellen der Firmware am Anfang der Routine grundsätzlich ein DiskInit, DiskReset und ChkDisk gemacht.
Wenn ich das Diskinit und Reset jetzt aber rausnehme (es wird dann nur einmal zu Systemstart gemacht) dann funktioniert der Dateizugriff nicht wirklich, der Controller braucht ewig in meiner Schreibroutine. Mehrere Sekunden.

Frage: Muss ich vor jedem Dateizugriff ein Reset und Init durchführen? Das legt den Controller dann ja doch ganz schon lahm.

Ich möchte eigentlich vermeiden, dass ich die ganze zeit mit offenen Dateien arbeiten muss, da unser System oft im Akkubetrieb läuft, und die Gefahr da ist, dass von aussen ohne Vorwahnung die Spannung zusammenbricht.

Hier mal die Routine, vielleicht fällt euch ja etwas auf.
Code
procedure Save_Status(StatusNew: byte);
var dosTime, dosDate : word;
begin
  if (StatusNew <> Sys_State) or (EE_SD_Func>1) then         // neuer Status?
    dosTime := F16_StrToTime(bytetostr(hours:2:'0')+':'+bytetostr(minutes:2:'0'));
    dosDate := F16_StrToDate(bytetostr(day:2:'0')+'.'+bytetostr(month:2:'0')+'.'+bytetostr(year:2:'0'));
    calc_FileName;
    
    if F16_DiskInit and F16_DiskReset and F16_CheckDisk then
      File_Error := 100;
      F16_FileAssign(Datei, '', Datei_Name);// Handle mit FileNamen verknüpfen
      if F16_FileExist(Dir, Datei_Name,faAnyFile) then
        F16_FileAppend(Datei);               // vorhandene Datei öffnen
        File_Error := 101;
      else // File Exist
        Create_New_File(DosTime, DosDate);
        File_Error := 102;
      endif; // File Exist
      calc_timestamp;
      write(Datei, LongToStr(timestamp)+';');
      write(Datei, bytetostr(Day:2:'0')+'.'+bytetostr(month:2:'0')+'.'+bytetostr(year:2:'0')+';');
      write(Datei, bytetostr(hours:2:'0')+':'+bytetostr(minutes:2:'0')+':'+bytetostr(seconds:2:'0')+';');
      write(Datei, longtostr(BattRunTime)+';');
      write(Datei, longtostr(Data.Serialnumber)+';');
      write(Datei, Data.Firmware+';');
      write(Datei, bytetostr(StatusNew)+';');
      write(Datei, bytetostr(Sys_State)+';');
      write(Datei, longtostr(Data.Akkukap_Prozent)+';');
      write(Datei, longtostr(Data.RunTime_DC_on)+';');
      write(Datei, longtostr(Data.LastRunTime)+';');
      write(Datei, bytetostr(U6_on)+';');
      write(Datei, bytetostr(U7_on)+';');
      write(Datei, longtostr(U_Batt)+';');
      write(Datei, longtostr(U1)+';');
      write(Datei, longtostr(U2)+';');
      write(Datei, longtostr(U3)+';');
      write(Datei, longtostr(U4)+';');
      write(Datei, longtostr(U5)+';');
      write(Datei, longtostr(I_Load)+';');
      write(Datei, longtostr(I_charge)+';');
      write(Datei, longtostr(PCB_Temp)+';'+#CR+#LF);
      if not F16_FileClose(Datei) then                         // File schließen
        File_Error := 103;
      endif; // CloseFile
      if not F16_FileSetDate(Dir, Datei_Name, DosTime, DosDate) then // TimeStamp
        File_Error := 104;
      endif; // CloseFile
      if not F16_FileSetAttr(Dir, Datei_Name, [faArchive]) then // TimeStamp
        File_Error := 105;
      endif; // CloseFile
    else // Check Disk
      if F16_DiskInit then
        if F16_DiskReset then
          if F16_CheckDisk then
            File_Error := 0;
            SD_Size := F16_GetDiskSize;
            // SD_Free := F16_GetDiskFree;  // braucht recht lange
            Dir     := F16_GetCurDir;
          else // CheckDisk
            File_Error := 3;
          endif; // CheckDisk
        else // DiskReset
          File_Error := 2;
        endif; // DiskReset
      else // DiskInit
        File_Error := 1;
      endif; // DiskInit
      if File_Error > 0 then
        SD_Size := 0;
        SD_Free := 0;
        Dir     := '';
      endif; // Error > 0
    endif; // CheckDisk
  endif; // neuer Status?
end Save_Status;


Gruß Nils
mc-electronic
Benutzer
Avatar
Gender: n/a
Location: Sauerland NRW
Posts: 372
Registered: 03 / 2008
Subject:

Re: Dateizugriff Fehlerhaft bei vollen SD-Karten - Korrupte Dateien

 · 
Posted: 11.04.2017 - 10:29  ·  #12
Hallo Nils,

Init, Reset und CheckDisk sind am Anfang nötig, man kann sie zyklisch gelegentlich im Hauptprogramm überprüfen. Ich nehme an, daß "Datei" ein FileOfText ist. Die Zeitdauer von mehreren Sekunden ist m.E. nicht normal. Diese Zugriffe laufen im Millisekunden-Takt ab.
Ich würde in der Routine statt der vielen Write-Befehle einen längeren String zusammensetzen und diesen einen String dann in einem Write-Befehl wegschreiben.
Weiterhin würde ich mit einem Test-Port auf dem Oszi mir die Dauer der einzelnen Teile der Routine einmal ansehen, um den Zeitfresser zu finden.
Auf jeden Fall eine SD-Karte mit 32 kb Cluster-Size nutzen, sonst wird die FAT-Tabelle bei kleineren Clustern ewig lang und jeder Zugriff dauert umso länger. Gerade bei Deinen großen Dateien.
Die Dateien sollten nicht dauerhaft offen sein, das machst Du richtig. Du mußt auf jeden Fall verhindern, daß während eines Schreibzugriffes der Strom ausfällt. Dann ist die FAT der SD-Karte mit ziemlicher Sicherhiet korrupt. Zu diesem Thema gibt es im Forum einige Beiträge.

Könntest Du die Definitionen "IMPORT / FROM / DEFINE" aus dem Programm-Header einmal posten?

Michael

PS:
Und noch ein Hinweis aus dem Profi-Driver-Handbuch:

Das Schreiben von Strings wird enorm beschleunigt indem ein Zwischen Puffer (optional) importiert wird:
Define F16_StrLen = 20; // 4..254
Der Wert muss so gewählt sein, dass der längste zu schreibende String in diesen Buffer reinpasst.
Überlängen werden abgeschnitten!
Avra
Schreiberling
Avatar
Gender:
Location: Belgrade, Serbia
Age: 53
Homepage: rs.linkedin.com/in…
Posts: 653
Registered: 07 / 2002
Subject:

Re: Dateizugriff Fehlerhaft bei vollen SD-Karten - Korrupte Dateien

 · 
Posted: 11.04.2017 - 11:51  ·  #13
Did you try simple things like replacing SD card with different model, and putting smart UPS temporary on site (only if your project is fixed and not portable)?
NilsMeilwes
Benutzer
Avatar
Gender:
Age: 37
Posts: 14
Registered: 05 / 2016
Subject:

Re: Dateizugriff Fehlerhaft bei vollen SD-Karten - Korrupte Dateien

 · 
Posted: 12.04.2017 - 14:26  ·  #14
Hallo Michael

zum Systemstart und gelegentlich müsste also eigentlich reichen. Komisch, dass muss ich nochmal testen.
Richtig Zeit braucht nur die DiskReset Routine. Die anderen sind extrem flink und brauchen auch nur < 10 ms.
In meinen aktuellen Tests gab es auf jeden fall keinen Stromausfall. Das sollte grade kein Problem sein.

Die eine Karte läuft im Dauertest grade sehr gut, schon seid 2 Tagen fehlerlos, die andere hat sich zwar nicht aufgehängt, aber die Formatierung dermaßen zerstört, dass die Karte selbst nicht mehr erkannt wurde und unter Windows formatiert werden musste. Die Framesize scheint was gebracht zu haben, ist aber vieleicht nicht der einzige Fehler.

hier mal der Header:
Code
import SysTick, FAT16_32,FlashWrite, SerPort2, SPIdriver, WatchDog, TWImaster, CRCStream;

From System Import LongWord, LongInt, Random;
Define
         ProcClock     = 14745600;         // Hertz
         WatchDog      = msec2000;         // presc
         SysTick       = 10, timer0;       // msec
         StackSize     = $0256, iData;
         FrameSize     = $0384, iData;

         // Service
         SerPort2      = 230400, Stop2;    // Baud, StopBits|Parity SERVICE MENÜ
         RxBuffer2     = 20, iData;
         TxBuffer2     = 100, iData;

         // CRC Flash
         FlashChkSum   = $1FBF0;          // direkt vor dem Bootloader

         // SPI
         SPIorder    = msb;             // MSB first
         SPICPOL     = 1;               //
         SPICPHA     = 1;
         SPIpresc    = 1;               // 1=921 KHz, prescaler 0..3 4/16/64/128
         SPI_SS      = false;           // don’t use SS pin as chipselect

         //TWI Port
         TWIpresc    = TWI_BR100;       // Vorsicht, TWI=400kBit/s nicht machbar, vorher C's an den Leitungen entfernen!!

         // SD Karte
         FAT16          = MMC_SPI, iData;
         F16_MMCspeed   = superfast;
         F16_FileHandles= 1;
         F16_DirLevels  = 1;
         F16_StrLen     = 254 ;

uses uFAT16_32; // E-Lab Unit


die StrLen ist schon drin.
Werde jetzt mal eine Ordnerstrucktur implemtieren, mal sehn.
Im Handbuch steht noch drin, dass die SD-Karte eigentlich den gesamten SPI-Port belegt, wir haben aber noch eine RTC und einen AD-Wandler dran. Hätte vermutet dass es dann gar nicht geht. Ein Slave dürfte ja nur antworten, wenn die entsprechende CS-Leitung low ist.

@Avra: Yes. I've tried old 2GB cards with FAT16/32, newer SDHC Cards 8Gb and different Brands. No change. The System is battery buffered.

Gruß Nils
TheBeginner
Schreiberling
Avatar
Gender: n/a
Location: Wunsiedel Bayern
Age: 67
Posts: 766
Registered: 06 / 2013
Subject:

Re: Dateizugriff Fehlerhaft bei vollen SD-Karten - Korrupte Dateien

 · 
Posted: 12.04.2017 - 16:08  ·  #15
Quote by NilsMeilwes

...... die andere hat sich zwar nicht aufgehängt, aber die Formatierung dermaßen zerstört, dass die Karte selbst nicht mehr erkannt wurde und unter Windows formatiert werden musste. Die Framesize scheint was gebracht zu haben, ist aber vieleicht nicht der einzige Fehler.

Gruß Nils



Ich hatte damals auch so ein Problem mit der SD Card, einmal wurde sie erkannt einmal nicht.
Bis miparo hier im Forum geantwortet hat, ich solle mal einen schönen Kondensator zwischen
VCC und GND dicht an die Card einlöten, danach hatte ich nie wieder Probleme.
Was schieb miparo damals ? besonders beim Reset...brauchen die Dinger Strom.

Deine Card geht ja auch bis zu einem Punkt dann ist aus.


Gruß Frank
NilsMeilwes
Benutzer
Avatar
Gender:
Age: 37
Posts: 14
Registered: 05 / 2016
Subject:

Re: Dateizugriff Fehlerhaft bei vollen SD-Karten - Korrupte Dateien

 · 
Posted: 13.04.2017 - 12:01  ·  #16
Hallo Frank

guter Tipp, leider offensichtlich schon beim erstellen der Platine dran gedacht worden. Direkt an der Karte befindet sich ein 100 nF und ein 4,7uF. Hab mir die Spannung grade mal auf dem Oszi angesehen. Leider nichts von einem Einbruch zu erkennen...

Michael hatte ja geschrieben, dass ein gelegentliches Reset nicht schlecht ist. Bei mir funktioniert die Routine ohne init/reset/chkdsk nicht. Auch wenn ich direkt vor dem Aufrufen der Routine einen Reset mache, hängt er sich bei der ersten SD-Operation weg. Rufe ich statt dessen aus der Routine eine andere Routine auf, welche dann das init/reset/chkdsk ausführt, laufen auch alle anderen SD-Operationen. Kann ich nicht ganz nachvollziehen. Dies gilt für FAT16 und FAT32.

Ich habe nochmal die Zeiten gemessen. Bei einer FAT16 mit 32k Cluster dauert meine gesamte Routine inkl reset usw. 320 ms. Davon braucht das Reset 270 ms. Bei einer FAT32 mit 16k Cluster nur 50 ms. Die eigentlichen Schreibvorgänge sind also vergeichbar. Nur das Reset dauert deutlich unterschiedlich lange.

Gruß Nils

Nachtrag: Es scheint bei mir bei sogut wie allen SD-Funktionen nötig zu sein, ein Reset durchzuführen. Egal ob ChangeDir/Format/Pathexists usw...
  • 1
  • 2
  • 3
  • Page 2 of 3
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   135   149 · Page-Gen-Time: 0.035947s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI