- Start -
- 16 BYTES OLD WRITE -
Byte 0: 4205 uS
Byte 1: 4206 uS
Byte 2: 4206 uS
Byte 3: 4205 uS
Byte 4: 4205 uS
Byte 5: 4206 uS
Byte 6: 4206 uS
Byte 7: 4205 uS
Byte 8: 4205 uS
Byte 9: 4206 uS
Byte 10: 4206 uS
Byte 11: 4205 uS
Byte 12: 4205 uS
Byte 13: 4206 uS
Byte 14: 4206 uS
Byte 15: 4204 uS
TOTAL: 0 Sec 68 mS 478 uS
- 16 BYTES NEW WRITE -
Byte 0: 190 uS
Byte 1: 4022 uS
Byte 2: 4022 uS
Byte 3: 4022 uS
Byte 4: 4022 uS
Byte 5: 4021 uS
Byte 6: 4021 uS
Byte 7: 4022 uS
Byte 8: 4022 uS
Byte 9: 4022 uS
Byte 10: 4022 uS
Byte 11: 4022 uS
Byte 12: 4022 uS
Byte 13: 4021 uS
Byte 14: 4021 uS
Byte 15: 4022 uS
TOTAL: 0 Sec 61 mS 707 uS
- 16 PAGES WRITE (128 bytes/page) -
Page 0: 4119 uS
Page 1: 7951 uS
Page 2: 7951 uS
Page 3: 7951 uS
Page 4: 7951 uS
Page 5: 7951 uS
Page 6: 7951 uS
Page 7: 7951 uS
Page 8: 7958 uS
Page 9: 7953 uS
Page 10: 7953 uS
Page 11: 7952 uS
Page 12: 7953 uS
Page 13: 7953 uS
Page 14: 7953 uS
Page 15: 7952 uS
TOTAL: 0 Sec 124 mS 616 uS
- FULL EEPROM WRITE -
TOTAL: 4 Sec 149 mS 403 uS
Para ser honesto, como nadie ha usado este enfoque,
Para ser honesto, como nadie ha usado este enfoqueMe referia a que en EEPROM I2C no he visto esta tecnica. Ni en las librerias EEPROM de CCS, ni librerias de Arduino, ni librerias publicadas en diferentes foros y paginas web, ni en los datasheets de cada tipo de memoria, ni siquiera en los App notes de Microchip, donde hablan de como mejorar las velocidades de escritura.
Considero que si uno quisiera realmente implementar una buena libreria EEPROM y no perder tiempo destinado a esperar, deberia incluir:Concuerdo que todo lo que comentas mejoraria mucho los tiempos muertos, pero tambien complicaria mucho su uso y requeriria mucha memoria para implementarlo. En micros de baja gama se va la ROM en cuatro tonterias. Prefiero sacrificar tiempo pero usar menos ROM.
- Wear levelling
- Buffer de escritura y Buffer de Lectura.
- Totalmente "asincrono", con interrupciones y no esperando si la EEPROM esta ocupada.
Y tambien importante, de nada sirve todo esto, si vas a leer la EEPROM y vas a esperar hasta que termine de ser leída. Lo cual únicamente serviría para la escritura. Como la mayoría se dedica a leer cuando lo necesita y no puede avanzar hasta que no este el dato, es por eso que Microchip provee esa salida nomas, ya que requiere un esfuerzo extra por parte del programador para programarlo de forma distinta.Para la EEPROM la lectura se podria decir que es "inmediata". Una vez que se le envio la posicion a leer, la memoria responde con el valor en 9 ciclos de reloj del bus por cada byte, mas un ciclo extra para el "stop bit". Esto, a 400Khz, se traduce en ~25uS de lectura, que si bien podriamos hacer otras cosas en ese tiempo, para un micro trabajando a 16Mhz por ejemplo (lo minimo para bus de 400Khz), serian unas 100 instrucciones. Da tiempo para hacer cosas, pero tambien se sale del foco llegar a ese nivel de optimizacion. Ni hablar si tenemos un micro de 4Mhz, en los cuales "solo ahorrariamos" unas 25 instrucciones, ya que el bus es de 100Khz.
Respecto a la libreria, no se si es la vista de simular un OOP en C, es conocido que los DEFINE son malos, una plaga :P, entonces una solución a esto seria crear una estructura inicial y ahí definir el tipo de memoria, y luego de acuerdo a la memoria que uses, lo manejas con switch cases si es que no podes resumirlo en una formula.He leido en varias ocasiones lo de que los define son malos, pero quizas sea por costumbre, o porque aun no me he encontrado con ningun inconveniente a la hora de usarlos, ahi siguen siendome de gran ayuda. Tambien he visto mucho codigo que utiliza variables para valores constantes y definibles, lo que me parece un desperdicio de recursos.