Question

I besoin de stocker les éléments de longueur variable dans une file d'attente circulaire dans une puce de mémoire flash. Chaque élément aura son encapsulation pour que je puisse comprendre comment elle est grande et où l'élément suivant commence. Quand il y a suffisamment d'éléments dans le tampon, il se terminera au début.

Qu'est-ce qu'un bon moyen de stocker une file d'attente circulaire dans une puce flash?

Il y a une possibilité de dizaines de milliers d'articles que je voudrais stocker. Donc, à partir du début et de la lecture à la fin du tampon n'est pas idéal, car il faudra du temps pour chercher à la fin.

En outre, parce qu'il est circulaire, je dois être en mesure de distinguer le premier élément de la dernière.

Le dernier problème est que c'est stockée en mémoire flash, afin d'effacer chaque bloc est à la fois du temps et ne peut se faire un certain nombre de fois pour chaque bloc.

Était-ce utile?

La solution

Tout d'abord, la gestion des blocs:

Mettre un en-tête plus petit au début de chaque bloc. La principale chose que vous devez garder une trace de la « plus ancienne » et « nouvelle » est un numéro de bloc, qui incrémente simplement modulo k . k doit être plus grand que votre nombre total de blocs. Idéalement, faire k moins que votre valeur MAX (par exemple 0xFFFF) de sorte que vous pouvez facilement dire ce qui est un bloc effacé.

Au démarrage, le code lit les en-têtes de chaque bloc à son tour, et localise les premiers et derniers blocs dans la séquence qui est n i + 1 = (n i + 1) MODULO k. Prenez soin de ne pas se confondre par blocs effacés (numéro de bloc est par exemple 0xFFFF) ou des données qui est corrompu en quelque sorte (effacement par exemple incomplète).

Dans chaque bloc

Chaque bloc commence initialement vide (chaque octet est 0xFF). Chaque enregistrement est simplement écrit un après l'autre. Si vous avez des enregistrements de taille fixe, vous pouvez y accéder avec un index simple. Si vous avez des enregistrements de taille variable, puis de le lire vous devez numériser à partir du début du bloc, style liste chaînée.

Si vous voulez avoir des enregistrements de taille variable, mais il faut éviter de balayage linéaire, alors vous pourriez avoir une tête bien défini sur chaque enregistrement. Par exemple. 0 utiliser comme un délimiteur d'enregistrement, et COBS -encode (ou COBS / R -encode ) chaque enregistrement. Ou utiliser un octet de votre choix comme séparateur et « échapper » cet octet si elle se produit dans chaque enregistrement (similaire à la protocole PPP ).

Au démarrage, une fois que vous savez que votre dernier bloc, vous pouvez faire une analyse linéaire pour le dernier enregistrement. Ou si vous avez des enregistrements de taille fixe ou délimiteurs d'enregistrement, vous pouvez faire une recherche binaire.

Effacer la programmation

Pour certaines puces de mémoire flash, l'effacement d'un bloc peut prendre beaucoup de temps - par exemple. 5 secondes. Pensez à la planification d'un effacement comme une tâche d'arrière-plan un peu « à l'avance ». Par exemple. lorsque le bloc actuel est x% de sa capacité, puis commencer à effacer le bloc suivant.

numérotation d'enregistrement

Vous pouvez les enregistrements numériques. La façon dont je l'ai fait dans le passé est de mettre, dans l'en-tête de chaque bloc, le numéro d'enregistrement du premier enregistrement. Ensuite, le logiciel doit tenir le compte des numéros de chaque enregistrement dans le bloc.

Checksum ou CRC

Si vous voulez détecter des données corrompues (par exemple écrit incomplète ou efface en raison d'une panne de courant inattendue), vous pouvez ajouter une somme de contrôle CRC ou à chaque enregistrement, et peut-être à l'en-tête de bloc. Notez que le CRC d'en-tête de bloc ne couvre que l'en-tête lui-même, et non les dossiers, car il ne pouvait pas être réécrite lorsque chaque nouvel enregistrement est écrit.

Autres conseils

Gardez un bloc séparé qui contient un pointeur vers le début du premier enregistrement et la fin du dernier enregistrement. Vous pouvez également conserver plus d'informations comme le nombre total d'enregistrements, etc.

Jusqu'à ce que vous avez d'abord hors de l'espace, l'ajout d'enregistrements est aussi simple que de les écrire à la fin de la mémoire tampon et mise à jour du pointeur de la queue.

Comme vous devez récupérer de l'espace, supprimer suffisamment les dossiers afin que vous puissiez adapter votre enregistrement en cours. Mettre à jour le pointeur de tête vous supprimez des enregistrements.

Vous aurez besoin de garder une trace de combien d'espace a été libéré. Si vous gardez un pointeur à la fin du dernier enregistrement, la prochaine fois que vous avez besoin d'ajouter un enregistrement, vous pouvez comparer avec le pointeur sur le premier enregistrement pour déterminer si vous devez supprimer des enregistrements plus.

En outre, si cela est NON, vous ou le contrôleur flash aurez besoin de faire l'usure et débloquant le nivellement, mais cela devrait tous être à une couche inférieure à l'allocation d'espace pour le tampon circulaire.

Je pense que je reçois maintenant. Il semble que votre plus grand problème sera, après avoir rempli l'espace disponible pour l'enregistrement, ce qui se passe ensuite? Les nouvelles données doivent remplacer les anciennes données, ce qui est je crois ce que vous entendez par un tampon circulaire. Mais puisque les données ne sont pas une longueur fixe, vous pouvez remplacer plus d'un enregistrement.

Je suppose que la quantité de variabilité de la longueur est suffisamment élevée pour que tout rembourrage sur une longueur fixe est pas une option.

Votre secteur d'écriture a besoin de garder une trace de l'adresse qui représente le début de l'enregistrement suivant à écrire. Si vous connaissez la taille d'un bloc à écrire à l'avance, vous pouvez dire si vous allez finir à la fin du tampon logique et recommencer à « 0 ». Je ne diviser un disque avec une à la fin et certains au début.

Un registre séparé peut suivre le début; ce sont les données plus anciennes qui n'a pas encore été remplacé. Si vous êtes allé lire les données de c'est là que vous commencez.

L'auteur de données alors vérifier, étant donné l'adresse de début d'écriture et la longueur des données de son sur le point de commettre, si elle doit percuter le registre de lecture, qui examinerait le premier bloc et voir la longueur et l'avance à l'autre enregistrement, jusqu'à ce qu'il y ait assez d'écrire ce que les données sont. Il y aura un écart de données indésirable qui vit entre la fin des données écrites et le début des données les plus anciennes, probablement. Mais cette façon, vous pouvez simplement être en train d'écrire une adresse ou deux comme des frais généraux, et non réarranger des blocs.

Au moins, c'est probablement ce que je ferais. HTH

Je vois trois options:

option1: est de pad tout sur la même taille, est simple, stocker un pointeur sur la tête et la queue du tampon de sorte que vous savez où écrire et où commencer la lecture à partir, utilisez la taille de chaque objet obtenir un décalage à l'autre, cela signifie que vous avez besoin pour traverser le tampon comme vous une liste chaînée, alias son lent si vous avez besoin élément 5000.

option2: est de stocker uniquement des pointeurs vers les données réelles dans la mémoire tampon circulaire, de cette façon lorsque vous boucle autour de vous ne devez pas traiter avec la taille de faux-matchs. si vous stockez les données réelles dans une mémoire tampon circulaire et ne pas compléter dehors, vous pouvez courir dans une situation où votre plus witting plusieurs articles avec 1 nouvel objet de données, je suppose que ce n'est pas correct.

stocker les données réelles ailleurs en flash, la plupart flash aura une sorte de nivellement d'usure intégré, si oui vous n'avez pas besoin de vous soucier d'écraser le même emplacement plusieurs fois, l'IC savoir où stocker réellement sur la puce, il suffit d'écrire à l'espace libre disponible suivant.

cela signifie que vous devez choisir une taille maximale de la mémoire tampon circulaire comment vous faites cela dépend de la variabilité des données. Si la taille des données changent juste beaucoup, dire par seulement quelques octets, alors vous devriez juste pad dehors et l'option utilisation 1. Si les changements de taille sauvagement et de façon imprévisible, choisir la plus grande taille, il pourrait être et comprendre combien d'objets de cette taille serait adaptée à votre flash, utiliser comme le nombre maximum d'entrées dans la mémoire tampon. Cela signifie que vous perdez un tas d'espace.

option 3: si l'objet peut vraiment être de toute taille, votre au point où vous devez simplement utiliser un système de fichiers, nommez les fichiers dans l'ordre et la boucle arrière lorsque votre tenue complète à l'esprit si votre nouvelle entrée est grande vous pouvez doivent supprimer plusieurs anciennes entrées pour l'adapter. Ce qui est vraiment juste une extension de l'option 2 comme option2 est à bien des égards un système de fichiers simple.

La « circulaire » en un éclair peut se faire sur la base de la taille des blocs, ce qui signifie que vous devez déclarer combien blocs de flash que vous allouez pour ce tampon.

La taille de la mémoire tampon sera à chaque fois entre particulier n-1 (n est le nombre de blocs) et n.

Chaque bloc doit commencer par un en-tête qui contient le numéro séquentiel ou horodatage qui pourrait être utilisé pour déterminer quel bloc est plus ancienne que l'autre.

Chaque article encapsulé avec un en-tête et un pied de page. l'en-tête par défaut contient tout ce que vous voulez, mais en fonction de cet en-tête, vous devez connaître la taille de l'élément. Le pied de page par défaut est 0xFFFFFFFF. Cette valeur indique une terminaison nulle.

Dans votre RAM, vous devez enregistrer un pointeur vers le plus ancien bloc et le dernier bloc et pointeur vers l'élément le plus ancien et le dernier élément. Sur la mise sous tension, vous allez sur tous les blocs trouver les blocs concernés et charger ces membres.

Lorsque vous souhaitez enregistrer un nouvel élément, vous vérifiez si le dernier bloc contient assez d'espace pour cet article. Si elle ne vous enregistrez l'élément à la fin de l'élément précédent et le changement du point précédent au point bas de page à cet item. Si elle ne contient pas assez d'espace dont vous avez besoin pour effacer le plus ancien bloc. Avant d'effacer ce bloc changer les éléments de bloc les plus anciens (RAM) au point sur le bloc suivant et élément le plus ancien au point sur le premier élément de ce bloc. Ensuite, vous pouvez enregistrer le nouvel élément dans ce bloc et changer le pied de page du dernier élément au point cet objet.

Je sais que l'explication peut sembler compliqué, mais le processus est très simple et si vous écrivez correct, vous pouvez le faire même panne de courant en toute sécurité (garde toujours à l'esprit que vous l'ordre des écritures).

Faites attention que la circularité de la mémoire tampon ne soit pas enregistré dans le flash, mais le flash ne contient que des blocs avec des éléments que vous pouvez décider en fonction des blocs-têtes et des éléments d'en-têtes ce qui est de l'ordre de ces éléments

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top