La flash NAND es más barata, por lo que conviene utilizarla si se puede. El inconveniente es que no es tan fiable. La flash NAND es más rápida en la mayoría de las operaciones, con la notable excepción de las pequeñas lecturas de acceso aleatorio. Si quieres leer un par de bytes de una dirección aleatoria de la memoria, la NOR es más rápida. En cuanto a las lecturas de grandes volúmenes de memoria, la NAND es razonablemente buena y, de hecho, supera a la NOR cuando los volúmenes son lo suficientemente grandes.
La mayoría de los sistemas operativos integrados incluyen código para corregir los errores de la NAND Flash. También hay microcontroladores con corrección de errores por hardware. El verdadero problema se produce en el momento del arranque: los cargadores de arranque de primer nivel no tienen código de corrección de errores y aún no han configurado el controlador de memoria para ejecutar el ECC por hardware. Es un poco el problema del huevo y la gallina: no puedes cargar el código ECC sin errores porque aún no has cargado el código ECC.
Para evitar este problema, algunos fabricantes de memoria especifican una región determinada del chip que está garantizada como libre de errores (los primeros 4 kB, o algo así). Se pone allí un cargador de arranque con ECC por software (como U-boot ), léelo sin errores, y luego úsalo para leer el núcleo de tu SO, corrigiendo los errores a medida que avanzas. También se puede almacenar un gestor de arranque en una flash de serie, y sólo utilizar la flash NAND para cosas grandes como el núcleo del sistema operativo o el sistema de archivos.
He encontrado útil esta nota de aplicación de Atmel: http://www.atmel.com/dyn/resources/prod_documents/doc6255.pdf