Qual é a solução para exceção de acesso à memória unaligned em ARM9 usando C?
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.
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.