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

1

Estoy trabajando en la implementación del filtro IIR donde estoy inicializando los coeficientes de filtro y la memoria (forma-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;

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

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

    
pregunta rahulb

2 respuestas

3

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.

    
respondido por el brhans
0

No estoy familiarizado con su arquitectura o compilador, pero al usar GCC en ARM, si inicializa los campos const en algo que no sea cero, toda la estructura se asignaría tanto en flash (inicialización no cero) como en RAM (no). const, al menos parcialmente).

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

    
respondido por el Jan Dorniak

Lea otras preguntas en las etiquetas