FR 3055714 A1 20180309 FR 1658324 A 20160908 1 L'invention concerne le domaine des mémoires non volatiles de type « flash NAND » dans le domaine plus large des systèmes embarqués, notamment automobiles. Les mémoires flash de type NAND permettent le stockage persistent de données. Ces données sont en principe associées à un algorithme de correction automatique, ou code correcteur d'erreur, désigné sous l'abréviation anglaise ECC, pour « Error Correction Code », afin de prémunir lesdits systèmes embarqués contre la corruption des données stockées dans leur mémoire non volatile. Cependant, il peut survenir des erreurs non corrigibles, et les systèmes embarqués génèrent alors une exception lors de la lecture d'une telle erreur non corrigible. Dans ce contexte, la présente invention concerne un procédé permettant de corriger, dans une mémoire non volatile de type « flash NAND », certaines erreurs non corrigibles par les algorithmes de correction automatiques connus. Comme cela est connu, les véhicules automobiles, comme tout autre type de 15 véhicule, comprennent des calculateurs aptes à exécuter un logiciel embarqué. A cette fin, lesdits systèmes embarqués présentent des moyens de stockage de données, autrement dit des mémoires, volatiles ou non. De tels systèmes embarqués présentent ainsi notamment une mémoire volatile, également appelée mémoire vive, typiquement de la mémoire de type RAM, pour « Random Access Memory » selon 20 l'acronyme anglais bien connu de l'homme du métier. Les microcontrôleurs, anciens ou actuels, utilisent en interne de la mémoire flash de type NOR permettant de garantir l'intégrité des données stockées à 100 %. Aujourd'hui, de plus en plus, les systèmes embarqués embarquent de la mémoire flash de type NAND, bien connue de l'homme du métier, qui présente l'avantage 25 d'un coût réduit et de grandes capacités de stockage, et l'inconvénient d'une incapacité à garantir l'intégrité des données stockées à 100 %. La mémoire flash de type NAND est notamment utilisée pour la sauvegarde du logiciel du microcontrôleur, également appelé le « firmware » selon l'appellation anglaise bien connue de l'homme du métier, et pour la sauvegarde de données relatives aux cycles de vie du système embarqué et de son 30 logiciel. En pratique, quand le logiciel embarqué sur le système est exécuté, celui-ci lit la mémoire flash pour permettre le chargement et la mise en oeuvre d'un logiciel applicatif et la bonne exécution des fonctions décisionnelles qu'il comporte. Plus précisément, le calculateur concerné par le chargement et l'exécution 35 d'un logiciel hébergé sur une mémoire flash de type NAND fait appel à un programme de démarrage de ladite mémoire flash, ledit programme de démarrage pouvant être désigné 3055714 2 par l'homme du métier sous l'abréviation RBL pour « ROM Boot Loader » en anglais. Ce programme de démarrage exécute un programme de chargement au démarrage, connu de l'homme du métier sous l'abréviation UBL pour « User Boot Loader », dont la fonction est de charger en mémoire vive le logiciel à exécuter, stocké sur la mémoire flash. 5 Par ailleurs, dans le contexte des calculateurs embarqués, notamment dans le domaine de l'automobile, il est bien connu que la mémoire flash de type NAND est une mémoire non volatile très utilisée, en raison de sa compétitivité économique et de son faible encombrement. Un problème connu lié à l'utilisation de mémoire flash de type NAND réside 10 cependant dans la difficulté à assurer la consistance des données qui y sont stockées. En effet, un défaut bien connu des mémoires flash réside dans le risque d'altération physique des bits qui la composent. Une altération physique d'un bit induit typiquement un risque de changement non souhaité de la valeur dudit bit, du fait d'une variation de la valeur de la tension à ses bornes. Selon l'état de la technique, comme évoqué brièvement ci-dessus, il existe des systèmes embarqués à mémoire flash de type NAND, dans laquelle les données sauvegardées sont associées à un algorithme de correction automatique de type ECC, pour « Error Correction Code », signifiant code de correction d'erreur. Grâce à l'association des données sauvegardées dans la mémoire flash à un 20 code de correction d'erreur, l'état de la technique permet de détecter et de traiter une grande partie des erreurs relatives à une inconsistance des données lues en mémoire flash. Cependant, parmi les erreurs qui peuvent survenir lors de la lecture de données en mémoire flash de type NAND, certaines ne sont pas corrigibles par un 25 algorithme de correction automatique de type ECC. Dans ce cas, lorsqu'en cours d'exécution un système embarqué tente de lire une donnée correspondant à une erreur non corrigible, ce dernier lève une exception qui entraîne généralement le redémarrage du système embarqué, voire celui du calculateur. Un problème technique réside alors dans le fait qu'en cas d'altération 30 physique non corrigible de la mémoire, le calculateur peut entrer dans une boucle d'échecs au démarrage suivi de redémarrages. En tout état de cause, le système embarqué ne parvient pas à charger le logiciel voulu. Pour pallier ce problème, dans l'état de la technique, une première solution simple consiste à charger un programme invitant l'utilisateur à mettre à jour le logiciel. 35 Lors d'une réinstallation dudit logiciel, éventuellement modifié, le problème est très probablement corrigé. 3055714 3 Afin d'éviter cette manipulation et l'indisponibilité temporaire du logiciel, il est connu une deuxième solution consistant à stocker, en mémoire flash, une copie alternative du logiciel à charger, encore appelée copie de sauvegarde du logiciel, correspondant à une duplication, c'est-à-dire à une copie à l'identique du logiciel à 5 charger. En effet, généralement, lorsque le logiciel à exécuter est de taille réduite, il peut être stocké en deux copies identiques (ou deux « instances ») sur la mémoire flash, de sorte qu'il est supposé statistiquement peu probable que les deux copies soient corrompues simultanément, une copie assurant alors la fonction de copie de sauvegarde de l'autre version. Le programme de chargement au démarrage choisit la copie du logiciel 10 à charger en mémoire vive. Ainsi, en cas d'échec du chargement d'une première copie du logiciel, le programme de chargement au démarrage de la mémoire flash cherche à charger la copie alternative. La copie alternative du logiciel peut alors, comme cela est connu, servir de 15 source pour « réparer » la version corrompue du logiciel stocké en mémoire flash. Une limite de cette technique connue se produit cependant lorsque la version de sauvegarde, c'est-à-dire la copie à l'identique de la version corrompue du logiciel, s'avère elle-même corrompue. Même statistiquement assez réduite, la probabilité que les deux versions du logiciel à charger soient corrompues existe et l'état de la technique ne comprend pas de solution simple à ce problème. Or, s'il est possible de stocker en mémoire vive un nombre élevé d'instances du programme de chargement au démarrage, de sorte que le programme de démarrage a selon toute vraissemblance la possibilité d'en exécuter une instance qui ne soit pas corrompue, il n'en va pas de même des logiciels embarqués à l'initiative de l'utilisateur. En effet, la taille et le nombre de ces logiciels utilisateurs sont en pratique trop grands pour permettre le stockage en mémoire flash de plus de deux copies desdits logiciels. Il existe donc un besoin pour un procédé apte à gérer la survenance d'erreurs, non corrigibles par les algorithmes de type ECC connus, à la fois sur la première copie du logiciel à charger lue par le programme de chargement au démarrage et sur la copie de sauvegarde lue par un programme de chargement au démarrage après (re-)démarrage du calculateur. A cette fin, plus précisément, la présente invention a pour objet un procédé de correction d'erreur dans une mémoire flash non volatile de type NAND, ladite mémoire flash comprenant un ensemble de blocs auxquels l'application accède en lecture ou en écriture ou en effacement, chaque bloc comportant une pluralité de pages, ladite mémoire comprenant une première et une deuxième copies, identiques, d'un logiciel à charger, la première et la deuxième copies du logiciel occupant physiquement un nombre égal de 3055714 4 blocs distincts, une page d'un bloc occupé par des données de la première copie du logiciel étant corrompue, et une page d'un bloc occupé par des données de la deuxième copie du logiciel étant corrompue, ledit procédé comprenant l'exécution d'un programme de chargement au démarrage mettant en oeuvre les étapes suivantes : 5 - la tentative de chargement de la première copie du logiciel par le programme de chargement au démarrage ; - la découverte par le programme de chargement au démarrage qu'au moins une page d'un bloc occupé par la première copie du logiciel est corrompue ; - l'enregistrement d'une identification de ladite au moins une page corrompue dans 10 une mémoire persistante de la mémoire flash ; - la configuration du programme de chargement au démarrage pour qu'il charge la deuxième copie du logiciel à la prochaine exécution ; - la réexécution du programme de chargement au démarrage ; - la tentative de chargement de la deuxième copie du logiciel par le programme de 15 chargement au démarrage ; - la découverte par le programme de chargement au démarrage qu'au moins une page d'un bloc occupé par la deuxième copie du logiciel est corrompue ; - l'enregistrement d'une identification de ladite au moins une page corrompue dans une mémoire persistante de la mémoire flash ; 20 - le remplacement du bloc occupé par la deuxième copie du logiciel comprenant une page corrompue par le bloc identique occupé par la première copie du logiciel ne comprenant pas de page corrompue, permettant de corriger la deuxième copie du logiciel ; - la réexécution du programme de chargement au démarrage ; 25 - le chargement de la deuxième copie du logiciel. Grâce au procédé selon l'invention, lorsque deux ensembles de blocs d'une mémoire flash occupés respectivement par deux copies d'un logiciel à charger, comprennent chacun au moins un bloc comportant une page corrompue par une erreur non corrigible par un algorithme automatique de correction d'erreur de type ECC, il est 30 possible de corriger chacune des deux copies et de charger le logiciel en mémoire vive. Avantageusement, le procédé selon l'invention comprend par ailleurs le remplacement du bloc corrompu de la première copie du logiciel par le bloc identique occupé par la deuxième copie du logiciel, permettant de corriger la première copie du logiciel à charger. 35 Selon un mode de réalisation, le procédé selon l'invention comprend, avant le remplacement du bloc corrompu de la deuxième copie du logiciel, lorsque deux pages distinctes de deux blocs identiques sont corrompues, c'est-à-dire lorsque, dans des blocs 3055714 5 destinés à être occupés par des données identiques, respectivement de la première et de la deuxième copies du logiciel à charger, deux pages destinées à contenir des données distinctes, respectivement dans chacun desdits blocs, sont corrompues : - la mise en oeuvre d'un algorithme configuré pour reconstituer un bloc non 5 corrompu correspondant auxdits blocs corrompus, à partir des données occupant des pages non corrompues de chacun desdits blocs corrompus, - le remplacement du bloc corrompu de la première copie du logiciel à charger par ledit bloc non corrompu reconstitué. Ainsi, selon ce mode de réalisation, lorsque deux blocs identiques, 10 hébergeant des données relatives aux deux copies du logiciel à charger sont corrompus, en des pages différentes, il est reconstitué un bloc équivalent non corrompu à partir des pages non corrompues de chacun desdits blocs. Ce bloc non corrompu reconstitué est disponible pour réparer les deux blocs corrompus. La présente invention vise également un système embarqué comprenant un 15 programme de chargement au démarrage configuré pour mettre en oeuvre le procédé brièvement décrit ci-dessus. La présente invention vise également un calculateur comprenant un programme de chargement au démarrage configuré pour mettre en oeuvre le procédé brièvement décrit ci-dessus. 20 La présente invention vise aussi un véhicule automobile comprenant un tel calculateur. L'invention sera mieux comprise à la lecture de la description qui va suivre, donnée uniquement à titre d'exemple, et se référant aux dessins annexés qui représentent : 25 - la figure 1, le schéma de principe d'une mémoire de type « flash NAND », selon l'état de la technique : la figure 2, le diagramme représentant le principe d'exécution d'un programme de chargement au démarrage ; la figure 3, le diagramme représentant le principe du procédé selon 30 l'invention. Il faut noter que les figures exposent l'invention de manière détaillée pour en permettre la mise en oeuvre, lesdites figures pouvant bien entendu également servir à mieux définir l'invention. L'invention est présentée principalement en vue d'une mise en oeuvre du 35 procédé de correction d'erreur dans une mémoire flash de type NAND comprenant deux versions identiques d'un logiciel à charger, quel que soit le domaine technique dans lequel ladite mémoire flash est mise en oeuvre. 3055714 6 Cependant, le procédé selon l'invention vise notamment le domaine technique de l'automobile, dans lequel des mémoires non volatiles, de type mémoire « flash NAND », sont couramment mises en oeuvre, et dans lequel le cycle de vie du produit (l'automobile) peut être long au regard du nombre de cycles autorisés sur lesdites 5 mémoires flash. En référence à la figure 1, comme cela est connu de l'homme du métier, une mémoire de type « flash NAND » est divisée en blocs BO, B1, ..., Bn comprenant chacun plusieurs pages P0, P1, ..., P62, P63. D'autre part, chaque page est constituée d'une zone de « données » D, dite « data area » selon l'expression en anglais connue de 10 l'homme du métier, et une zone « réservée » S, dite « spare area » selon l'expression en anglais connue de l'homme du métier. La zone réservée S comporte en particulier une balise spéciale comprenant une information relative à l'éventuel caractère corrompu de la page correspondante. En pratique, une application accède en lecture / écriture à une page et réalise 15 des effacements bloc par bloc. Comme évoqué précédemment, et en référence à la figure 2, un programme de démarrage RBL, également désigné en anglais sous l'expression de « ROM Boot Loader » est exécuté au démarrage du système embarqué. Le programme de démarrage RBL charge en mémoire vive un programme de chargement au 20 démarrage UBL pour en permettre l'exécution. Bien que cela ne soit pas représenté, il peut exister en mémoire flash, comme indiqué précédemment, plusieurs instances du programme de chargement au démarrage UBL, l'une de ces instances, valide, étant chargée en mémoire vive, en vue de son exécution, par le programme de démarrage RBL. Le programme de chargement au démarrage UBL, également désigné 25 en anglais sous l'expression de « User Boot Loader », assure la fonction de chargement en mémoire vive d'un logiciel exécutable voulu, stocké dans une mémoire flash de type NAND. Le logiciel à charger existe en au moins deux copies identiques SW1, SW2 en mémoire flash. Le programme de chargement au démarrage UBL est par exemple configuré, 30 au lancement du processus de chargement du logiciel, pour charger en mémoire vive une première copie SW1 du logiciel. Le programme de chargement au démarrage UBL accède par conséquent aux données présentes dans la mémoire flash et correspondant à la première copie SW1 du logiciel. Pour chaque page de chaque bloc hébergeant lesdites données, Le programme de chargement au démarrage UBL vérifie l'intégrité des données 35 présentes dans ladite page, en lisant la balise prévue à cet effet. En cas de corruption d'une page, en raison d'une erreur sur au moins un bit non corrigible par un algorithme de correction automatique de type ECC, le chargement 3055714 7 de la première copie SW1 du logiciel est interrompu et la configuration du programme de chargement au démarrage UBL est modifiée de telle sorte qu'il démarre, la fois suivante, sur la deuxième copie SW2, alternative, du logiciel. Le programme de chargement au démarrage UBL redémarre alors et cherche 5 à charger la deuxième copie SW2 du logiciel. Selon l'état de la technique, cette stratégie permet de résoudre la plupart des cas d'altération de bits d'une mémoire flash. Cependant, un problème majeur persiste dans le cas où un bit d'une page hébergeant des données correspondant à la deuxième copie SW2 du logiciel est corrompu, sans être corrigible par un algorithme de correction 10 automatique de type ECC. Dans l'état de l'art, le problème est alors insoluble de façon simple. En référence à la figure 3, le procédé selon l'invention permet de parer à cette éventualité. En effet, dans l'hypothèse où les deux copies identiques SW1, SW2 du 15 logiciel à charger en mémoire vive seraient corrompues, faisant l'objet d'une erreur non corrigible par un algorithme de correction automatique de type ECC, le procédé selon l'invention permet d'éviter d'entrer dans une boucle infinie d'échecs au démarrage suivi de redémarrages du programme de chargement au démarrage UBL. A cette fin, à titre d'exemple non limitatif, il est fait référence à la figure 3 dans 20 laquelle une première copie SW1 du logiciel à charger est stockée en mémoire flash sur N blocs, dont les blocs BO à B4 de ladite mémoire flash, tandis qu'une deuxième copie SW2 est stockées entre les en mémoire flash sur N blocs, dont les blocs B50 à B54 de ladite mémoire flash, les blocs BO et B50 étant destinés à contenir des données identiques du logiciel, de même que, respectivement, les blocs B1 et B51, les blocs B2 25 et B52, les blocs B3 et B53, les blocs B4 et B54, etc. Chaque bloc comprend 64 pages numérotées de P1 à P63. Il est rappelé à nouveau que les nombres et les numéros de pages ou de blocs de la mémoire flash sont choisis ici à titre purement illustratifs. Ainsi, par exemple, la page P1 du bloc B2, affectant la première copie SW1, est corrompue par une erreur non corrigible par un algorithme de correction automatique de type ECC, et la 30 page P3 du bloc B53, affectant la deuxième copie SW2, est également corrompue par une erreur non corrigible par un algorithme de correction automatique de type ECC. Le programme de chargement au démarrage UBL assure alors la réparation des deux copies corrompues en « flashant », c'est-à-dire en effaçant puis en réécrivant les blocs comprenant la page corrompue, par copie du bloc non corrompu correspondant 35 issu de l'autre copie du logiciel. Dans l'exemple choisi, le programme de chargement au démarrage est supposé avoir tenté de démarrer la première copie SW1 du logiciel. En raison de la 3055714 8 corruption de la page P1 du bloc B2, cette information étant stockée en mémoire persistante de la mémoire flash, le programme de chargement au démarrage UBL voit sa configuration modifiée de façon à ce qu'il tente de charger la deuxième copie SW2 du logiciel au prochain démarrage, et il redémarre. 5 La tentative de chargement de la deuxième copie SW2 du logiciel échoue également en raison de la corruption de la page P3 du bloc B53, cette information étant stockée en mémoire persistante de la mémoire flash. Dès lors, le programme de chargement au démarrage UBL sait que les deux copies SW1, SW2 du logiciel à charger sont corrompues. 10 De ce fait, le programme de chargement au démarrage UBL « flashe » le bloc B53 en l'effaçant puis en y copiant le contenu du bloc B3, identique et non corrompu. Par suite, le programme de chargement au démarrage UBL, selon un mode de réalisation, répare également la première copie du logiciel en « flashant » le bloc B2 à l'aide du contenu du bloc B52, identique et non corrompu. 15 L'exemple précédent est adapté à une situation dans laquelle le bloc comportant une page corrompue occupé par la première copie SW1 du logiciel et le bloc comportant une page corrompue occupé par la deuxième copie SW2 du logiciel sont distincts, c'est-à-dire que lesdits blocs comportant respectivement une page corrompue ne sont pas configurés pour être occupés par des données identiques du logiciel. 20 Cependant, De la même manière, si deux pages différentes d'un même bloc, c'est-à-dire, par exemple la page P1 du bloc B1 et la page P12 du bloc B51, sont corrompues par une erreur non corrigible par un algorithme de correction automatique de type ECC, chaque bloc est réparé au moyen d'un bloc sain reconstitué, dans une étape intermédiaire, à partir de pages saines des deux blocs. 25 Il est à noter que le fait de « flasher » le bloc corrompu pour le réparer présente l'avantage incident de recharger les bits correspondants de la mémoire flash, réduisant le risque de subir la présence de bits erronés en raison d'un basculement non souhaité de leur valeur suite à la « fatigue » de la mémoire flash entraînant une baisse de la tension aux bornes de ces bits (phénomène de « bit flipping » selon l'expression 30 usuelle en anglais). En résumé, le procédé selon l'invention permet de démarrer une application logicielle dupliquée sur une mémoire flash de type NAND, même lorsque les deux copies sont corrompues. Il est précisé, en outre, que la présente invention n'est pas limitée au mode de 35 réalisation décrit ci-dessus et est susceptible de variantes accessibles à l'homme de l'art. REVENDICATIONS1. Procédé de correction d'erreur dans une mémoire flash non volatile de type NAND, ladite mémoire flash comprenant un ensemble de blocs (B0, Bl, B2, B3, B4, B50, B51, B52, B53, B54) auxquels l'application accède en lecture ou en écriture ou en effacement, chaque bloc (B0, B1, ..., B50, B51, ...) comportant une pluralité de 5 pages (P0, P1, ..., P63), ladite mémoire comprenant une première et une deuxième copies (SW1, SW2), identiques, d'un logiciel à charger, la première et la deuxième copies (SW1, SW2) du logiciel occupant physiquement un nombre égal de blocs distincts, une page d'un bloc occupé par des données de la première copie (SW1) du logiciel étant corrompue, et une page d'un bloc occupé par des données de la deuxième copie (SW2) 10 du logiciel étant corrompue, ledit procédé comprenant l'exécution d'un programme de chargement au démarrage (UBL) mettant en oeuvre les étapes suivantes : - la tentative de chargement de la première copie (SW1) du logiciel par le programme de chargement au démarrage (UBL) ; - la découverte par le programme de chargement au démarrage (UBL) qu'au 15 moins une page (P1) d'un bloc (B2) occupé par la première copie (SW1) du logiciel est corrompue ; - l'enregistrement d'une identification de ladite au moins une page corrompue dans une mémoire persistante de la mémoire flash ; - la configuration du programme de chargement au démarrage (UBL) pour qu'il 20 charge la deuxième copie (SW2) du logiciel à la prochaine exécution ; - la réexécution du programme de chargement au démarrage (UBL) ; - la tentative de chargement de la deuxième copie (SW2) du logiciel par le programme de chargement au démarrage (UBL) ; - la découverte par le programme de chargement au démarrage (UBL) qu'au 25 moins une page (P3) d'un bloc (B53) occupé par la deuxième copie (SW2) du logiciel est corrompue ; - l'enregistrement d'une identification de ladite au moins une page corrompue dans une mémoire persistante de la mémoire flash ; - le remplacement du bloc (B53) occupé par la deuxième copie (SW2) du logiciel 30 comprenant une page corrompue par le bloc identique (B3) occupé par la première copie (SW1) du logiciel ne comprenant pas de page corrompue, permettant de corriger la deuxième copie du logiciel ; 3055714 10 - la réexécution du programme de chargement au démarrage (UBL) ; - le chargement de la deuxième copie (SW2) du logiciel. 2. Procédé selon la revendication 1, comprenant par ailleurs le remplacement du bloc corrompu (B2) de la première copie (SW1) du logiciel par le bloc identique (B52) 5 occupé par la deuxième copie (SW2) du logiciel, permettant de corriger la première copie (SW1) du logiciel à charger. 3. Procédé selon l'une quelconque des revendications précédentes, comprenant, avant le remplacement du bloc corrompu de la deuxième copie (SW2) du logiciel, lorsque deux pages distinctes de deux blocs identiques sont corrompues, c'est-à-dire lorsque, 10 dans des blocs destinés à être occupés par des données identiques, respectivement de la première (SW1) et de la deuxième (SW2) copies du logiciel à charger, deux pages destinées à contenir des données distinctes, respectivement dans chacun desdits blocs, sont corrompues : - la mise en oeuvre d'un algorithme configuré pour reconstituer un bloc non 15 corrompu correspondant auxdits blocs corrompus, à partir des données occupant des pages non corrompues de chacun desdits blocs corrompus, - le remplacement du bloc corrompu de la première copie (SW1) du logiciel à charger par ledit bloc non corrompu reconstitué. 4. Système embarqué comprenant un programme de chargement au démarrage 20 configuré pour mettre en oeuvre le procédé selon l'une quelconque des revendications précédentes. 5. Calculateur comprenant un programme de chargement au démarrage configuré pour mettre en oeuvre le procédé selon l'une quelconque des revendications 1 à 3. 25 6. Véhicule automobile comprenant un calculateur selon la revendication précédente.