mikrocontroller.net

Forum: Compiler & IDEs Position im Dataflash suchen


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich benutze ein serielles Dataflash und möchte beim Einschalten die 
letzte Position im Speicher suchen. Das funktioniert zu 99%.
Sieht jemand einen Fehler oder habt Ihr Ideen für einen anderen 
Lösungsweg?
Es werden in Data.utctime aufsteigend Sekunden geloggt.
Am Anfang steht im Flash überall 0xFFFFFFFF.
Es soll möglichst schnell der letzte also die größte Zahl außer 
0xFFFFFFFF gefunden werden und die Position zurückgegeben werden.
Der Speicher wird als Ringspeicher benutzt.

#define FLASH_ENDE 60000

#define WRAP_AROUND(x)  x+FLASH_ENDE)%FLASH_ENDE
#define NO_DATA 0xFFFFFFFF

//Data ist 16Byte groß
//Data.utctime sind Sekunden U32

u32 FindLastEntry(void)
{
  u32 links,rechts,mitte,midtime;
  u32 date_links,date_rechts;
  u08 schritt;

  rechts=FLASH_ENDE-1;
  links=0;
  //Logg.date=NO_DATA;
  ReadDataMem((BYTE *)&Data,(LONG)(links*16),16);//Datensatz auslesen 16Bytes
  if(Data.utctime==NO_DATA)return(0);//Noch keine Daten im Flash
  
  date_links=Data.utctime;
  ReadDataMem((BYTE *)&Data,(LONG)(rechts*16),16);
  
  date_rechts=Data.utctime;

  if  ((date_links<date_rechts) && (date_rechts!=NO_DATA))
  {
    return(links);
  }
  else
  {
    do
    {
      mitte=(links+rechts)/2;
      ReadDataMem((BYTE *)&Data,(LONG)(mitte*16),16);
            
      //schritt = 1;
      midtime=Data.utctime;
      ReadDataMem((BYTE *)&Data,(LONG)(links*16),16);
      
      date_links=Data.utctime;
      
      if ((date_links <= midtime) && (midtime != NO_DATA))links = mitte;
      else rechts = mitte;
    }
    while (rechts != links+1);
  }
  ReadDataMem((BYTE *)&Data,(LONG)((rechts)*16),16);
  
  sentence = WRAP_AROUND(rechts);
  ReadDataMem((BYTE *)&Data,(LONG)((links)*16),16);
  lastUtc = Data.utctime;
  return(links);
}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Irgendwie kann ich mir nicht so recht vorstellen, daß das dein Code ist. 
Denn das:

> #define WRAP_AROUND(x)  x+FLASH_ENDE)%FLASH_ENDE

dürfte schon gar nicht gehen, weil die Klammern nicht passen.

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

so....wo fange ich an???
Abgesehen davon das bei dem Def ein Fehler vorliegt sind da noch andere 
unschöne Sachen drin!

1. Wenn man Daten irgendwo her bekommt, immer erst auf Gültigkeit 
prüfen!!!! und danach mit Ihnen arbeiten!!!
2. Du hast einen spezial Fall in deiner Funktion: "Flash ist noch neu", 
was soll jetzt gemacht werden??? Entweder du gibst wirklich die letzte 
Pos an oder einen Fehler, aber bitte nicht einen gültigen Wert!!! (Pos 0 
ist einer!)
3. Damit du es schneller hin bekommst, nur dann die neue Uhrzeit holen 
wenn sie auch gebracht wird!!!! Siehe deine "Do While" Schleife!!!

und als letztes:
Wir nehmen an dein Flash wäre das erste mal voll beschrieben, es hat 
noch kein Überlauf statt gefunden!
if  ((date_links<date_rechts) && (date_rechts!=NO_DATA))
  {
    return(links);
  }
Preisfrage: Was wird hier zurück gegeben???
Richtig NICHT die letzte Pos!!!

Was du hier machst weiß ich leider nicht:
  ReadDataMem((BYTE *)&Data,(LONG)((rechts)*16),16);
  
  sentence = WRAP_AROUND(rechts);
  ReadDataMem((BYTE *)&Data,(LONG)((links)*16),16);
  lastUtc = Data.utctime;
  return(links);
Wozu holst du für rechts die Uhrzeit???
was macht sentence???
und die Uhrzeit von links haste eigentlich schon vorher geholt?

mfg
Stephan

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

sorry, ging beim Kopieren daneben, richtig muß es heisen:
#define WRAP_AROUND(x)  (x+FLASH_ENDE)%FLASH_ENDE
ich suche ja immer die Position wo nach dem Einschalten als nächstes 
weitergeschrieben werden soll.

Wenn das Flash noch neu ist wird eine 0 zurückgegeben. Also an Position 
0 geht es weiter.
return (links) //gibt auch ne 0 zurück. 
ReadDataMem((BYTE *)&Data,(LONG)((links)*16),16);
lastUtc = Data.utctime;//Holt die letzte Uhrzeit
return(links);//Letzte Position

Autor: Stephan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> Es soll möglichst schnell der letzte also die größte Zahl außer
> 0xFFFFFFFF gefunden werden und die Position zurückgegeben werden.

> ich suche ja immer die Position wo nach dem Einschalten als nächstes
> weiter geschrieben werden soll.

Da stimmt was nicht!!!
Entweder der Letzte Eintrag oder die nächste freie Stelle beides geht 
nicht!
Deshalb ja der Hinweis das bei einem neuen Flash ein Fehler zurück 
gegeben wird.
Oder du musst den letzten Rückgabewert verändern, da dieser ja die 
letzte Pos angibt.

mfg
Stephan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.