Qual é a solução para exceção de acesso à memória unaligned em ARM9 usando C?

StackOverflow https://stackoverflow.com/questions/673930

  •  21-08-2019
  •  | 
  •  

Pergunta

Arquitetura ARM9. Linguagem de programação C.

Temos uma pilha de terceiros e uma das chamadas leva um ponteiro (pBuffer) para um local de memória. Dentro da pilha, eles são livres para se movimentar o ponteiro passado e acessá-lo como quiserem. Infelizmente, eles compensar o passado em ponteiro e passou-o em uma outra função que tentou fazer isso a partir de um ímpar / unalighed localização de memória

         ((uint16 *)pBuffer)[index] = value;

onde value é do tipo uint16 e index é limites verificado e índices pBuffer. Isso faz com que uma exceção de acesso à memória não alinhado. pBuffer aponta para char * na pilha.

Como mencionado, mesmo que podemos espreitar a pilha de terceiros, não podemos atualizar o código oficialmente. Então, nós notificar o provedor e eles fornecem a atualização na próxima versão.

Eu quero entender se há um em torno do trabalho para isso. Como faço para executar a atribuição acima, sem violar o acesso desalinhado? Qual é a melhor abordagem para resolver tais problemas.

Foi útil?

Solução

Copie o valor de byte por byte. Lançá-lo para um (unsigned) ponteiro carvão animal, e, em seguida, copiar um byte de cada vez.

Não é bonito, mas não soa como você tem muitas opções.

Outras dicas

Existem três possibilidades, e eu não posso determinar a sua pergunta tão longe que é o caso.

Caso 1: O índice é sempre estranho. Solução: memmove () pBuffer sobre 1 bytes Caso 2: O índice é, por vezes estranho, e você pode prever na frente quando ele será. Solução: memmove () pBuffer mais de 1 byte quando você sabe índice será estranho. Caso 3: O índice é, por vezes estranho, e você não pode prever quando será. Isso é lamentável, porque o código irá falha.

Se você está no controle de pBuffer, como um trabalho ao redor, você pode declará-la como uma matriz de uint32_t (ou o que corresponde ao alinhamento de sua arquitetura). Com declarar o tampão como uint32_t, o compilador irá escolher o alinhamento correcto. Você pode lançá-lo aos uint8_t * ao chamar sua função de destino.

Isso deve funcionar com o exemplo de código que você postou, mas ainda pode falhar se o código de terceiros aplica qualquer desalinhado deslocamento para o buffer.

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