Une raison possible est que la correction que ferait le matériel n'est pas forcément la bonne.
En gros, le principe des codes détecteurs et correcteurs d'erreur, c'est de trouver le code (la valeur du message et de ses octets de contrôle) "le plus proche" de ce qui est trouvé dans la mémoire.
Si il y a effectivement un seul bit qui avait changé de valeur, la correction est forcément la bonne. Mais s'il y avait 2, ou 4, ou 31 bits sur 32 de changés? Dans certains cas on peut toujours détecter qu'il y a une erreur, mais la correction proposée par le matériel n'est pas la bonne: elle donne une valeur dont la somme de contrôle est valide, mais pas celle d'origine.
Pour prendre un exemple très simple, imaginons un système de parité en lignes et colonnes.
Le message qu'on veut envoyer est:
00
01
On ajoute sur chaque ligne et chaque colonne un bit de telle façon que il y ait toujours un nombre pair de 1 dans chaque ligne et colonne:
00 0
01 1
01 1
Maintenant, si il y a un seul bit corrompu, on détecte tout de suite quelle ligne et quelle colonne ne sont pas bonnes, et on peut corriger. Par exemple:
00 0
00 1 <- Erreur sur cette ligne
01 1
^- Erreur sur cette colonne
Mais si on a 2 bits qui sont changés, on ne sait plus. Par exemple si on reçoit:
00 0
00 0 <- Deux bits 1 sont devenus des 0 ici
01 1
On détecte une erreur sur 2 colonnes et sur aucune ligne.
Il y a plusieurs corrections possibles en changeant 2 bits:
00 0
00 0
00 0 <- On peut corriger ici
00 0
01 1 <- On peut corriger ici
01 1
01 1 <- Ou alors on peut corriger ici
00 0
01 1
Et s'il y a encore plus d'erreurs, on peut se trouver dans un cas où la correction la plus évidente (changer 1 seul bit) ne correspond pas au message initial (il fallait en fait changer 3 bits ailleurs).
Ce code de parité matriciel permet de corriger toutes les erreurs de 1 bit. Il permet de détecter toutes les erreurs de 1, 2 ou 3 bits. Au delà, dans certains cas il ne détecte même pas forcément qu'il y a une erreur.
Bien sûr, ce n'est pas un code très performant, on sait faire beaucoup mieux, mais le principe reste le même.
Pour plus d'info là dessus, voir le principe du calcul de distance de Hamming (combien de bits il faut changer pour passer d'un code à un autre) et les garanties apportées par le code correcteur (une distance de Hamming minimale entre 2 codes valides). Si il y a plus d'erreurs que cette distance minimale, on va se retrouver plus "proche" d'un autre code que celui initial.
Le même code détecteur/correcteur est donc plus performant pour détecter les erreurs (il suffit de voir qu'on a pas un mot de code valide), que pour les corriger (il faut en plus retrouver quel était le mot de code de départ).
On utilise le mode de correction dans le cas où la donnée n'est pas récupérable autrement (lecture depuis un support de stockage, transmission radio (ou filaire) temps réel, ...). Mais ici on a un meilleur moyen: redémarrer le satellite et réinitialiser toute la mémoire. Donc, pas la peine de prendre le risque de tenter une correction qui ne serait peut-être pas la bonne.
[^] # Re: Pourquoi le matériel ne corrige pas directement la mémoire ?
Posté par pulkomandy (site web personnel, Mastodon) . En réponse à la dépêche « It works on my satellite » ou l'histoire d'un bug dans l'espace. Évalué à 9.
Une raison possible est que la correction que ferait le matériel n'est pas forcément la bonne.
En gros, le principe des codes détecteurs et correcteurs d'erreur, c'est de trouver le code (la valeur du message et de ses octets de contrôle) "le plus proche" de ce qui est trouvé dans la mémoire.
Si il y a effectivement un seul bit qui avait changé de valeur, la correction est forcément la bonne. Mais s'il y avait 2, ou 4, ou 31 bits sur 32 de changés? Dans certains cas on peut toujours détecter qu'il y a une erreur, mais la correction proposée par le matériel n'est pas la bonne: elle donne une valeur dont la somme de contrôle est valide, mais pas celle d'origine.
Pour prendre un exemple très simple, imaginons un système de parité en lignes et colonnes.
Le message qu'on veut envoyer est:
On ajoute sur chaque ligne et chaque colonne un bit de telle façon que il y ait toujours un nombre pair de 1 dans chaque ligne et colonne:
Maintenant, si il y a un seul bit corrompu, on détecte tout de suite quelle ligne et quelle colonne ne sont pas bonnes, et on peut corriger. Par exemple:
Mais si on a 2 bits qui sont changés, on ne sait plus. Par exemple si on reçoit:
On détecte une erreur sur 2 colonnes et sur aucune ligne.
Il y a plusieurs corrections possibles en changeant 2 bits:
Et s'il y a encore plus d'erreurs, on peut se trouver dans un cas où la correction la plus évidente (changer 1 seul bit) ne correspond pas au message initial (il fallait en fait changer 3 bits ailleurs).
Ce code de parité matriciel permet de corriger toutes les erreurs de 1 bit. Il permet de détecter toutes les erreurs de 1, 2 ou 3 bits. Au delà, dans certains cas il ne détecte même pas forcément qu'il y a une erreur.
Bien sûr, ce n'est pas un code très performant, on sait faire beaucoup mieux, mais le principe reste le même.
Pour plus d'info là dessus, voir le principe du calcul de distance de Hamming (combien de bits il faut changer pour passer d'un code à un autre) et les garanties apportées par le code correcteur (une distance de Hamming minimale entre 2 codes valides). Si il y a plus d'erreurs que cette distance minimale, on va se retrouver plus "proche" d'un autre code que celui initial.
Le même code détecteur/correcteur est donc plus performant pour détecter les erreurs (il suffit de voir qu'on a pas un mot de code valide), que pour les corriger (il faut en plus retrouver quel était le mot de code de départ).
On utilise le mode de correction dans le cas où la donnée n'est pas récupérable autrement (lecture depuis un support de stockage, transmission radio (ou filaire) temps réel, ...). Mais ici on a un meilleur moyen: redémarrer le satellite et réinitialiser toute la mémoire. Donc, pas la peine de prendre le risque de tenter une correction qui ne serait peut-être pas la bonne.