En primer lugar, la gestión de bloques:
Ponga una pequeña cabecera al comienzo de cada bloque. Lo principal que necesita para realizar un seguimiento de los "más antiguos" y "más nuevos" es un número de bloque, que simplemente incrementa el módulo k. k debe ser mayor que su número total de bloques. Idealmente, haga que k sea menor que su valor MAX (por ejemplo, 0xFFFF) para que pueda ver fácilmente qué es un bloque borrado.
En el arranque, el código lee las cabeceras de cada bloque a su vez, y localiza la primera y última bloques en la secuencia que es n i + 1 = (n i + 1) módulo k. Tenga cuidado de no confundirse con los bloques borrados (el número de bloque es, por ejemplo, 0xFFFF) o los datos que de alguna manera están dañados (por ejemplo, borrado incompleto).
Dentro de cada bloque
Cada bloque comienza inicialmente vacío (cada byte es 0xFF). Cada registro se escribe simplemente uno después del otro. Si tiene registros de tamaño fijo, puede acceder a él con un índice simple. Si tiene registros de tamaño variable, entonces para leerlos debe escanear desde el inicio del bloque, estilo de lista vinculada.
Si desea tener registros de tamaño variable, pero evite el escaneo lineal, entonces podría tener un encabezado bien definido en cada registro. P.ej. use 0 como delimitador de registro y COBS -encode (o COBS/R -encode) cada registro. O use un byte de su elección como delimitador, y 'escape' ese byte si ocurre en cada registro (similar al PPP protocol).
En la puesta en marcha, una vez que conoce su último bloque, puede hacer un escaneo lineal para el último registro. O si tiene registros de tamaño fijo o delimitadores de registros, podría hacer una búsqueda binaria.
Borrar programación
Para algunos chips de memoria flash, borrando un bloque puede tomar mucho tiempo - por ejemplo. 5 segundos. Considere programar un borrado como una tarea en segundo plano un poco "adelantado". P.ej. cuando el bloque actual está x% lleno, entonces comience a borrar el siguiente bloque.
registro de numeración
es posible que desee los registros de número. La forma en que lo hice en el pasado es poner, en el encabezado de cada bloque, el número de registro del primer registro. Luego, el software debe mantener el recuento de los números de cada registro dentro del bloque.
suma de comprobación o CRC
Si desea detectar datos corruptos (por ejemplo incompleta escribe o borra debido a la falta de energía inesperada), a continuación, se puede añadir una suma de comprobación o CRC para cada registro, y quizás al bloque encabezamiento. Tenga en cuenta que el encabezado del bloque CRC solo cubriría el encabezado en sí, no los registros, ya que no podría volver a escribirse cuando se escribe cada nuevo registro.
I estoy confundido por tu lenguaje Un buffer, en mi mente, es una pieza rápida y volátil de memoria que cambia a menudo. Como bien lo señala, la memoria flash podría tener algunos problemas con eso. ¿Puedes proporcionar un poco más de contexto o detalle sobre qué es lo que estás tratando de hacer y por qué? – Mikeb
Quiero guardar datos en la memoria no volátil. La memoria no volátil que tengo es flash. No volátil es importante porque el producto se puede apagar por un período de tiempo y no quiero perder los datos. Cuando se vuelve a encender, debe colocar la siguiente pieza de datos después de la última. – Robert