Hm, mi sospecha habitual sería que su acceso de lectura pasa por un sistema de archivos y que actualiza algo, por ejemplo un tiempo de acceso al archivo, en el sistema de archivos, pero no parece ser el caso aquí.
Lo siguiente que supongo: Estás experimentando Leer más La lectura de la misma celda una y otra vez carga las celdas de memoria vecinas ligeramente cada vez, o la consecuencia de que el controlador de la memoria flash lo evite:
Probablemente sepas que entre la interfaz de tu tarjeta SD y las cargas físicas aisladas de la puerta de tu flash NAND, hay múltiples capas de abstracción:
- Hay una tabla de mayor fiabilidad que mapea las direcciones de bloque "externas" a las internas, de modo que para proporcionar nivelación del desgaste es decir, evitar escribir en un solo bloque hasta que falle
- Hay (en muchos casos) cantidades abundantes de códigos de corrección de errores (ECC): La memoria flash es barata. No se pueden fabricar mil millones de MOSFET de tamaño nanométrico sin tener un par de ellos menos fiables. Además, en el caso de las memorias multinivel, hay más de un bit almacenado en el valor de la carga de la puerta, por lo que también hay un límite "suave" sobre qué significa qué. Tendrás que añadir un algoritmo que tome las cosas en bruto almacenadas en las celdas de la memoria flash, compruebe si parece correcto y, si no lo es, lo corrija. Ese es el trabajo de ECC, y normalmente, leer sólo las celdas "buenas" es mucho más rápido que corregir los datos "parcialmente erróneos".
- Los tamaños de las palabras en la memoria no coinciden necesariamente con los tamaños de las palabras en el bus externo (SPI/MMC/xSD, lo que sea), así que a menudo hay alguna operación de "obtener más e ignorar todo lo que no se pidió" o "obtener múltiples y ensamblar lo que se pidió".
y, aquí:
- Para evitar la carga de las celdas vecinas a través de la perturbación de la lectura, el controlador toma las celdas de lectura frecuente y las redistribuye después de un número umbral de lecturas. Esta redistribución lleva tiempo.
Si lees las mismas celdas con CMD17 (que seguramente será muy poco óptimo en términos de 3., ¿usar CMD18 tal vez?) suena mucho a que estás corrompiendo a sus vecinos (lo que lleva a un aumento del tiempo en 2.) o a que estás llevando a cabo un copioso re-mapeo de bloques (en 4.).
Estoy un poco sorprendido: la lectura de audio parece una operación de bajo rendimiento, en comparación con, por ejemplo, la lectura de las fotos de la cámara, pero si su patrón de acceso es muy ineficiente, por ejemplo, usted lee un byte utilizando CMD17; el controlador de la flash tiene que obtener un bloque completo de 2048 B¹, luego corregirlo, tirar todo el byte del resultado menos uno, devolver ese byte a la interfaz SPI, y entonces usted lee otro byte, que requiere que el controlador de la flash lea 2048 B, corrija. . y así sucesivamente, ¡podrías estar haciendo un múltiplo muy alto del acceso de lectura real que crees que estás haciendo! Eso es desafortunado, porque la lectura de audio es probablemente bastante secuencial.
Por lo tanto, mi recomendación es escribir una interfaz de tarjeta SD SPI más inteligente que obtenga bloques largos de datos y los almacene en caché en la RAM de la MCU. Este
- puede erradicar por completo los problemas de latencia aleatoria, ya que se puede empezar a obtener el siguiente bloque grande en cuanto el primero termine de obtenerse a través de SPI, de modo que siempre se disponga de una gran cantidad de búfer de lectura.
- aprovecha mejor el ancho de banda del bus
- permite que el controlador de la memoria flash sólo acceda realmente a las celdas de memoria sin procesar la cantidad necesaria de veces
- convierte una operación que lee una pequeña cantidad de datos a menudo en una operación que lee una gran cantidad de datos raramente, permitiendo que muchas cosas vuelvan a estar en reposo entre ellas, lo que puede ayudar a ahorrar batería
¹Número extraído de una suposición aleatoria, pero el orden de magnitud se ajustaría al tamaño de los códigos de bloque de corrección de errores que yo esperaría en las modernas y baratas memorias NAND.