Forum: Compiler & IDEs Position im Dataflash suchen


von Michael (Gast)


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.

1
#define FLASH_ENDE 60000
2
3
#define WRAP_AROUND(x)  x+FLASH_ENDE)%FLASH_ENDE
4
#define NO_DATA 0xFFFFFFFF
5
6
//Data ist 16Byte groß
7
//Data.utctime sind Sekunden U32
8
9
u32 FindLastEntry(void)
10
{
11
  u32 links,rechts,mitte,midtime;
12
  u32 date_links,date_rechts;
13
  u08 schritt;
14
15
  rechts=FLASH_ENDE-1;
16
  links=0;
17
  //Logg.date=NO_DATA;
18
  ReadDataMem((BYTE *)&Data,(LONG)(links*16),16);//Datensatz auslesen 16Bytes
19
  if(Data.utctime==NO_DATA)return(0);//Noch keine Daten im Flash
20
  
21
  date_links=Data.utctime;
22
  ReadDataMem((BYTE *)&Data,(LONG)(rechts*16),16);
23
  
24
  date_rechts=Data.utctime;
25
26
  if  ((date_links<date_rechts) && (date_rechts!=NO_DATA))
27
  {
28
    return(links);
29
  }
30
  else
31
  {
32
    do
33
    {
34
      mitte=(links+rechts)/2;
35
      ReadDataMem((BYTE *)&Data,(LONG)(mitte*16),16);
36
            
37
      //schritt = 1;
38
      midtime=Data.utctime;
39
      ReadDataMem((BYTE *)&Data,(LONG)(links*16),16);
40
      
41
      date_links=Data.utctime;
42
      
43
      if ((date_links <= midtime) && (midtime != NO_DATA))links = mitte;
44
      else rechts = mitte;
45
    }
46
    while (rechts != links+1);
47
  }
48
  ReadDataMem((BYTE *)&Data,(LONG)((rechts)*16),16);
49
  
50
  sentence = WRAP_AROUND(rechts);
51
  ReadDataMem((BYTE *)&Data,(LONG)((links)*16),16);
52
  lastUtc = Data.utctime;
53
  return(links);
54
}

von Rolf Magnus (Gast)


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.

von Stephan (Gast)


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!
1
if  ((date_links<date_rechts) && (date_rechts!=NO_DATA))
2
  {
3
    return(links);
4
  }
Preisfrage: Was wird hier zurück gegeben???
Richtig NICHT die letzte Pos!!!

Was du hier machst weiß ich leider nicht:
1
  ReadDataMem((BYTE *)&Data,(LONG)((rechts)*16),16);
2
  
3
  sentence = WRAP_AROUND(rechts);
4
  ReadDataMem((BYTE *)&Data,(LONG)((links)*16),16);
5
  lastUtc = Data.utctime;
6
  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

von Michael (Gast)


Lesenswert?

Hi,

sorry, ging beim Kopieren daneben, richtig muß es heisen:
1
#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.
1
return (links) //gibt auch ne 0 zurück.
1
ReadDataMem((BYTE *)&Data,(LONG)((links)*16),16);
2
lastUtc = Data.utctime;//Holt die letzte Uhrzeit
3
return(links);//Letzte Position

von Stephan (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.