F16_Blockwrite aus EEPROM

  • 1
  • 2
  • Page 1 of 2
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

F16_Blockwrite aus EEPROM

 · 
Posted: 21.06.2019 - 11:33  ·  #1
Hallo Leute,

ich bin gerade dabei die Daten aus dem EEPROM direkt auf die SDCard zu schreiben.
Nur aus irgendeinen Grund will das ganze nicht so wie ich will.
Er legt die Datei a,. schreibt aber keine Daten. Muss ich beim EEPROM irgendwas zusätzlich beachten?

Oder muss ich hier evtl. den Process sperren?

Code
//---------------------------------------------------------------
// Speichern Config
procedure Save_Cfg( inFileName : string[8]);
var
 wResBlockWrite : Word;
 dosTime, dosDate : word;
 CfgBytesWritten : longword;
 CfgPointer      : pointer;

begin

  sdAktive();   // Timer für SD Anzeige

    // erzeuge Datum und Zeit für Datei
    dosTime := F16_StrToTime( RTCZeitBlock.strzeit);
     dosDate := F16_StrToDate( RTCZeitBlock.strdatum );

    // Dateiname erzeugen
    //DateiNameCfg := inFileName+'.cfg';
    DateiNameCfg := 'boot.cfg';
    // Pfad setzen
     CfgDir := 'para';

      F16_FileAssign(Cfg_Datei, CfgDir, DateiNameCfg);// Handle mit FileNamen verknüpfen
      if F16_FileExist(CfgDir, DateiNameCfg,faAnyFile) then
        F16_FileAppend(Cfg_Datei);               // vorhandene Datei öffnen
        SD_Error := 201; DebugOut('201');
      else // File Exist
        //Create_New_File(DosTime, DosDate);
         if not F16_FileCreate(CfgDir, DateiNameCfg, [faArchive], DosTime, DosDate,0) then
          SD_Error := 207; DebugOut('207');
         endif;

        SD_Error := 202; DebugOut('202');
      endif; // File Exist
       // Schreibe CFG
       
         CfgPointer:= @Cfg1; // ziehe Pointer für Start vom EEPROM
          F16_BlockWrite (Cfg_Datei,  EEPromPtr(CfgPointer), 4032 ,wResBlockWrite );
     //    F16_BlockWrite (Cfg_Datei,  @WebBuf, 512 ,wResBlockWrite );

      CfgBytesWritten:= F16_FileSizeH(Cfg_Datei); //Anzahl der Datenrecords im File
          DebugOut('Bytes im .CFG: ' +LongToStr(CfgBytesWritten)+ ' Res:'+IntToStr(wResBlockWrite));


      if not F16_FileClose(Cfg_Datei) then                         // File schließen
        SD_Error := 204; DebugOut('204');
      endif; // CloseFile
      if not F16_FileSetDate(CfgDir, DateiNameCfg, DosTime, DosDate) then // TimeStamp
        SD_Error := 205; DebugOut('205');
      endif; // FileSetDate
      if not F16_FileSetAttr(CfgDir, DateiNameCfg, [faArchive]) then
        SD_Error := 206; DebugOut('206');
      endif; // FileSetAttr
end Save_Cfg;


Ich würde mir gerne das umkopieren der Daten ins RAM sparen.

Thorsten
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: F16_Blockwrite aus EEPROM

 · 
Posted: 21.06.2019 - 13:55  ·  #2
OK,

ich glaube ich habe da einen Denkfehler im Ablauf:

Wenn die Datei nicht vorhanden ist lege ich diese ja mit folgenden Code an:
Code
F16_FileCreate(CfgDir, DateiNameCfg, [faArchive], DosTime, DosDate,0)


Aber dann ist Datei ja noch nicht offen, also muss ich diese erst mit F16_FileRewrite oder F16_FileAppend öffnen, bevor ich diese speichere.

Das FileCreate bringt doch eigentlich nur ein Geschwindigkeitsvorteil bei großen Dateien oder?

Sprich bei den 4K vom EEProm kann man doch direkt mit F16_FileRewrite() rangehen.
Er soll eine vorhandene Datei sowieso einfach nur ersetzen und wenn nicht, diese neu anlegen.

Was jetzt bei mir nur noch eine Frage offen ist, sollte die diese Funktion mit "lock(self)" und "unlock(self)" sichern?

In einem anderen Process könnte ja ein Eintrag in die LOGs gemacht werden oder brauche ich mir hier keine Gedanken zu machen? Wird der laufende Process mit der Funktion
Code
F16_BlockWrite (Cfg_Datei,  EEPromPtr(CfgPointer), 4032 ,wResBlockWrite );

überhaupt unterbrochen oder ist diese Funktion bereits im Treiber geschützt?

Thorsten
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 59
Posts: 954
Registered: 09 / 2007
Subject:

Re: F16_Blockwrite aus EEPROM

 · 
Posted: 21.06.2019 - 14:49  ·  #3
Hi Thorsten,
ein EEPromPtr(CfgPointer) kann nicht funktionieren, da die Funktionen darunter nichts mehr von dem Cast weiß.
Das EEprom wird ja durch IN/OUT Opcodes angesprochen
Nur die neuen Tinys können direkt per LDS/STS das EEprom ansprechen.
Schau dir mein dein generiertes ASM an.
Entweder müsste der Compiler hier einen Fehler ausgeben oder Compiler Magic = selbst umkopieren.

Ohne umkopieren geht das nicht.

miparo
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: F16_Blockwrite aus EEPROM

 · 
Posted: 23.06.2019 - 21:55  ·  #4
Hallo miparo,

kann es sein, das es auch mit dem CopyBlock so Probleme gibt?

Code

         CfgPointer:= @Cfg1; // ziehe Pointer für Start vom EEPROM
          for wXCopy:= 0 to 63 do
            CfgPointerWork:= CfgPointer+(wXCopy * 64);

            CopyBlock( EEPromPtr(CfgPointerWork), @SDBuf64, 64 );
             BFileSaveOK:= F16_BlockWrite (Cfg_Datei,  @SDBuf64, 64 ,wResBlockWrite );
              if not BFileSaveOK then Break; endif;
          endfor;


Ich meine beim CopyBlock ist es doch eigentlich ebenso wie bei dem:
Code
         CfgPointer:= @Cfg1; // ziehe Pointer für Start vom EEPROM
          F16_BlockWrite (Cfg_Datei,  EEPromPtr(CfgPointer), 4032 ,wResBlockWrite );


Müsste das hier nicht identisch funktionieren?

Thorsten

Thorsten
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 59
Posts: 954
Registered: 09 / 2007
Subject:

Re: F16_Blockwrite aus EEPROM

 · 
Posted: 24.06.2019 - 12:31  ·  #5
Moin,
das sind zwei verschiedene Sachen:
Beim CopyBlock( EEPromPtr(CfgPointerWork), @SDBuf64, 64 ); sieht der Compiler, da System Funktion und ruft das richtige Copy auf = CALL SYSTEM.BlockCopyER

Das kann beim F16_BlockWrite nicht funktionieren.

miparo
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: F16_Blockwrite aus EEPROM

 · 
Posted: 24.06.2019 - 12:53  ·  #6
Quote by miparo

Moin,
das sind zwei verschiedene Sachen:
Beim CopyBlock( EEPromPtr(CfgPointerWork), @SDBuf64, 64 ); sieht der Compiler, da System Funktion und ruft das richtige Copy auf = CALL SYSTEM.BlockCopyER

Das kann beim F16_BlockWrite nicht funktionieren.

miparo


Hallo miprao,

danke für die Info. Ich hätte zu der Funktion "F16_FileRewrite()" noch eine Frage.
Ich speichere die aktuelle Config (EEPROM 0-4031) in einer Datei auf der SDCard. Dies ist die BOOT.cfg.
Ich übergebe bei der Funktion das aktuelle Datum und Uhrzeit dosTime und dosDate als WORD. Das speichere ich im unteren Bereich des EEPROMs. Beim booten prüfe ich ob diese Datei vorhanden ist, sollte diese vom Datum / Zeit abweichen wird der Benutzer gefragt ob die Boot.cfg von der SD-Card übernommen werden soll.

Grundsätzlich funktioniert das alles. ABER... wenn ich eine bereits vorhandene Datei mit "F16_FileRewrite()" überschreibe, wird das "TSearchRecord.Dir.WrAccTime" und "TSearchRecord.Dir.WrAccDate" nicht aktuallisiert. Ich dachte hier werden die Schreib Zugriffe (Datum Uhrzeit) gespeichert. Liege ich da falsch?

Thorsten
miparo
Administrator
Avatar
Gender:
Location: Germany
Age: 59
Posts: 954
Registered: 09 / 2007
Subject:

Re: F16_Blockwrite aus EEPROM

 · 
Posted: 24.06.2019 - 13:13  ·  #7
Ein F16_FileRewrite() schreibt aber nicht sofort auf die SD Karte, da evtl, mal ein F16_FlushBufSec gleich hinterher schieben ?
pvs-deck
PowerUser
Avatar
Gender:
Age: 53
Homepage: pvs-deck.de
Posts: 1340
Registered: 02 / 2009
Subject:

Re: F16_Blockwrite aus EEPROM

 · 
Posted: 24.06.2019 - 13:59  ·  #8
Quote by miparo

Ein F16_FileRewrite() schreibt aber nicht sofort auf die SD Karte, da evtl, mal ein F16_FlushBufSec gleich hinterher schieben ?


Hallo miparo,

OK, aber ein F16_FileClose() macht doch eigentlich das gleiche pder?

Thorsten
  • 1
  • 2
  • Page 1 of 2
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   138   152 · Page-Gen-Time: 0.030728s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI