Esto no es complicado de hacer.
Básicamente lo que necesitas es una constante variable global que se coloca en flash y definir la ubicación mediante un pragma.
En C++ la cabecera podría ser algo como esto:
class FlashLookUpTable
{
public:
struct LookUpTable_t
{
uint32_t table[100];
};
public:
static LookUpTable_t const * GetLookUpTablePointer();
private:
static const uint32_t FLASH_PAGE_SIZE = 1024U; // or whatever the flash smallest deletable size is
// This variable contains the number of bytes needed to store the structure in complete flash pages
static const uint32_t ARRAY_SIZE = (sizeof(LookUpTable_t)/FLASH_PAGE_SIZE) + FLASH_PAGE_SIZE;
union FlashPageSizedStructure
{
LookUpTable_t t;
uint8_t flashpage[ARRAY_SIZE];
}
static const FlashPageSizedStructure tableInFlash;
};
Y esto es cómo la aplicación se ve:
// the exact pragma depends on the compiler used, this one works for IAR
// the location should be at the start of a page boundary, especially when using this union approach
#pragma location=0x800FC00U
const FlashLookUpTable::FlashPageSizedStructure FlashLookUpTable::tableInFlash =
{
// initialize values here
}
FlashLookUpTable::LookUpTable_t const * FlashLookUpTable::GetLookUpTablePointer(void) const
{
return &tableInFlash.t;
}
Para escribir esa página en flash, usted necesita un buffer (ya sea en la RAM o en flash) con el mismo tamaño de una página flash, porque tienes que borrar la página antes de escribir de nuevo, por lo que un cambio de lugar de un único valor no es posible.
Dependiendo de exactamente cómo usted lo usa, usted puede ser que necesite para declarar la estructura como volatile
. Esto sucede especialmente si usted tiene acceso a la tabla directamente (no con un puntero, como en este caso).
Algunos compiladores optimizar el código de tal manera, de que se tome la constante fuera de la tabla directamente en el código. El resultado es, que si cambia el valor en la tabla, el valor no es tomado en cuenta en el código.
El compilador IAR tenía algunos problemas (se fija en la versión actual) el manejo de un static volatile const
así que me cambié a la utilización de un puntero.
Si desea cambiar los valores, necesitamos algún tipo de flash algoritmo.
La escritura de flash siempre se compone de:
- Copia de seguridad del contenido de la página
- Actualización de copia de seguridad con los valores cambiados
- Borrar página
- Escribir la página
- por seguridad: comparar página escrita con copia de seguridad
Nota para el avanzado:
En algunos casos puede explotar que puede escribe ceros en las posiciones donde estaba, por lo que podría cambiar un 0x7F a 0x3F, pero no al revés. En el caso de que usted no necesita hacer una página de borrado. Algunos controladores pueden no ser compatibles con esta.