Pergunta

Eu tenho uma função:

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

e um linker arquivo:

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

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

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

Eu preciso de matrizes estáticos (.bss dados) para alinhar em 4 de limites de byte, mas parece matrizes recusar-se a fazê-lo.Estruturas e tipos primitivos alinhar multa (veja as linhas de preenchimento), mas as matrizes são de todo.Aqui está o meu arquivo 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

Alguém sabe como alinhar matrizes?

Foi útil?

Solução

Não tenho certeza se você pode fazer isso com um script de ligação e estou intrigado com seu objetivo; O atributo de alinhamento anexado a cada declaração do assembler presumivelmente atende aos requisitos da ABI e da máquina. Você está tentando aumentar a taxa de acerto do cache? Compensar o tipo não conforme punido no código-fonte?

Uma coisa que você pode "fazer facilmente" é adicionar a extensão de alinhamento GNU à fonte C.

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

Atualizar: Hmm, uma grande biblioteca de macro de terceiros que gera um código obviamente não conforme? (Se fosse o código de conformidade padrão, presumivelmente funcionaria bem. :-) Ok, este é um kludge assustador, mas eu quase posso garantir que ele "funcionará", FSDO "trabalho" e não requer depuração da macro lib .. .Você poderia pós-processo da saída da linguagem de montagem do compilador. Os símbolos BSS estáticos locais não são sensíveis ao layout e geralmente são declarados em um único .comm ou .lcomm Diretiva, para a qual o último parâmetro provavelmente será o valor do alinhamento.

Este parâmetro é o que __attribute__ mudanças. Você pode mudar todos eles durante a construção com um script de algum tipo ...

Outras dicas

Em sistemas em que trabalhei, o vinculador parâmetros podem ser controlados para definir o alinhamento do início de cada seção, mas não o alinhamento das variáveis individuais dentro da seção.O alinhamento das variáveis individuais foi determinado pelo compilador, de acordo com o tipo da variável.

Você pode ser capaz de usar algum tipo de compilador pragma, específicos da plataforma do curso.

Uma alternativa é definir a matriz como uma matriz de qualquer tipo que você precisa alinhadas, tal como, uint32_t.

Estou curioso para saber o que você está tentando alcançar--soa como se você estiver fazendo algo um pouco incomum e específicos da plataforma, se você tem essa exigência de alinhamento.Melhor para criar uma plataforma de código independente, se possível, é claro.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top