Algorithmus zum Finden der nächsten Daten im Eeprom [geschlossen]

Ich habe ein EEPROM und speichere Daten darin, von der Adresse 0x00bis 0xff. Ich muss das EEPROM regelmäßig auf Werte ungleich Null scannen.

z.B:

address  0x00 0x01 0x02 0x03 0x04......0x0A 0x0B 0x0C.........0xFF
values    0    0    1    1    0          0    1   0             0 

Wenn ich eine Scanfunktion ausführe, um die erste Wertadresse zu finden, kann ich dies tun. Aber wie umgehe ich die erste erkannte Adresse ( 0x02) und finde die nächste Adresse im zweiten Funktionsaufruf?

Hinweis : Wenn wir auf mehr als eine aufeinanderfolgende 1 gestoßen sind, wird die erste Adresse genommen ( 0x02).

Ich würde mich sehr freuen, wenn Sie eine Technik zur Verfügung stellen, um dies anzugehen.

int scaneeprom(void)
{ static unsigned int x,
  static unsigned int counter;

for(i=0+counter; i<255;i++)
 {
     while((eepromread(i++)!)==0)
 {
      x=i;
      counter++;
}     

 return(i);

}

Dies soll beim zweiten Aufruf von 0x04-0xff scannen.

Ich würde mich über Ihren Beitrag freuen, der meinen Fehler korrigiert.

Ich verstehe nicht ... Was ist, wenn 0x02to 0x05'1' und 0x06 '0' hat ... Möchten Sie in diesem Fall das Scannen stoppen und zurückkehren 0x02oder das Scannen fortsetzen, bis 0xFFdas letzte Auftreten einer solchen Bedingung auftritt, und zurückkehren?
.@Swanand Vielen Dank. In diesem Fall möchte ich 0x02 zurückgeben und das nächste Mal sollte es von 0x06-0xff scannen.
Diese Frage scheint nicht zum Thema zu gehören, da es um Programmierung geht
@m.Alin Elektronisch löschbare ROM-Programmierung hat nichts mit Elektronik zu tun? Oookay... wo soll er denn fragen? Wie viele der PC-Programmierer auf SO wissen Ihrer Meinung nach überhaupt, was ein EEPROM ist? Ich denke, diese Frage passt perfekt zum Thema.
@Lundin Die Tatsache, dass das OP EEPROM erwähnt, ist irrelevant. Die Frage bezieht sich eigentlich auf einen Programmieralgorithmus. Diese Frage ist aus gutem Grund geschlossen.
@m.Alin Zunächst einmal sollte die Programmierung von Mikrocontrollern für eingebettete Systeme auf dieser Site immer ein Thema sein. Es gibt keinen Standort im SE-Netzwerk, der dafür besser geeignet wäre. Wenn Sie also solche Fragen schließen, sagen Sie den Leuten im Grunde "Verlieren Sie sich, wir wollen keine Firmware-Programmierer in unserer Community".
@m.Alin Außerdem glaube ich nicht, dass es in Bezug auf den speziellen Fall von EEPROMs so etwas wie einen reinen High-Level-Algorithmus gibt, der vollständig von der Hardware getrennt ist. Sie müssen immer Zugriffsmethode/Timing, Sicherheit, Datenaufbewahrung, Prüfsummen usw. usw. berücksichtigen. Außerdem müssen alle Variablen, die sich mit dem Lesen aus dem EEPROM befassen, flüchtig sein, etwas, das ein PC-Programmierer wahrscheinlich vermissen wird.
Die eingebettete Programmierung von @Lundin ist hier zwar ein Thema, aber neben dem Lesen aus einem EEPROM (das nicht Gegenstand der Frage ist) handelt es sich um ein reines Codierungsproblem. Daher passt es besser zu Stack Overflow.
@clabacchio Diese Seite muss also aktualisiert werden? Es heißt ausdrücklich, dass „das Schreiben von Firmware für Bare-Metal- oder RTOS-Anwendungen“ ein Thema ist. Es heißt ausdrücklich, dass "Programmieren von Software für einen PC" kein Thema ist.
@Lundin Beide Aussagen sind richtig, aber dies fällt in eine Grauzone, da es sich um eine Anwendung handelt, die auf einem eingebetteten System ausgeführt wird. Es braucht einfach keine speziellen EE-Fähigkeiten, um diese Frage zu beantworten, und indem wir sie schließen, versuchen wir, ein Beispiel dafür zu geben, was zum Thema gehört und was nicht.
@Lundin Ersetzen Sie einfach das Wort "EEPROM" in dieser Frage durch ... "Vektor", zum Beispiel. Jetzt hat es nichts mit Elektronik und Firmware zu tun, aber es ändert nicht wirklich, was gefragt wird.

Antworten (2)

Sie müssen aufeinanderfolgende Einsen finden und aufhören, sobald Sie sie gefunden haben. In Ihrem aktuellen Code lesen Sie das gesamte EEPROM, auch wenn Sie die erforderliche Bedingung finden.

Basisalgorithmus wäre:

1. Beginnen Sie mit der letzten Adresse.

2. EEPROM lesen. Erhöhen Sie einen Zähler, wenn Sie 1 finden, und setzen Sie ihn zurück, wenn Sie 0 finden.

3. Wenn Ihr Zähler während dieses Lesevorgangs jemals über 2 geht, speichern Sie diesen Ort als "letzte Adresse" und beenden Sie die Suche.

Nicht optimierter Code wäre:

unsigned char Eepromscan(void)
{
    unsigned char loopcnt = 0;
    unsigned char onecount = 0;
    unsigned char addr = 0; //We will store start address of 1's here
    static unsigned char lastAddr = 0;

    //If lastAddr is already overflowing, reset it
    if(lastAddr >= 0xFF)
      {
         lastAddr = 0;
      }
    for(loopcnt = lastAddr; loopcnt < 0xFF; loopcnt++)
      {
           addr = loopcnt; //This is start location of our scanning
          while(eepromread(loopcnt++) != 0)
            {
                onecount++;  //Count the 1's we got!
            }

            if(onecount > 1)
             {
                 //There are multiple 1s... WooHoo!
                 // And These 1s start at "addr" and end at current location "loopcnt"

                 lastAddr = loopcnt; //Next time,We will start scanning from here.
                 break;
             }
      }

     return addr;
}

Das ist grober Code. Es gibt viele Stellen, an denen Verbesserungen möglich sind, und Sie sollten mit Bedingungen umgehen, z. B. wenn im gesamten EEPROM keine aufeinanderfolgenden Einsen vorhanden wären. oder Was ist, wenn Sie mit dem Scannen von Anfang an beginnen möchten, wenn Sie 0xFF erreichen, ohne aufeinanderfolgende 1s zu finden?

PS: Dieser Code enthält Fehler und wir erwarten, dass Sie diese Bedingungen finden und behandeln.

In C könnten Sie eine als " static " deklarierte Variable verwenden , die vom Startcode auf '0' initialisiert wird. Die folgenden Zitate stammen aus der Norm ISO/IEC 9899:1999 (E).

Alle Objekte mit statischer Speicherdauer müssen vor dem Programmstart initialisiert (auf ihre Anfangswerte gesetzt) ​​werden.

Auch der Werterhalt zwischen den Gesprächen ist garantiert.

3 Ein Objekt, dessen Bezeichner mit externer oder interner Verknüpfung oder mit dem Speicherklassenbezeichner static deklariert ist, hat eine statische Speicherdauer. Seine Lebensdauer ist die gesamte Ausführung des Programms und sein gespeicherter Wert wird nur einmal vor dem Programmstart initialisiert.

Stellen Sie sicher, dass Sie diese Variable als "Unsigned Char" deklarieren, damit sie nicht um mehr als 0xFF erhöht und überrollt wird.
@Swanand Das wird normalerweise funktionieren, aber es ist nicht garantiert - die einzige Garantie ist, dass es mindestens 8 Bit sind. Manchmal ist unsigned char > 8 Bit (z. B. SHARC von AD). analog.com/static/imported-files/software_manuals/…