Wie man das Schreiben langer Seiten im EEPROM effektiv angeht

Ich verwende C18-Compiler und 24LC256 EEPROM. Ich würde gerne wissen, wie man Rollover- Fälle in Bezug auf große EEPROM-Schreibvorgänge handhabt. Ich schreibe eine Routine, die jede halbe Stunde 120 Bytes schreibt, und ich würde gerne wissen, wie ich meine Daten so einfach wie Page Write speichern kann Nehmen Sie nur 5 ms, was einem einzelnen Schreibvorgang entspricht. Die Seitengröße beträgt hier 64 Bytes. Und ich muss 10 Stunden lang schreiben, was 2,4 KB Speicherplatz pro Tag ergibt.

Nun, das Problem, das ich habe, ist:

1. Ich möchte Page Write effizient nutzen und Rollover-Bedingungen verhindern. Die Seitengröße beginnt bei 0-63, 64-127, 128-191, 192-255 ... bis zu 32 KB. Ich möchte vorhersagen, wann das Seitenlimit kommt, und möchte, dass sich der Seitenschreibvorgang entsprechend verschiebt.

zB: Wenn ich mit der 0. Adresse beginne: 0-63 belegen 64 Bytes und 64-117 belegen die nächsten 56 Bytes. Dann kann ich für das nächste Seitenschreiben nur 20 Stellen schreiben und muss 64 und 20 in zwei weiteren Seitenschreiboperationen schreiben.

Hinweis: Es ist nicht erforderlich, Startseitenpositionen für jeden Seitenschreibvorgang festzulegen.

Page write operations are limited to writing
bytes within a single physical page,
regardless of the number of bytes actually
being written. Physical page boundaries
start at addresses that are integer
multiples of the page buffer size (or ‘page
size’) and end at addresses that are
integer multiples of [page size - 1]. If a
Page Write command attempts to write
across a physical page boundary, the
result is that the data wraps around to the
beginning of the current page (overwriting
data previously stored there), instead of
being written to the next page, as might be
expected. It is, therefore, necessary for the
application software to prevent page write
operations that would attempt to cross a
page boundary

Ich habe versucht, einen Algorithmus dafür zu finden. Es wäre äußerst hilfreich, wenn Sie dieses Problem lösen oder Ihre Erkenntnisse vorschlagen würden.

Grüße

Arookie

Wäre es nicht viel einfacher, Ihre 120 Bytes immer auf zwei Seiten zu schreiben? Du scheinst keine Größenbeschränkung zu haben.
Nun, ich bin hier ziemlich größenbeschränkt. Ich habe nur versucht, eine Methode zu finden, um hier eine geeignete Methode zu finden, um das Problem zu beheben.
Ich sehe dein Problem nicht. Für jedes Byte, das Sie schreiben, erhöhen Sie einen Zähler, wenn es 64 erreicht, schreiben Sie eine Seite und setzen den Zähler auf 0.
Danke @Wouter van Ooijeb Was passiert, wenn es die Seitengrenze überschreitet. Es kann ein Problem verursachen, richtig.
Wenn Sie die Seitengrenze überschreiten, springt die Adresse an die erste Stelle der Seite und Sie überschreiben dort den Wert.
Ich werde auf dieselbe physische Seite geschrieben, richtig? Aber ich muss jede halbe Stunde 120 Bytes schreiben und mit dem Schreiben der physischen Seite beginnen, wo das vorherige Page Write-Ding beendet war.

Antworten (1)

Was Wouter van Ooijen vorgeschlagen hat, macht absolut Sinn.

Das sollte funktionieren

uint8_t page_counter=0;
uint8_t data_counter=0;
uint8_t last_used_address=0;


while(data_counter<120)  // we want to write 120 bytes
{
  send_eeprom_address(last_used_address);
  while((page_counter++)<64)  // while not end of page
  {
     write_eeprom_byte(y);         
     if (++data_counter==120) break; // exit the loop is 120 bytes have been written
  }
  last_used_address= last_used_address + page_counter;  // update last used location
  if(page_counter==64) page_counter=0;
}

Der Code ist ungetestet, und Sie müssen offensichtlich die richtigen Eeprom-Funktionen implementieren.

Danke @alexan_e. Ich bin sehr dankbar für deine wertvolle Zeit.