Il modulo CRC della famiglia Freescale Flexis AC

In un precedente articolo abbiamo visto i concetti basilari relative al calcolo del CRC (Cyclic Redundancy Check) e la sua importanza nel fornire una protezione contro la corruzione accidentale dei dati. Lo scopo di questo articolo è quello di mostrare come questi concetti siano stati applicati ad una famiglia di microcontrollori commerciali: la famiglia Flexis AC di Freescale.

Se desideri maggiori informazioni su questo prodotto Freescale, invia una richiesta ad Arrow utilizzando il seguente modulo.

Questa famiglia di MCU rappresenta l’ingresso più recente nel Controller Continuum di Freescale, il quale assicura compatibilità hardware pin-to-pin e software tra diversi tipi di processori, da 8- fino a to 32-bit.

Il controllo a ridondanza ciclica (CRC) può essere agevolmente calcolato tramite una procedura software, ed il precedente articolo ha descritto la versione più semplice di questo algoritmo, basata sull’utilizzo di un registro a scorrimento a sinistra e sull’iterazione di una serie di operazioni bit-a-bit di tipo XOR. Questo algoritmo si presta ad una immediata implementazione con un linguaggio di alto livello (come il C, per esempio), richiedendo soltanto poche linee di codice. Le prestazioni, tuttavia, non sono entusiasmanti: esso richiede numerose iterazioni e potrebbe rallentare considerevolmente un processore non particolarmente veloce. Per darvi un’idea, si consideri che l’algoritmo software richiede almeno 700 cicli di bus per processare un singolo byte del messaggio dati. Questo è il motivo per cui, rimanendo a livello software, è stato introdotto un altro algoritmo, basato su una lookup table pre-formattata: quest’ultimo è molto più veloce e può essere portato praticamente su qualunque microcontrollere. Tuttavia, ci siamo concentrati sulla versione “semplice” del calcolo del CRC, perchè, se implementata a livello hardware, diventa molto efficiente e veloce.

La protezione dei dati è un argomento molto importante nei sistemi embedded odierni: enormi quantità di informazioni vengono scambiate ad elevate velocità tra processori e periferiche, oppure vengono immagazzinate su file system su memorie flash; al fine di evitare ogni utilizzo di dati errati o corrotti, è diventato necessario l’utilizzo di un controllo divalidità come il CRC.

Il modulo CRC presente all’interno della famiglia Flexis AC è conforme alle specifiche CRC16-CCITT, basate a loro volta sul seguente polinomio generatore: x16+x12+x5+1. Ciò significa che esso è in grado di rilevare tutti gli errori di tipo singolo, doppio, dispari, e la maggiorparte di quelli multi-bit. Misure di prestazioni eseguite da Freescale hanno mostrato che, sulla MCU MC9S08AC128 della serie Flexis AC con clock a 20 MHz, il calcolo del CRC eseguito a livello software su 128 KB di memoria flash richiede circa 6.7 secondi, mentre lo stesso calcolo eseguito a livello hardware richiede solamente 170 ms: si tratta evidentemente di un miglioramento molto significativo.

Come già descritto nel precedente articolo relativo ai concetti basilari del CRC, ricordiamo che il calcolo del controllo di ridondanza ciclico è derivato dalla matematica relativa a:

  • Divisione tra polinomi
  • Aritmetica modulo 2 – addizione e sottrazione sono eseguite senza prestiti o riporti; ciò significa che esse possono essere eseguite impiegando l’operazione di OR esclusivo (XOR)

Ne consegue che il CRC viene ottenuto dividend oil flusso di byte dati per il polinomio generatore, considerando entrambi come una sequenza ordinata di bit.

L’implementazione del CRC di Flexis AC

L’algoritmo per il calcolo del CRC non è così complicato: fondamentalmente consiste in una serie di operazioni di scorrimento e di OR esclusivo. L’aritmetica modulo due aiuta notevolmente la procedura di calcolo: una divisione viene eseguita tramite operazioni di scorrimento (shift), mentre la sottrazione è eseguita tramite l’operazione di OR esclusivo (XOR). L’implementeazione hardware, perciò, richiederà un registro a scorrimento con un numero di bit uguale al grado del polinomio generatore, più una porta XOR associata ad ogni bit avente un ‘1’ come coefficente nel polinomio generatore. Il modulo CRC di Flexis AC è conforme alle specifiche CRC16-CCITT; ciò significa che il polinomio generatore (con ampiezza W pari a 16) è x16+x12+x5+1, corrispondente al valore esadecimale 0x1021 (per convenzione, il bit più significativo con valore 1 viene omesso nella rappresentazione del polinomio generatore). La figura seguente mostra come l’implementazione hardware del modulo CRC sia stata progettata sulle MCU Flexis AC:

Come indicato nel precedente schema a blocchi, il modulo CRC utilizza solamente due registri, CRCH e CRCL. Quando il calcolo del CRC inizia, un valore di “seme” programmabile viene caricato nel registro CRCH:L; lo standard previsto da CRC16-CCITT, per esempio, utilizza un valore di seme pari a 0xFFFF. Una volta caricato il valore di seme, l’algoritmo può proseguire nel modo seguente. Ciascun byte del messaggio viene caricato nel registro CRCL; ciò sincronizza il modulo CRC che carica ciascun byte (partendo da quello più significativo) nel registro a scorrimento, e la procedura deve essere ripetuta fino a quando tutti i byte sono stati processati. A questo punto, il registro CRCH:L contiene il CRC calcolato. Un nuovo calcolo può essere eseguito scrivendo un nuovo seme nel registro CRCH:L. Possono essere utilizzati altri valori di seme; il valore 0xFFFF è quello conforme allo standard CRC16-CCITT, ma altri valori comunemente utilizzati sono 0x102D e 0x0000.

Riferimenti

Freescale AN3795 – Using the CRC Module on the Flexis AC Family
Questo Application Note fornisce una spiegazione dettagliata del modulo CRC della famiglia Flexis AC, incluso un esempio completo di codice scritto in linguaggio C.

RICHIESTA DI CONTATTO
Se desideri maggiori informazioni su questo prodotto Freescale, invia una richiesta ad Arrow utilizzando il seguente modulo.

Scarica subito una copia gratis

Scrivi un commento

Seguici anche sul tuo Social Network preferito!

Send this to a friend