Ich versuche derzeit, einen Algorithmus zur Auswahl eines eindeutigen (16-Bit) Bezeichners zu implementieren. Die Herausforderung besteht darin, dies so schnell zu tun, dass nicht zu viel Speicher verbraucht. Die Liste der aktuell verwendeten Kennungen wird ermittelt, indem ein externes Flash-Gerät über eine Sequenz von SPI-Transaktionen abgetastet wird und somit ein relativ langsamer Prozess ist. Auch der Algorithmus wird auf einem kleinen ish-Mikrocontroller laufen, so kann ich nicht wirklich nur alle Einträge in RAM lesen und sie dort verarbeiten.Auswählen eines eindeutigen Bezeichners in C für eine eingebettete Anwendung
Die Gedanken, die ich bisher gehabt haben, sind:
- eine Reihe Auswahl, dann die Liste scannen und sehen, wenn es verwendet wird. Spülen und wiederholen. Lässt davon ab, ziemlich langsam zu sein (besonders wenn dort viele Dateien sind).
- Wie oben, aber wählen Sie die Nummer mit einem Pseudozufallszahlengenerator mit einem geeigneten Saatgut. Dies hat den Vorteil, dass es weniger wahrscheinlich ist, dass es so viele Iterationen geben wird.
- Durchsuchen Sie die Liste und füllen Sie ein Array mit allen Einträgen gefunden. Sortieren Sie es und dann wird es trivial. Dies könnte eine enorme Menge an Speicher verwenden.
- Verwenden Sie eine enorme (okay, lächerlich enorme) Bitmaske. Nicht wirklich praktisch.
- Akzeptieren, dass die Lebensdauer des Tools ist so dass es weggeschleudert oder "formatiert" lange bevor es 65534 Dateien in den Flash geschrieben hat, so speichern Sie einfach den höchsten Wert bisher im Flash oder Backup-Speicher und halten inkrementieren. Um ehrlich zu sein, würde dies wahrscheinlich sehr gut für diese spezielle Anwendung funktionieren.
Im Moment bin ich grenzend auf entweder die zweite oder die fünfte, aber ich würde mich interessieren jemand zu wissen, ob irgendwelche anderen Gedanken hat. Ich würde gerne denken, dass es einen Algorithmus ähnlich in der Form zu einem CRC, der jede Reihe der Reihe nach verarbeitet werden könnte und geben Sie eine gute Idee von einer Nummer, die nicht verwendet wurde, aber ich habe keine Ahnung wie das funktionieren könnte.
Ist es eine Voraussetzung, dass die IDs nicht sequenziell sind? – Robert
Egal, sie müssen nur einmalig sein (gelöschte IDs können sofort wiederverwendet werden). – DrAl