|  | 

emFile RAID 1


RAID 1 – Teoria del funzionamento

Il RAID 1 utilizza il “mirroring” per consentire il recupero dei dati. Una copia di tutti i dati presenti sulla partizione master viene mantenuta su una partizione separata chiamata mirror. Il master e il mirror possono risiedere sullo stesso dispositivo di memorizzazione o su dispositivi separati. In caso di difetto hardware o guasto sulla partizione master, i dati possono essere recuperati dalla partizione mirror.

  • Scrittura: Su una richiesta di scrittura del file system, i dati del settore vengono scritti contemporaneamente sia sul master che sul mirror.
  • Lettura: Su una richiesta di lettura, l’add-on RAID 1 legge i dati dal master. In caso di errore di lettura, i dati vengono prelevati dalla partizione mirror. Il dato viene così recuperato e non viene segnalato alcun errore al file system.

Il RAID 1 può essere configurato per archiviare i dati su un unico dispositivo o su due distinti. Se si utilizza un singolo dispositivo, la prima metà viene usata come partizione master. Quando si usano due dispositivi diversi, le dimensioni dei volumi non devono necessariamente corrispondere: il numero di settori disponibili per il file system sarà pari a quello del dispositivo più piccolo. È tuttavia richiesto che la dimensione del settore sia identica per entrambi i dispositivi.


Recupero errori NAND flash

Il driver Universal NAND può utilizzare l’add-on RAID 1 per evitare la perdita di dati quando si verifica un errore di bit non correggibile durante un’operazione di lettura. In questo caso, il driver richiede all’add-on RAID 1 di fornire i dati del settore corretti dalla partizione mirror. Questa procedura si applica sia alle richieste di lettura provenienti dal file system, sia alle operazioni di lettura interne eseguite dal driver Universal NAND (ad esempio quando i dati di un blocco NAND vengono copiati in un’altra posizione).


Sincronizzazione dei settori

Un reset imprevisto che interrompe un’operazione di scrittura può portare a un’incoerenza dei dati. È possibile che i dati dell’ultimo settore scritto siano memorizzati solo sul master e non sul mirror. Dopo il riavvio, il file system continuerà a funzionare correttamente, ma in caso di un errore di lettura che colpisca esattamente quel settore, verrebbero letti dati obsoleti dal mirror, causando una corruzione dei dati.

Questa situazione può essere evitata sincronizzando tutti i settori del volume RAID. L’applicazione può eseguire la sincronizzazione chiamando la funzione API FS_STORAGE_SyncSectors(). Ad esempio, un task a bassa priorità può chiamare questa funzione in parallelo ad altre attività del file system.


Esempio di configurazione

Il seguente frammento di codice mostra come configurare l’add-on RAID per utilizzare due dispositivi di memoria NAND rispettivamente come partizione master e mirror.

/*********************************************************************
*
* Definizioni configurabili
*
**********************************************************************
*/
#define ALLOC_SIZE      0x8000              // Dimensione del memory pool in byte

/*********************************************************************
*
* Dati statici
*
**********************************************************************
*/
static U32 _aMemBlock[ALLOC_SIZE / 4];      // Pool di memoria usato per 
                                            // l'allocazione semi-dinamica.

/*********************************************************************
*
* FS_X_AddDevices
*
* Descrizione funzione
* Questa funzione viene chiamata dal file system durante FS_Init().
* Serve ad aggiungere tutti i dispositivi, usando principalmente FS_AddDevice().
*/
void FS_X_AddDevices(void) {
  //
  // Fornisce memoria al file system per il suo funzionamento.
  //
  FS_AssignMemory(&_aMemBlock[0], sizeof(_aMemBlock));
  
  //
  // Imposta la dimensione massima del settore del file system.
  //
  FS_SetMaxSectorSize(2048);
  
  //
  // Aggiunge e configura il driver NAND per lo storage master (Indice 0).
  //
  FS_AddDevice(&FS_NAND_UNI_Driver);
  FS_NAND_UNI_SetPhyType(0, &FS_NAND_PHY_ONFI);
  FS_NAND_UNI_SetECCHook(0, &FS_NAND_ECC_HW_NULL);
  
  //
  // Aggiunge e configura il driver NAND per lo storage mirror (Indice 1).
  //
  FS_AddDevice(&FS_NAND_UNI_Driver);
  FS_NAND_UNI_SetPhyType(1, &FS_NAND_PHY_ONFI);
  FS_NAND_UNI_SetECCHook(1, &FS_NAND_ECC_HW_NULL);
  
  //
  // Aggiunge e configura il driver RAID.
  // I parametri indicano: (Unità RAID, Driver Master, Indice Master, Driver Mirror, Indice Mirror).
  //
  FS_AddDevice(&FS_RAID1_Driver);
  FS_RAID1_Configure(0, &FS_NAND_UNI_Driver, 0, &FS_NAND_UNI_Driver, 1);
}

Articoli simili

  •  |  | 

    Segger embOS

    Panoramica embOS è una famiglia di sistemi operativi in tempo reale (RTOS) progettata come base per lo sviluppo di applicazioni embedded. Giunto al suo quarto decennio di utilizzo e perfezionamento continuo, embOS offre l’affidabilità e le prestazioni che sostengono il firmware di ogni SEGGER Flasher, J-Link e J-Trace. Distribuito in miliardi di dispositivi in un’ampia…

  • Segger emFile

    PanoramicaemFile è un file system che consente alle applicazioni e ai sistemi embedded di archiviare dati in modo sicuro e affidabile su ogni tipo di dispositivo di memoria. Essendo indipendente rispetto all’hardware, può essere eseguito su qualsiasi target a 16, 32 o 64 bit per il quale sia disponibile un compilatore; inoltre, è supportata la…

  •  |  | 

    Segger emRun++

    emRun++ è una libreria standard C++ completa, utilizzabile con qualsiasi toolchain. È stata specificamente ottimizzata per sistemi e applicazioni embedded. In quanto linguaggio di programmazione moderno, il C++ sta diventando sempre più importante nel settore embedded, offrendo agli sviluppatori opzioni sempre più vaste. Con questo obiettivo, emRun++ viene costantemente aggiornata per soddisfare i più moderni…

  •  |  | 

    Segger emCompress

    La riduzione delle dimensioni dei dati per l’archiviazione e il trasferimento è estremamente preziosa nei sistemi embedded. Una dimensione di archiviazione ridotta minimizza la complessità e i costi dei sistemi mantenendo bassi i requisiti di memoria. Una dimensione di trasferimento ridotta permette di superare i limiti della larghezza di banda disponibile per l’invio e la…

  •  | 

    Flasher Hub-4

    Versione compatta del Flasher Hub-12, il Flasher Hub-4 controlla più unità Flasher Compact per consentire la programmazione simultanea. È possibile collegare fino a 24 Flasher utilizzando uno o più moduli SEGGER USB Hub-7 per creare un potente programmatore “gang” (multiplo) per una programmazione parallela efficiente ad alto volume. Il Flasher Hub-4 di SEGGER gestisce diverse…

  •  | 

    Flasher Hub-12

    Fratello maggiore del Flasher Hub-4, il Flasher Hub-12 controlla fino a 24 unità Flasher Compact, che operano come canali individuali per la programmazione multipla (“gang”) parallela ad alta velocità. Ogni canale può essere configurato per programmare un dispositivo diverso o un’immagine firmware differente. Il sistema combinato Flasher Hub-12 e Flasher Compact viene configurato una sola…