El compilador no puede dividir la asignación de memoria para su estructura entre RAM y FLASH.
Cualquier variable de estructura que cree con ese tipo se ubicará donde le diga al compilador que coloque toda la estructura, por lo tanto:
IIR_FILTER f1;
estará en la RAM, y
const IIR_FILTER f2;
estará en FLASH.
Sin embargo, si la estructura se encuentra en la RAM (como f1
arriba), el compilador debería darte un error si intentas asignar un valor a cualquier miembro declarado como const
, entonces:
f1.b_coeff[0] = 5;
debería producir un error de compilación, aunque f1 se encuentre en la RAM.
Supongo que la razón por la que querrías hacer algo como esto es para ahorrar en el uso de RAM.
Una técnica que podría usar y que podría funcionar para usted sería algo como:
typedef struct
{
const _iq * const b_coeff;
const _iq * const a_coeff;
_iq w[NUM_OF_COEFF];
} IIR_FILTER;
const _iq b_coeff_const[NUM_OF_COEFF];
const _iq a_coeff_const[NUM_OF_COEFF];
y luego cuando declara la variable de estructura:
IIR_FILTER f1 = {.b_coeff = b_coeff_const, .a_coeff = a_coeff_const};
De esta manera solo mantendrás los punteros a los arreglos en la RAM, mientras que los arreglos en sí mismos están en FLASH.
Ya que C trata los arrays y los punteros de forma bastante similar, puede usar los punteros como si fueran arrays, pero perdería cualquier comprobación de límites que su compilador pueda proporcionar, así que asegúrese de no leer más allá del final del matrices.