En una aplicación donde tengo varios parámetros iniciales de configuración definidas mediante macros, por ejemplo:
Ese valor luego pasa a una posición de eeprom, y desde esa eeprom ese valor será leído y utilizado por el programa. No se usa la macro directamente como constante. El motivo es que el usuario luego puede cambiar estos valores desde un menú de ajustes implementado en el programa.
Podría asignar el valor a la eeprom directamente al compilar y grabar mediante la directiva #ROM int8 0xf00000 = {valor,valor,valor,etc....}
Pero si no lo hago así, es por que algunos valores son de 16 bits, otros son de 32 y otros son float. Por ejemplo:
#define DROP_CONCENTRATED_OFFSET 2.4
De modo que sería un calvario tener que ir calculando los bytes de cada variable por separado para subirlos manualmente a la eeprom, más que nada por que cada placa lleva valores muy distintos.
Para los float por ejemplo utilizo una unión:
union convert {
float f;
unsigned int a [4];
}trans;
Al asignar el valor de la macro float a (u.f) obtengo los 4 bytes en “a” y de ahí los paso a 4 posiciones de eeprom. Luego para leerlos, operación inversa.
Todo esto está bien, pero me exige crear una función que corra solo la primera vez que el programa corra en la placa tras la grabación icsp la cual obtiene todos los valores de las distintas macros, descomponerlas y grabarlas en la eeprom en sus lugares designados. Esto solo al primer arranque. Una bandera en la posición cero de la eeprom es bajada y grabada para indicar al programa que esa función nunca correrá más, salvo si el usuario selecciona una opción del menú que sería: Reestablecer a estado de fábrica. La cual graba un 1 en la posición 0 y hace reset inmediato
Visto todo esto, ¿ existe posibilidad de realizar todas esas operaciones de pasar valores constantes desde macros a la eeprom en tiempo de compilación/grabación?
Ahorraría espacio de flash que es en realidad el problema de todo por que está al 97% y sin posibilidad de sustituir el micro por otro mayor en flash.
Grabaría todos los datos iniciales en una “segunda página” de la eeprom por lo que al reestablecer a fábrica solo hay que leer las posiciones donde empiezan los valores iniciales y copiarlos a las que el usuario puede modificar. Eso ahorra bastante flash.
Un saludo.