Comment le mécanisme de “wear-leveling” sur une mémoire Eeprom s’appuie sur un indicateur d’état de correction d’erreur[APPLICATION MICROCHIP] Sur le marché des appareils électroniques avec leurs applications, les utilisateurs cherchent de plus en plus à obtenir une durée de vie plus longue et une fiabilité accrue. Pour ces applications, l’électronique embarquée intègre une mémoire - Flash ou Eeprom. Or celles-ci ne disposent pas d’une endurance d’effacement/écriture illimitée. Il est donc devenu courant d’utiliser des techniques de réduction de l’usure permettant d’augmenter la longévité des mémoires embarquées. L’une de ces méthodes s’appelle le “wear-leveling”, ou répartition de l’usure. Explications de Microchip.
Responsable marketing produit Microchip Technology
Lorsqu’on utilise une mémoire Eeprom dans un système, il est essentiel de tenir compte de son endurance, généralement évaluée à 100 000 cycles pour les Eeprom intégrées à des microcontrôleurs et à 1 million de cycles pour les Eeprom externes à température ambiante. Les concepteurs doivent en tenir compte en estimant le nombre de cycles d'effacement/d'écriture sur la durée de vie typique de l’application (parfois appelée "profil de mission") afin de déterminer la taille d’Eeprom dont ils ont besoin et la manière d’allouer les données au sein de la mémoire. Par exemple, dans un système de mesure de la consommation d’eau comportant quatre capteurs desservant différentes zones d’un bâtiment, chaque capteur génère un paquet de données à chaque période de consommation, contenant le volume d’eau consommé, la durée de consommation et les horodatages correspondants. Les paquets de données stockés dans l’Eeprom sont complétés par des données mises à jour à chaque nouvelle période, jusqu’à ce que le paquet soit plein. Les données sont conservées dans l’Eeprom jusqu’à ce qu’un serveur central demande leur extraction. Le système est conçu pour extraire les données suffisamment fréquemment afin d’éviter d’écraser les données existantes au sein de chaque paquet. En supposant une durée de vie de l’application de 10 ans et une moyenne de 400 paquets quotidiens par capteur, le nombre total de cycles par capteur atteindra 1,46 million, dépassant ainsi l’endurance nominale typique d’une Eeprom. Pour remédier à cela, il est possible de créer une routine logicielle permettant de répartir l’usure sur les blocs supplémentaires (à condition de disposer d’espace excédentaire). C’est ce qu’on appelle la répartition de l’usure, communément appelée "wear-leveling". Comment le mécanisme de “wear-leveling” s’implante-t-il ? Pour mettre en œuvre le “wear-leveling” dans une application, il est possible d’acheter une mémoire Eeprom deux fois plus grande, ce qui permettra d’allouer 2 blocs à chaque capteur, pour un total de 2 millions de cycles disponibles par capteur. Cela fournit une marge de cycles supplémentaires en cas de besoin - 540 000 cycles supplémentaires pour chaque capteur dans cet exemple. Il faudra ensuite trouver un moyen de savoir où écrire les nouvelles données afin de répartir l’usure. Bien qu’il soit possible d’écrire dans chaque bloc jusqu’à sa limite d’un million de cycles avant de passer au suivant, cette approche peut entraîner une usure prématurée si certains capteurs génèrent plus de données que d’autres. En répartissant l’usure de manière uniforme sur l’Eerpom, l’application dans son ensemble durera plus longtemps. La figure 1 ci-dessous illustre l’exemple expliqué ci-dessus, avec quatre compteurs d’eau renvoyant des paquets de données (en violet) vers le microcontrôleur via le bus de communication. Les données sont stockées dans des blocs au sein de l’Eeprom. Chaque bloc comporte, en haut à gauche, un compteur indiquant le nombre de cycles d’effacement-écriture qu’il a subis.
Système de mesure de la consommation d’eau dans lequel les paquets de données sont stockés sur l’Eeprom qui dispose d’un espace deux fois supérieur à celui requis
Deux grands types de mécanismes de "wear-leveling", statique et dynamique Le wear-leveling dynamique est plus simple et convient mieux pour répartir l’usure sur un petit espace de l’Eeprom. Ce mécanisme permet de répartir l’usure sur les blocs de mémoire dont les données changent le plus souvent. Il est plus facile à mettre en œuvre et nécessite moins de ressources, mais peut entraîner une usure inégale, ce qui peut poser problème, tel que l’illustre la figure ci-dessous.
Échec de la répartition uniforme de l’usure
Le "wear-leveling" statique, quant à lui, répartit l’usure sur l’ensemble de l’Eeprom, prolongeant ainsi la durée de vie de l’ensemble du dispositif. Ce type d’approche est recommandé si l’application peut utiliser toute la mémoire comme espace de stockage (par exemple, si elle n’a pas besoin de réserver une partie de la mémoire pour conserver des données importantes et immuables). Cela permettra d’obtenir la meilleure endurance possible pendant toute la durée de vie de l’application. Cependant, il est plus complexe à mettre en œuvre et nécessite davantage de ressources du processeur. Gérer l'usure de l'Eeprom Le "wear-leveling" nécessite de surveiller les cycles d’effacement/d’écriture de chaque bloc de mémoire ainsi que son état d’allocation, ce qui peut en soi entraîner une usure de la mémoire non volatile (NVM). Il existe néanmmoins de nombreuses façons ingénieuses de gérer ce problème. A des fins de simplification, supposons que vous stockiez ces informations dans la Ram d'un microcontrôleur qui, lui, ne s’use pas. La mémoire Ram perdant ses données en cas de coupure de courant, il faudra donc concevoir un circuit autour du microcontrôleur visant à détecter les premiers signes d’une coupure de courant, afin d’avoir le temps de transférer l’état actuel des registres vers la mémoire non volatile. Dans une approche logicielle du "wear-leveling", l’idée générale consiste à créer un algorithme qui dirige la prochaine écriture vers le bloc ayant subi le moins d’écritures, afin de répartir l’usure. Dans le cas du "wear-leveling" statique, chaque écriture stocke les données à l’emplacement le moins utilisé qui n’est pas actuellement alloué à autre chose. Le système échange également les données vers un nouvel emplacement inutilisé si le nombre de cycles entre le bloc le plus utilisé et le bloc le moins utilisé est trop important. Le nombre de cycles effectués par chaque bloc est suivi à l’aide d’un compteur. Lorsque ce compteur atteint la capacité d’endurance maximale, ce bloc est considéré comme ayant atteint sa durée de vie prévue et est mis hors service.
Mécanisme de "wear-leveling" prolongeant la durée de vie de l’Eeprom dans une application, y compris les blocs de mémoire qui ont été retirés (notés avec des "X" rouges)
Le "wear-leveling" constitue donc une méthode efficace pour réduire l’usure et améliorer la fiabilité. Cette approche permet notamment à l’ensemble de la mémoire Eeprom d’atteindre son endurance maximale spécifiée, conformément à la fiche technique. Des possibilités d’amélioration existent Cependant, le nombre d’effacements/écritures de chaque bloc ne reflète pas fidélement l’état physique réel de la mémoire mais constitue plutôt un indicateur approximatif de la durée de vie restante de ce bloc. Ce qui signifie que l’application ne détectera pas les défaillances survenant avant que ce compteur n’atteigne sa valeur maximale autorisée. L’application ne peut pas non plus exploiter à 100% la durée de vie réelle de chaque bloc de mémoire. Comme il n’existe aucun moyen de détecter l’usure physique, le logiciel devra effectuer des vérifications supplémentaires si une fiabilité élevée est requise. L’une des méthodes possibles consiste à relire le bloc que l’on vient d’écrire et à le comparer aux données d’origine. Cela nécessite toutefois du temps sur le bus, une surcharge du processeur et de la mémoire vive supplémentaire. Pour détecter les défaillances précoces, cette relecture doit avoir lieu à chaque écriture, au moins pendant un certain temps après le début de la durée de vie de l’application. Les relectures visant à détecter les défaillances de type usure des cellules doivent avoir lieu à chaque écriture dès que le nombre d’écritures commence à approcher la spécification d’endurance. Chaque fois qu’une relecture n’a pas lieu, l’utilisateur n’est pas en mesure de détecter une usure et, par conséquent, des données corrompues peuvent potentiellement être utilisées. L’organigramme logiciel suivant illustre un exemple de wear-leveling statique, incluant la relecture et la comparaison nécessaires pour garantir un haut degré de fiabilité.
Organigramme logiciel illustrant le "wear-leveling" statique, incluant les relectures et les comparaisons de la mémoire pour garantir un haut degré de fiabilité
Le fait de devoir relire et comparer la mémoire après chaque écriture peut cependant entraîner de sérieuses limitations en termes de performances et d’utilisation des ressources système. Néanmoins, il existe sur le marché plusieurs solutions à ce problème. Par exemple, certaines Eeprom intègrent un mécanisme de correction d’erreurs, qui permet généralement de corriger une erreur sur un bit pour chaque nombre spécifié d’octets (par exemple 4 octets). Les mémoires embarquées utilisent différents schémas de correction d’erreurs, les plus courants étant les codes de Hamming. La correction d’erreurs, ou ECC (Error Correction Code), fonctionne en incluant des bits supplémentaires appelés bits de parité, qui sont calculés à partir des données stockées dans la mémoire. Lorsque les données sont relues, le circuit interne recalcule les bits de parité et les compare aux bits de parité stockés auparavant. Une divergence indique qu’une erreur s’est produite. Le schéma de cette divergence de parité permet de localiser précisément l’emplacement de l’erreur. Le système peut alors corriger automatiquement cette erreur d’un seul bit en inversant sa valeur, rétablissant ainsi l’intégrité des données. Ce système contribue à prolonger la durée de vie d’un bloc de mémoire. Cependant, de nombreuses mémoires Eeprom ne fournissent aucune indication quant à la réalisation de cette opération de correction. Par conséquent, cela ne résout toujours pas le problème de la détection d’une défaillance avant la perte des données. L'ECC à la rescousse Cependant, pour détecter une véritable usure physique, certaines Eeprom intègrent un indicateur binaire qui peut être lu lorsqu’une erreur d’un seul bit dans un bloc a été détectée et corrigée. Cela permet de relire et de vérifier un seul registre d’état pour voir si l’ECC a été déclenché lors de la dernière opération. Il devient ainsi moins nécessaire de relire des blocs de mémoire entiers pour vérifier les résultats. Lorsqu’une erreur est détectée au sein du bloc, il convient de considérer que celui-ci est dégradé et qu’il ne peut plus être utilisé, et donc de le mettre hors service. Grâce à cet indicateur, il est possible de se fier à un retour d’information basé sur les données pour savoir quand la mémoire est réellement usée, ce qui est plus sûr que d’utiliser un compteur aveugle. Cela élimine pratiquement tout besoin d’estimer la durée de vie prévue de la mémoire au moment de la conception. Une apperoche particulièrement avantageuse pour les systèmes soumis à des changements importants de leur environnement tout au long de la durée de vie de l’application finale, comme des variations brutales de température et de tension, courantes dans les secteurs de l’industrie manufacturière, de l’automobile et des services distribués en réseau. Il est désormais possible de prolonger la durée de vie des cellules de mémoire jusqu’à leur défaillance effective, ce qui permet potentiellement d’utiliser le dispositif encore plus longtemps que ne le prévoit la spécification d’endurance indiquée dans la fiche technique.
Le nivellement de l’usure sur une mémoire Eeprom dotée d’un mécanisme de correction d’erreurs (ECC) et d’un bit d’état permet d'optimiser sa durée de vie en exploitant les cellules jusqu’à leur défaillance, ce qui peut prolonger la durée de vie au-delà des spécifications d’endurance
Microchip Technology, fabricant de semi-conducteurs dont des mémoires Eeprom, propose désormais plusieurs composants dotés d’un indicateur signalant que l’ECC est intervenu, alertant ainsi l’application qu’un bloc de mémoire particulier doit être mis hors service (*). Il s’agit d’une approche "wear-leveling" fondée sur l’état réel de la mémoire et pilotée par les données, qui permet de prolonger encore davantage la durée de vie de la mémoire au-delà de ce que les mécanismes de wear-leveling standards peuvent offrir. Elle est également plus fiable que le "wear-leveling" classique car elle utilise des données réelles plutôt que des compteurs arbitraires : si un bloc dure plus longtemps qu’un autre, il est possible de continuer à l’utiliser jusqu’à ce que les cellules s’usent. Ce qui permet de réduire le temps passé sur le bus ainsi que la charge du processeur et la mémoire vive (RAM) requise, ce qui peut à son tour diminuer la consommation d’énergie et les performances globales du système. Le flux logiciel peut alors être mis à jour pour intégrer ce nouvel indicateur d’état.
Organigramme illustrant une routine simplifiée de wear-leveling statique utilisant un indicateur d’état de correction d’erreur (ECS)
Comme l’illustre l’organigramme ci-dessus, l’utilisation d’un bit d’état de correction d’erreur (ECS) élimine la nécessité de relire les données, de les stocker en RAM et d’effectuer une comparaison complète avec les données qui viennent d’être écrites, ce qui libère des ressources et crée un flux logiciel plus simple au niveau de la conception. Une relecture des données reste nécessaire (car le bit ECS n’est évalué que lors des opérations de lecture), mais les données lues peuvent être ignorées et ne pas être conservées : il suffit ensuite de lire le bit ECS. Cela évite d’avoir recours à de la mémoire RAM supplémentaire et supprime la surcharge processeur liée à la comparaison des données. Le nombre de fois où le logiciel vérifie le bit d’état varie en fonction de la taille des blocs définis, qui dépend elle-même de la plus petite taille de fichier gérée par le logiciel. Les avantages du bit ECS - Optimisation de la durée de vie des blocs EEPROM en exploitant les cellules jusqu’à leur défaillance. - Possibilité de supprimer les lectures de blocs entiers destinées à vérifier la corruption des données, ce qui libère du temps sur le bus de communication. - Si le wear-leveling n’est pas nécessaire ou s’avère trop contraignant pour l’application, le bit ECS permet de vérifier rapidement l’état de la mémoire, de prolonger la durée de vie des blocs EEPROM et d’éviter d’avoir à suivre le nombre de cycles d’effacement et d’écriture. La correction d’erreurs mise en œuvre à l’aide d’un indicateur d’état est donc un outil puissant pour améliorer la fiabilité et prolonger la durée de vie du composant, en particulier lorsqu’elle est utilisée dans le cadre d’un schéma de wear-leveling. Toute amélioration de la fiabilité est très recherchée dans les applications automobiles, médicales et autres applications de sécurité fonctionnelle, et est bien accueillie par tout concepteur cherchant à créer le meilleur système possible pour son application. (*) EEPROM I²C : 24CSM01 (1 Mbit), 24CS512 (512 Kbit), 24CS256 (256 Kbit) EEPROM SPI : 25CSM04 (4 Mbit), 25CS640 (64 Kbit) |