Tengo una aplicación de software integrada que copia un búfer de la RAM a la EEPROM. En este caso, el dispositivo EPROM es un 28C010 (128K x 8). La copia se realiza a intervalos no regulares, generalmente en bloques de varios bytes. Asumiría que otras EEPROM (no todas) se comportan como esta, pero esto es con lo que tengo que trabajar.
Las respuestas a mis preguntas a continuación ayudarán a determinar la estrategia para guardar información persistente mientras se realiza el procesamiento en tiempo real.
Se puede acceder a la EEPROM al igual que la RAM con algunas excepciones para escribir:
En ambos casos, el sondeo se realiza leyendo el último byte escrito hasta que el valor devuelto sea igual al valor que se escribió.
Hay otras formas de determinar que una escritura está completa, incluso esperar el tiempo de ciclo de escritura de página máximo especificado, que es de 10 milisegundos.
Tengo la intención de utilizar el sondeo, con la expectativa de que determinará la finalización antes de los 10 milisegundos del ciclo de escritura de página.
Tengo dos preguntas:
Dado que la EEPROM completa internamente las escrituras de página en la EEPROM después de la última escritura en una página, puedo realizar las escrituras en segundo plano en la mayoría de las circunstancias.
El tamaño de los bloques que se copian variará un poco cada vez y no se puede esperar que sean múltiplos del tamaño de la página. Se pueden hacer para que sean tan pequeños como poco más de un tamaño de página o más de varias páginas, según un umbral que se determinará más adelante.
Lo que describes es típico de los chips EEPROM. El número mínimo de bytes que tiene que borrar a la vez, el máximo que puede escribir a la vez y el mínimo que puede escribir a la vez pueden ser diferentes.
La forma en que generalmente trato con esto es tener un módulo que virtualice lecturas y escrituras en la EEPROM. Este módulo presenta una interfaz de procedimiento para leer y escribir bytes individuales.
Por cierto, es una buena idea que este módulo use una dirección más amplia que la que realmente requiere la EEPROM. No es nada raro que los proyectos evolucionen y reemplacen el chip EEPROM por uno más grande más tarde. Si solo usó una dirección de 16 bits y pasó de 64 kB a una EEPROM más grande, debe verificar y posiblemente reescribir un montón de código de la aplicación que ahora tiene que usar al menos 3 bytes de dirección cuando se escribió para 2. Por lo general, uso Para empezar, direcciones de 24 bits en una máquina de 8 bits y direcciones de 32 bits en una máquina de 16 bits, a menos que exista una buena razón específica del proyecto para no hacerlo. Eso también le permite crear módulos para varias EEPROM diferentes que presentan la misma interfaz de procedimiento de lectura/escritura de un solo byte.
De todos modos, el módulo EEPROM mantiene un búfer RAM de una página de borrado (normalmente son más grandes o del mismo tamaño que las páginas de escritura). El módulo realiza un seguimiento de qué bloque de EEPROM, si lo hay, se encuentra actualmente en el búfer de RAM y si se han realizado cambios (bandera sucia) que aún no se han escrito en la EEPROM física. Las lecturas y escrituras de la aplicación funcionan en este búfer de RAM y no necesariamente provocan la lectura/escritura directamente en la EEPROM. Se proporciona una rutina FLUSH para que la aplicación pueda obligar a que los datos almacenados en caché se escriban en la EEPROM. En algunos casos, usé un temporizador para llamar a la rutina de descarga automáticamente en un tiempo fijo después de la última escritura.
Cuando la aplicación accede a un byte que no está en el búfer de RAM, primero se lee el bloque que contiene el byte de la EEPROM. Si el búfer está sucio, siempre se vacía antes de que se escriba un bloque EEPROM diferente.
Este esquema es generalmente más rápido y también minimiza el número real de escrituras en la EEPROM. El indicador sucio solo se establece si los datos nuevos son diferentes de los datos antiguos. Si la aplicación escribe los mismos datos varias veces, la EEPROM se escribe como máximo una vez.
Este esquema también usa la EEPROM de manera más eficiente ya que los bloques completos se borran y escriben a la vez. Esto se hace una vez por bloque, independientemente de cuánta actividad de escritura haya dentro del bloque antes de que la aplicación aborde un byte en un bloque diferente. Para la mayoría de las EEPROM, escribir un bloque completo o escribir un byte dentro de un bloque cuentan lo mismo en términos de vida útil. Para maximizar la vida útil de la EEPROM, desea escribir con la menor frecuencia posible y borrar y escribir bloques completos cuando lo haga.
En algunos diseños de chips, el tiempo de escritura de páginas será esencialmente el mismo que el tiempo de escritura de bytes, ya que un chip que puede estar organizado como 128Kx8 externamente puede ser 1024x1024 internamente y, por lo tanto, tener una matriz EEPROM que puede escribir hasta 1024 bits. (128 bytes) a la vez. En otros diseños de chips, cada escritura de página se realizará como una secuencia de operaciones más pequeñas (posiblemente escrituras de bytes individuales), pero el rendimiento aún puede ser más rápido que escribir bytes individuales si los chips usan bombas de carga para suministrar corriente de escritura; a menudo, tales bombas de carga deben encenderse antes de cada operación de escritura y apagarse después; si un chip tarda, por ejemplo, 1 ms en encenderse y 1 ms en escribir un byte, escribir un byte tardaría 2 ms,
En general, espero que escribir muchos bytes en una página lleve más tiempo que escribir uno, pero será mucho más rápido que escribir todos esos bytes individualmente. Incluso en un chip que tiene un bus de ancho completo entre los búferes de página y la matriz de memoria, es posible que la bomba de carga no pueda suministrar suficiente corriente para escribir 1024 bits tan rápido como podría escribir uno. Además, algunos chips pueden incluir circuitos de enclavamiento para limitar el número de escrituras de bits simultáneas; cada vez que se completa una escritura de bits, el chip podría pasar a procesar otra que aún no se había iniciado.
Ignacio Vázquez-Abrams
Jim