Pregunta

Tengo una función:

void testfunction() {
 static char_t theChar1 = 1;
 static unsigned char smallArray[1];
 static unsigned char largeArray[135];
    ...
}

y un archivo de vinculador:

  . = ALIGN(4);
  _edata = . ;
  PROVIDE (edata = .);

  .bss (NOLOAD) :
  {
    __bss_start = . ;
    __bss_start__ = . ;
    *(.bss)
    *(.bss.*)
    *(COMMON)
    . = ALIGN(4);
  } > ramEXT

  . = ALIGN(4);
  __bss_end__ = . ;
  PROVIDE (__bss_end = .);

Necesito arrays estáticos (.bss de datos) para alinear en 4 límites de bytes, pero parece que las matrices se niegan a hacerlo. Estructuras y tipos primitivos se alinean bien (ver las líneas de llenado), pero las matrices están por todas partes. Aquí está mi archivo de mapa:

 .data.firstTimeFlag.7295
                0xa000098c        0x4 output/file1.o
 .data.theChar1.5869
                0xa0000990        0x1 output/file2.o
 *fill*         0xa0000991        0x3 00
 .data.debounce
                0xa0000994      0x270 output/file3.o

...

 .bss.initialized.5826
                0xa000812c        0x1 output/file2.o
 *fill*         0xa000812d        0x3 00
 .bss.allocator.5825
                0xa0008130       0x34 output/file2.o
 .bss.largeArray.5869
                0xa0008164       0x87 output/file2.o
 .bss.smallArray.5868
                0xa00081eb        0x1 output/file2.o
 .bss.initialized.5897
                0xa00081ec        0x1 output/file2.o
 *fill*         0xa00081ed        0x3 00
 .bss.allocator.5896

Alguien sabe cómo alinear las matrices?

¿Fue útil?

Solución

No estoy seguro de que usted puede hacer esto con un guión enlazador, y estoy desconcertado en cuanto a su objetivo; el atributo de alineación unida a cada declaración ensamblador presumiblemente cumple con los requisitos de ABI y la máquina. ¿Estás tratando de aumentar la tasa de aciertos de caché? Compensar tipo Disconformes juego de palabras en el código fuente?

Una cosa que puede "fácilmente" hacer es añadir la extensión de alineación GNU C a la fuente.

static unsigned char smallArray[1] __attribute__ ((aligned (4)));

Actualizar : Hmm, una gran biblioteca de macros de terceros que genera obviamente código no conforme? (Si se trata de código estándar conformes es de suponer que funciona bien. :-) Bueno, esto es una chapuza espantosa, pero casi puedo garantizar que el "trabajo", FSDO "trabajo", y no requiere la depuración de la macro lib .. .you podríamos post-procesar la producción de lenguaje ensamblador del compilador. símbolos del SRS estáticos locales no están layout sensible y se declaran típicamente en un solo .comm o .lcomm Directiva, para los que es probable que sea la cantidad de alineación el último parámetro.

Este parámetro es lo __attribute__ cambios. Se podría cambiar a todos ellos durante la construcción con un guión de algún tipo ...

Otros consejos

En los sistemas en los que he trabajado, los parámetros de engarce podría ser controlado para establecer la alineación del inicio de cada sección - pero no la alineación de las variables individuales dentro de la sección. La alineación de las variables individuales se determinó por el compilador, según el tipo de la variable.

Es posible que pueda utilizar algún tipo de Pragma compilador, específico de la plataforma, por supuesto.

Una alternativa es definir la matriz como una matriz de cualquier tipo que necesita alineado con, como uint32_t.

Tengo curiosidad por saber lo que está tratando de lograr - que suena como si estuviera haciendo algo un poco inusual y específico de la plataforma, si usted tiene este requisito alineación. Mejor de los creadores de código independiente de la plataforma, si es posible, por supuesto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top