Tengo efectivamente tres conjuntos de variables para colocar en dos ubicaciones. Los juegos 1 y 2 nunca se usan juntos, por lo que pueden ocupar el mismo espacio. El set 3 debe ser único.
Sé que puedo usar una unión de estructuras para obtener lo que quiero, pero esa es una gran cantidad de datos para forzar en la misma área, y hace que los nombres sean innecesariamente complejos en mi opinión:
union
{
struct
{
...
} set_1;
struct
{
...
} set_2;
} shared_variables;
También puedo asignar una dirección específica a cada variable, pero eso no permite ninguna libertad para que el vinculador las optimice:
unsigned char foo_1 @ 0x1A0;
unsigned int bar_1 @ 0x1A1;
unsigned long foo_2 @ 0x1A0; //same address as foo_1
Puedo asignar un nombre de sección a cada variable y decirle al vinculador qué hacer con las secciones, pero todavía creo que es demasiado restrictivo:
unsigned char __section("set_1") foo_1; //set_1 is 1 byte
unsigned int __section("set_1") bar_1; //set_1 is now 3 bytes
unsigned long __section("set_2") foo_2; //set_2 is 4 bytes
//linker: -L-Ashared_class=<address_range> -L-Pset_1=shared_class -L-Pset_2=shared_class
//actually concatenates them somewhere in the specified range (total 7 bytes), not sure how to overlay them (total 4 bytes)
¿Hay alguna forma de decirlo? "No me importa si este conjunto de variables se superpone a ese conjunto de variables, pero este otro conjunto de variables debe ser único", y simplemente dejarlo así.
Editar en respuesta a los comentarios:
- El conjunto 1 + el conjunto 2 + el conjunto 3 representan todas las variables que se utilizan en todo el proyecto.
- El código que los usa está actualmente distribuido en 4 módulos de origen.
- Como la mayoría, si no todos los chips en este rango de Microchip, la memoria está fragmentada en hardware en fragmentos de 80 bytes separados por registros de configuración de hardware. Hay otro modo de direccionamiento que requiere un puntero para acceder a todos los fragmentos como si fueran contiguos, pero que aplastarían el puntero registra un lote . (y parece que hay un error en el depurador que corrompe los datos que se usan de esa manera en ciertos casos; aunque la ejecución normal está bien)