¿Asignación de memoria de constantes y estáticas en la estructura?

Estoy trabajando en la implementación del filtro IIR donde estoy inicializando los coeficientes de filtro y la memoria (form-2 w) de la siguiente manera.

typedef struct
{
const _iq b_coeff[NUM_OF_COEFF];
const _iq a_coeff[NUM_OF_COEFF];
_iq w[NUM_OF_COEFF];
}IIR_FILTER;

Ya que, hay constantes y variables estáticas en la estructura. Por lo general, el compilador asigna constantes en FLASH (.cinit) y estáticas en RAM (.ebss). [Estoy usando CCS Compiler con TMS320F28033 si eso ayuda]

Entonces, mi pregunta es cómo el compilador asignará esto ya que es una estructura.

Esto es algo que usted mismo puede verificar fácilmente compilando y buscando en el archivo del mapa. E incluso puedes compartir tus hallazgos.

Respuestas (2)

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 la estructura completa, por lo tanto:
IIR_FILTER f1;estará en RAM y
const IIR_FILTER f2;estará en FLASH.

Sin embargo, si la estructura está ubicada en la RAM (como f1arriba), su compilador debería generar un error si intenta asignar un valor a cualquier miembro declarado como const, entonces:
f1.b_coeff[0] = 5;debería generar un error de compilación, aunque f1 esté ubicado 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 declaras la variable de estructura:
IIR_FILTER f1 = {.b_coeff = b_coeff_const, .a_coeff = a_coeff_const};

De esta manera, solo mantiene los punteros a los arreglos en RAM, mientras que los arreglos mismos están en FLASH.
Dado que C trata las matrices y los punteros prácticamente de la misma manera, puede usar los punteros como si fueran matrices, pero perdería cualquier verificación de límites que pueda proporcionar su compilador, así que asegúrese de no leer más allá del final de la arreglos

Solo por curiosidad, ¿cuál crees que sería la penalización por esto en términos de ciclos perdidos en el direccionamiento? Lo pregunto porque a pesar de que está trabajando con punteros, aún necesita pasar las direcciones, tanto en RAM como en flash.

No estoy familiarizado con su arquitectura o compilador, pero al usar GCC en ARM si inicializó los campos const a cualquier cosa distinta de cero, toda la estructura se asignaría tanto en flash (inicialización distinta de cero) como en RAM (sin const, en menos parcialmente).

Los valores de inicialización distintos de cero deben almacenarse en flash, mientras que las cosas que no son constantes deben estar en RAM. Aaa y el estándar C requiere que la estructura se coloque en memoria continua. Intente dividir esta estructura en dos partes y vea si el tamaño de su programa cambia. O simplemente configurando toda la estructura como const.