Autor Tema: Midiendo tiempo de escritura en uSD card  (Leído 1318 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Midiendo tiempo de escritura en uSD card
« en: 24 de Enero de 2016, 23:44:07 »
Hola, estoy realizando un datalogger, el cual lee continuamente datos por el puerto serie y los graba en una micro SD card.
Estoy queriendo ver los tiempos de escritura en el SD ya que si quiero recivir datos a 115200 bps tengo que poder almacenar a, más o menos, 100kbyte/seg por lo menos.

El micro en cuestion es un lpc11u67 M0+ a 48MHz. La uSD está en modo SPI, éste corre a 24MHz (tengo que medirlo para estar seguro). El sistema de archivos el FatFS de Chan (http://elm-chan.org/fsw/ff/00index_e.html). El punto que leí y más me interesó es que la velocidad de escritura aumenta con la cantidad de bytes escritos en una sola operacion. Por lo tanto hice las pruebas con buffer de 128, 256, 512, 1024 y 2048 bytes.
La prueba fue mas o menos así: El uC espera tantos bytes como el tamaño del buffer. Cuando los recibe desbloquea al micro y este manda a escribir los datos. Para medir el tiempo uso el systicktimer. Entonces en el terminal pongo a enviar un archivo de unas decenas de KB y almaceno en un array el tiempo consumido por la llamada a la funcion f_write.
Obtuve algo como esto (la primer columna es el tamaño del buffer, la segunda la cantidad de ticks medidos...):
Código: C
  1. El systickestá en 1 por lo que tenemos 48Mhz -> 0,02083 useg
  2.  
  3. 128     7593        168 useg    1,23 useg/byte  793 KB/seg
  4. 256     10794       225 useg    0,87 useg/byte  1112 KB/seg
  5. 512     127465      2655 useg   5,18 useg/byte  188 KB/seg
  6. 1024    433861      9038 useg   8,82 useg/byte  110 KB/seg
  7. 2048    812201      16920 useg  8,26 useg/byte  118 KB/seg
  8.  

como ven pareciera que el tamaño optimo es de 256bytes. Pero me sorprende mucho que haya tanta diferencia con bufferes más grandes...
Alguien probó algo de esto o hiso mediciones de este tipo? es lógico lo que obtengo?

Saludos!
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7817
Re:Midiendo tiempo de escritura en uSD card
« Respuesta #1 en: 25 de Enero de 2016, 19:24:38 »
Creo que tambien tendra que ver como la tarjeta tenga realizado el formato FAT y el tamaño de sectores. Nunca lo probe pero estaria bueno poder llegar a diferencia lo que es tiempo de enviado de datos, y tiempo de enviado de valores de control, como decirle el sector entre otros.

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Midiendo tiempo de escritura en uSD card
« Respuesta #2 en: 25 de Enero de 2016, 19:34:15 »
Lo que tambien estoy viendo es la implementacion de la escritura múltiple. en mi arcchivo mmc.c (que no es parte de lo que chan entrega) tengo esto:

Código: C
  1. /*-----------------------------------------------------------------------*
  2.  * Send a data packet to the card
  3.  * 1:OK
  4.  * 0:Failed
  5.  *
  6.  * const BYTE *buff             512 byte data block to be transmitted
  7.  * BYTE token                   Data/Stop token
  8.  *-----------------------------------------------------------------------*/
  9. static int xmit_datablock (const BYTE *buff, BYTE token) {
  10.         BYTE d[2];
  11.  
  12.  
  13.         if (!wait_ready()) return 0;
  14.  
  15.         d[0] = token;
  16.         xmit_mmc(d, 1);                         /* Xmit a token */
  17.         if (token != 0xFD) {            /* Is it data token? */
  18.                 xmit_mmc(buff, 512);    /* Xmit the 512 byte data block to MMC */
  19.                 rcvr_mmc(d, 2);                 /* Xmit dummy CRC (0xFF,0xFF) */
  20.                 rcvr_mmc(d, 1);                 /* Receive data response */
  21.                 if ((d[0] & 0x1F) != 0x05)      /* If not accepted, return with error */
  22.                         return 0;
  23.         }
  24.  
  25.         return 1;
  26. }
  27.  

entonces por más que cree un buffer de 1024 bytes, a la SD se le envían de a 512.
hay una parte de la appnote de Chan que dice:

Código: [Seleccionar]
Therefore the application program should write the data in large block as possible. The ideal write chunk size and alighment is size of sector, and size of cluster is the best.[b] Of course all layers between the application and the storage device must have consideration on multiple sector write[/b], however most of open-source memory card drivers lack it.

Voy a probar a ver que pasa si hago algún cambio en esa rutina que escrive un bloque.

saludos
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7817
Re:Midiendo tiempo de escritura en uSD card
« Respuesta #3 en: 25 de Enero de 2016, 19:50:05 »
Por eso te decia... podrias probar tambien formatear la SD con otro tamaño de bloque

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Midiendo tiempo de escritura en uSD card
« Respuesta #4 en: 25 de Enero de 2016, 20:15:59 »
aaaa, ,ahora terminé de comprenderte! jejej
alguna aplicacion que permita cambiar tamaño de bloque?
voy a buscar a ver que encuentro.

sds!
-
Leonardo Garberoglio

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7817
Re:Midiendo tiempo de escritura en uSD card
« Respuesta #5 en: 25 de Enero de 2016, 21:27:48 »
El mismo windows ?


Desconectado vixctor

  • PIC16
  • ***
  • Mensajes: 105
Re:Midiendo tiempo de escritura en uSD card
« Respuesta #6 en: 25 de Enero de 2016, 23:57:29 »
Hola  elgarbe y KILKERJC:

Me gustaría aportar algunas cuestiones sobre la escritura en tarjetas SD:

1.- El tamaño de bloques de la tarjeta es SIEMPRE de 512 bytes, SIEMPRE, lo que veo es que están confundiendo bloques con CLUSTERS, en donde los clusters son parte del manejo de datos en FAT y su tamaño si puede ser variable pero en una tarjeta SD o SDHC el tamaño de bloque siempre se maneja com 512 bytes, que es lo que mide una pagina de memoria...

2.- La velocidad de escritura incrementa conforme se escriban más bloques (consecutivos) de 512 bytes en la memoria SD, solo que previo a escribir los datos, se le debe de mandar a la tarjeta SD el comando para escritura continua, no de bloque simple.
Acá en éste punto quiero añadir lo que encontré después de un buen tiempo investigando el asunto:

Cada memoria SD tiene un buffer interno de datos que es usado para almacenar los datos temporalmente y luego transferirlos a las celdas de memoria flash internas, pero el tamaño de ese bloque, está determinado por la marca y la calidad de la tarjeta, siendo que por ejemplo las memorias Kingston tienen bloques de 1024 a lo mucho mientras que las adata de 2048 bytes, las mejores memorias que he probado son las sandisk que suelen tener 4096 bytes internos de buffer, luego entonces, las pruebas que se han realizado deben de ser examinadas usando diferentes marcas y velocidades de escritura...

Como información personal:  Yo realice un proyecto en el cual grababa audio en formato MP3 desde una entrada de linea, en donde podia seleccionar desde 96 kbs hasta 320 kbs, los resultados que obtuve fueron los siguientes:

Nota: Todas las pruebas las realice utilizando el tamaño mínimo de bloque de escritura de 512 bytes...

               Kingston   Adata   Sandisk
  96 Kbs     Si             Si         Si
128 kbs     No            Si         Si
192 kbs     No            Si         Si
256 kbs     No            Si         Si
320 kbs     No            No        Si

De hecho me daba cuenta de la calidad de los datos porque obviamente el archivo al ser reproducido después de ser grabado tenia sobresaltos o errores al reproducirlo.

Mi conclusión fue que las mejores tarjetas son las sandisk y en segundo lugar las adata, buscando en la red me encontré un articulo interesante, déjenme ver si lo hallo en mis favoritos...

El primer articulo interesante: http://www.bunniestudios.com/blog/?p=3554

El segundo articulo interesante: http://www.bunniestudios.com/blog/?page_id=1022

Ahora, no es que las memorias kingston apesten, pero son tan populares y baratas que existen muchísimos clones en el mercado, tengo un lote de mas de 20 tarjetas de diferentes marcas y por ejemplo, 6 memorias kingston de la misma capacidad y velocidad (clase 4) y solo 2 de ellas funcionan ok, 4 de las 6 tarjetas no dan el ancho y aparentemente son clones chinos...

De hecho al final del día he logrado hacer transferencias de 1 megabyte / segundo en escritura, pero solo con la tarjeta adecuada, clase adecuada...

Saludos

Victor

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 7817
Re:Midiendo tiempo de escritura en uSD card
« Respuesta #7 en: 26 de Enero de 2016, 00:54:27 »
Gracias por los datos ya la aclaracion vixctor

Desconectado elgarbe

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 2178
Re:Midiendo tiempo de escritura en uSD card
« Respuesta #8 en: 26 de Enero de 2016, 08:07:54 »
Muchas gracias vixtor! muy buenos datos.

Voy a seguir con las pruebas, pero en mi caso lo que necesito es la mínima velocidad con la que me puedo encontrar ya que de eso puede depender la velocidad máxima de los datos que entran por el puerto serie...

Saludos!
-
Leonardo Garberoglio


 

anything