Julien Rosener (julien.rosener@digital-scratch.org) Le contrôle CRC. 17/05/2004 : Rajout des références



Documents pareils
Les Réseaux sans fils : IEEE F. Nolot

Les portes logiques. Voici les symboles des trois fonctions de base. Portes AND. Portes OR. Porte NOT

Système binaire. Algèbre booléenne

Chapitre 1 I:\ Soyez courageux!

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

MICROINFORMATIQUE NOTE D APPLICATION 1 (REV. 2011) ARITHMETIQUE EN ASSEMBLEUR ET EN C

MISE A NIVEAU INFORMATIQUE LANGAGE C - EXEMPLES DE PROGRAMMES. Université Paris Dauphine IUP Génie Mathématique et Informatique 2 ème année

Licence Sciences et Technologies Examen janvier 2010

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Cahier des charges. driver WIFI pour chipset Ralink RT2571W. sur hardware ARM7

Initiation à la programmation en Python

Algorithmique et Programmation, IMA

Représentation d un entier en base b

Introduction à l étude des Corps Finis

Arithmétique binaire. Chapitre. 5.1 Notions Bit Mot

Recherche dans un tableau

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Application 1- VBA : Test de comportements d'investissements

Définition 0,752 = 0,7 + 0,05 + 0,002 SYSTÈMES DE NUMÉRATION POSITIONNELS =

STAGE IREM 0- Premiers pas en Python

Programmation C++ (débutant)/instructions for, while et do...while

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

I. Introduction aux fonctions : les fonctions standards

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Informatique Générale

V- Manipulations de nombres en binaire

Architecture des ordinateurs

Programmation système de commandes en C

Calculateur quantique: factorisation des entiers

Représentation des Nombres

Signalisation, codage, contrôle d'erreurs

NanoSense. Protocole Modbus de la sonde Particules P4000. (Version 01F)



Logiciel de Base. I. Représentation des nombres

DU BINAIRE AU MICROPROCESSEUR - D ANGELIS CIRCUITS CONFIGURABLES NOTION DE PROGRAMMATION

Programmation C. Apprendre à développer des programmes simples dans le langage C

Algorithmique & Langage C IUT GEII S1. Notes de cours (première partie) cours_algo_lgc1.17.odp. Licence

Écrit par Riphur Riphur.net

Chapitre 10. Les interfaces Comparable et Comparator 1

Les opérations binaires

Le prototype de la fonction main()

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Conversion d un entier. Méthode par soustraction

Le simulateur HDLC (High-Level Data Link Control) 1

I. TRANSMISSION DE DONNEES

Cours d Informatique

Cours d initiation à la programmation en C++ Johann Cuenin

Le stockage local de données en HTML5

Architecture des ordinateurs TD1 - Portes logiques et premiers circuits

Définition : On obtient les nombres entiers en ajoutant ou retranchant des unités à zéro.

module Introduction aux réseaux DHCP et codage Polytech / 5

Transmissions série et parallèle

TP 2 Réseaux. Adresses IP, routage et sous-réseaux

Comment développer et intégrer un module à PhpMyLab?

Algorithme. Table des matières

DM 1 : Montre Autoquartz ETA

PROJET ALGORITHMIQUE ET PROGRAMMATION II

Assembleur i8086. Philippe Preux IUT Informatique du Littoral. Année universitaire 95 96

Mobyt Intégration par Webservice TABLE DES MATIERES

Présentation du langage et premières fonctions

1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Quelques tests de primalité

Introduction au langage C

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

Compression de Données - Algorithme de Huffman Document de Conception

La conversion de données : Convertisseur Analogique Numérique (CAN) Convertisseur Numérique Analogique (CNA)

UE Programmation Impérative Licence 2ème Année

Activité 4. Tour de cartes Détection et correction des erreurs. Résumé. Liens pédagogiques. Compétences. Âge. Matériels

Architecture des ordinateurs. Environnement Windows : sauvegarde

TD 1 - Transmission en bande de passe

1.6- Génération de nombres aléatoires

THEME : CLES DE CONTROLE. Division euclidienne

GENERALITES. COURS TCP/IP Niveau 1

Le service FTP. M.BOUABID, Page 1 sur 5

RÉSEAUX INFORMATIQUES, MODÈLE OSI ET PROTOCOLE TCP/IP

6. Hachage. Accès aux données d'une table avec un temps constant Utilisation d'une fonction pour le calcul d'adresses

TP 1. Prise en main du langage Python

Cours 6 : Tubes anonymes et nommés

avec des nombres entiers

TP : Shell Scripts. 1 Remarque générale. 2 Mise en jambe. 3 Avec des si. Systèmes et scripts

Généralités sur le Langage Java et éléments syntaxiques.

ASR1 TD7 : Un microprocesseur RISC 16 bits

1. Qu'est-ce que SQL? La maintenance des bases de données Les manipulations des bases de données... 5

La polarisation des transistors

Mobyt Intégration HTTP TABLE DES MATIERES

Cryptographie et fonctions à sens unique

Groupe symétrique. Chapitre II. 1 Définitions et généralités

Arguments d un programme

Plateforme PAYZEN. Définition de Web-services

Architecture de l ordinateur

Définition des Webservices Ordre de paiement par . Version 1.0

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Vers l'ordinateur quantique

Atelier C TIA Portal CTIA04 : Programmation des automates S7-300 Opérations numériques

INF 321 : mémento de la syntaxe de Java

Notions fondamentales du langage C# Version 1.0

Transcription:

Historique des versions Le contrôle CRC 03/05/2004 : Création du document 17/05/2004 : Rajout des références Sommaire 1 Introduction... 1 2 Rappel sur l'arithmétique sur les nombres binaire...2 2.1 L'opérateur OU exclusif (XOR)...2 2.2 La division entre 2 nombre binaires...2 3 Fonctionnement... 3 4 Implémentation en C... 4 5 Références... 6 1/9

1 Introduction Ce document consiste à expliquer l'intérêt et le fonctionnement du contrôle CRC. Le CRC (Cyclic Redundancy Code) est un code permettant de vérifier l'intégrité d'un mot formé de plusieurs bits. Pourquoi vérifier cette intégrité? Beaucoup de système, notamment informatique, utilisent le transfert de données. Par exemple, un réseau informatique : il s'agit d'envoyer des données d'un point A à un point B. Celles ci sont transférées par «paquet» de plusieurs bits qui renferment l'adresse de l'émetteur, l'adresse du destinataire et bien sûr, les données elles mêmes. Mais comment s'assurer, une fois réceptionnées, que ces données sont conformes à celles qui ont été envoyées? Plusieurs solutions existent. La première et la plus simple serait de ré envoyer la trame de données, cependant, cela est bien trop coûteux en taille. D'autres méthodes consistent à rajouter quelques bits de vérification à la trame. Si ces bits sont le résultat d'une fonction mathématique appliqué aux données, il suffit d'appliquer une fonction inverse à la réception pour déterminer si oui ou non la trame est bien la même que celle envoyé. C'est cette méthode qui nous intéresse ici. Une technique simple est d'utiliser un bit de parité (1 si la trame est paire, 0 si elle est impaire); voilà une méthode peu coûteuse en place mais pas forcément très sûre. De manière un peu plus efficace on peut se rajouter un «cheksum» qui n'est autre que la somme des bits constituant de la trame de données. C'est une solution plus coûteuse mais qui permet de détecter déjà beaucoup d'erreurs. Nous arrivons maintenant à notre méthode qui consiste à calculer un code de redondance cyclique à partir de la trame des données. Ce code se détermine par des calculs relativement simple basés sur l'arithmétique modulaire. Nous verrons plus tard que la qualité de ses résultats est fonction d'un polynôme dit «générateur». Selon ce dernier, on peut obtenir des probabilités d'intégrité de la trame proche des 100%. 2/9

2 Rappel sur l'arithmétique sur les nombres binaire Je ne m'attarderai ni sur les définitions mathématiques, ni sur la théorie de l'arithmétique modulo 2. Cependant quelques petites connaissances dans ce domaine s'impose. 2.1 L'opérateur OU exclusif (XOR) Cet opérateur est très utilisé dans l'algorithme de création du CRC, en voici ces caractéristiques : A B A xor B 0 0 0 0 1 1 1 0 1 1 1 0 2.2 La division entre 2 nombre binaires 1 1 0 1 0 1 1 0 1 1 0 0 0 0 1 0 0 1 1 1 0 0 1 1 1 1 0 0 0 0 1 0 1 0 1 0 0 1 1 xor 1 0 0 1 1 0 0 0 0 1 xor 0 0 0 0 0 0 0 0 1 0 xor 0 0 0 0 0 0 0 1 0 1 xor 0 0 0 0 0 0 1 0 1 1 xor 0 0 0 0 0 1 0 1 1 0 xor 1 0 0 1 1 0 1 0 1 0 xor 0 0 0 0 0 1 0 1 0 0 xor 1 0 0 1 1 0 1 1 1 0 xor 0 0 0 0 0 1 1 1 0 3/9

Pour ce faire, on sélectionne le bit de poids fort du dividende, ici il vaut 1, il sera le bit de poids fort du quotient. Maintenant, on peut faire (1 x diviseur) = 1 0011. On réalise ensuite un XOR entre le dividende et ce résultat qui est décalé de suffisamment de bit pour commencer au début du dividende. Ensuite, on ajoute au résultat de l'opération le bit suivant correspondant au dividende (on le fait «descendre»). L'opération s'enchaîne ainsi de suite. On sélectionne le bit de poids fort du résultat précédemment trouvé, ici, c'est un 1. On lui applique donc un XOR avec 1 0011. Le résultat sera 0000 auquel on fera descendre 1, ce qui donne 00001. Ici, le bit de poids fort est un 0, donc (0 x diviseur) = 00000. On refait l'opération avec le XOR. Ces opérations seront réalisées jusqu'à ce qu'on ne puisse plus «descendre» de bit depuis le dividende, autrement dit, on réalise (taille_du_dividende taille_du_diviseur + 1) opérations (la taille correspondant au nombre de bits). 4/9

3 Fonctionnement Le calcul va utiliser le principe de la division polynomiale. Ainsi, on va diviser la trame d'entrée A par un polynôme et donc récupérer le CRC. A l'arrivée on redivisera la trame B complète (A+CRC) par ce même polynôme. Si le reste est nul, c'est que la trame de départ est la même que la trame d'arrivée. Le choix du polynôme générateur est fonction de la qualité du résultat du CRC. Sans rentrer dans les détails mathématiques, le plus simple est d'utiliser ceux qui sont définie comme étant de bonne qualité. Les CRC-16 et 32 donne une fiabilité de près de 100% au niveau de l'intégrité de la trame. Exemples : Nom CRC-4 x 4 + x 2 + x 1 CRC-12 x 12 + x 11 + x 3 + x 2 + x 1 + 1 CRC-16 SDLC (CCITT) x 16 + x 12 + x 5 + 1 CRC-16 x 16 + x 15 + x 2 + 1 CRC-16 Reverse x 16 + x 14 + x 1 + 1 SDLC Reverse x 16 + x 11 + x 4 + 1 Polynôme générateur CRC-32 (ethernet) x 32 + x 26 + x 23 + x 22 + x 16 + x 12 + x 11 + x 10 + x 8 + x 7 + x 5 + x 4 + x 2 + x 1 + 1 L'algorithme de base qui renvoi la trame d'origine suivit de son CRC est le suivant : Début Fin Décaler, vers la gauche, du degré du polynôme générateur le mot d'entrée Faire la division (mot d'entrée / polynôme générateur) Faire le calcul (mot d'entrée XOR polynôme générateur) L'algorithme qu'il faut appliquer à une trame reçu (contenant un CRC) est le suivant : Début Fin Faire la division (trame reçu / polynôme générateur) Si le reste est nul Alors la trame est correcte Sinon retransférer la trame Voici un exemple de recherche d'un CRC (il réutilise l'exemple de la division vu plus haut). On veut transférer le mot : 11 0101 1011. On décide d'utiliser le polynôme générateur de degré 4 (le degré étant le nombre de bit 1); ici 10011. D'abord on décale 11 0101 1011 de 4 rang vers la gauche, résultat : 11 0101 1011 0000. Ensuite, on cherche le reste de la division de 11 0101 1011 0000 par 10011, résultat : 1110 (c'est le FCS pour Frame Control Sequence, nommé par abus de langage CRC). Enfin on applique un XOR entre le mot d'entrée (décalé de 4 rang) et le reste de la division, 11 0101 1011 0000 XOR 1110 = 11 0101 1011 1110, ce qui correspond bien au mot de départ «suivi» du CRC. 5/9

On transfert cette trame. Si on la récupère telle quelle, on obtient 11 0101 1011 1110. On divise ceci par 10011, et on trouve un reste nul, le transfert s'est donc correctement déroulé, aucune perte de données n'est à déplorer. 6/9

4 Implémentation en C Voici une implémentation en langage C du problème. On trouve 3 fonctions : int get_code_crc(int mot, int polynome_generateur) qui renvoie le mot passé en paramètre suivit de son CRC a partir du polynôme générateur (en hexadécimal). int reste_division_ou_exclusif(int dividende, int diviseur) qui renvoie le reste de la division du dividende par le diviseur. int degre_int(int mot) qui renvoie le degré d'un mot binaire (max 32 bits). //----------------------------------------------------------------------------- // Recupere le nombre de bit (degre) d'un mot (short int) int degre_int(int mot) int degre = 0; int i = 0; for (i = 0; i < (sizeof(int)*8); i++) if ((mot & 0x0001) == 1) degre = i+1; mot = mot >> 1; return degre; //----------------------------------------------------------------------------- // Donne le reste de la division entre 2 nombre binaire (division utilisant // les OU exclusifs) int reste_division_ou_exclusif(int dividende, int diviseur) int i = 0; int tdividende = 0; int tdiviseur = 0; int div_interm = 0; // diviseur intermedaire int reste = 0; // recherche des degres des operandes tdividende = degre_int(dividende); tdiviseur = degre_int(diviseur); // recherche du reste de la division div_interm = diviseur; reste = dividende >> (tdividende - tdiviseur); for (i = (tdividende - tdiviseur+1); i > 0; i--) reste = reste ^ div_interm; if (i > 1) reste = reste << 1; reste = reste ((dividende >> (i-2)) & 0x0001); if (((reste >> (tdiviseur-1)) & 0x0001) == 0) div_interm = 0; else div_interm = diviseur; return reste; 7/9

//----------------------------------------------------------------------------- // A partir d'un mot binaire (short int), renvoie ce mot suivit de son CRC // defini par un polynome generateur (ex : 0x15 = X4 + X2 + 1) int get_code_crc(int mot, int polynome_generateur) int crc = 0; // decaler le mot vers la gauche du degre-1 du polynome generateur mot = mot << (degre_int(polynome_generateur)-1); // chercher le reste de la division entre le mot et le polynome generateur crc = reste_division_ou_exclusif(mot, polynome_generateur); // concatenation du mot et du polynome generateur mot = mot ^ crc; return mot; En reprenant l'exemple précédent, voici comment utiliser ce programme : int main (int argc, char *argv[]) int code = get_code_crc(0x35b, 0x15); printf("code + crc : %X \n", code); return 0; 8/9

5 Références Le contrôle CRC, un article de Sylvain Nahas http://docs.sylvain-nahas.com/crc.html Le pseudo code de la recherche d'un CRC (en anglais) http://www.ibrtses.com/delphi/dcrc.html AMS Standard Cyclic Redundancy Check - CRC16 -Status: Baseline http://ams.cern.ch/ams/dataformats/node26.html 9/9