Quelle est la solution de contournement pour exception d'accès mémoire non alignée sur ARM9 en C?

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

  •  21-08-2019
  •  | 
  •  

Question

Architecture ARM9. Langage de programmation C.

Nous avons une pile tiers et l'un des appels prend un pointeur (pBuffer) à un emplacement de mémoire. Au sein de la pile, ils sont libres de se déplacer autour du pointeur passé et l'accès comme ils le souhaitent. Malheureusement, ils compensent le passé pointeur et passé dans une autre fonction qui a essayé de le faire à partir d'un impair / unalighed emplacement mémoire

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

où est de type value et uint16 est limites index vérifiées et index char *. Cela provoque une exception d'accès mémoire non alignée. Points <=> sur le tas <=>.

Comme mentionné précédemment, même si nous pouvons jeter un regard dans la pile tiers, nous ne pouvons pas mettre à jour le code officiellement. Donc, nous informe le fournisseur et ils fournissent la mise à jour dans la prochaine version.

Je veux comprendre s'il y a un travail autour de cela. Comment puis-je effectuer l'affectation ci-dessus sans violer l'accès non alignés? Quelle est la meilleure approche pour résoudre ces problèmes.

Était-ce utile?

La solution

Copier l'octet de valeur par octet. Fonte à un (unsigned) pointeur de char, puis copier un octet à la fois.

Il est pas joli, mais il ne semble pas que vous avez beaucoup d'options.

Autres conseils

Il y a trois possibilités, et je ne peux pas déterminer de votre question à ce jour qui est le cas.

Cas n ° 1: L'indice est toujours impair. Solution: memmove () pBuffer sur 1 octets Cas n ° 2: L'indice est parfois étrange, et vous pouvez prédire l'avant quand il sera. Solution: memmove () pBuffer sur 1 octet lorsque vous connaissez l'index sera impair. Cas n ° 3: L'indice est parfois étrange, et vous ne pouvez pas prédire quand il sera. Cela est regrettable, car le code défaut.

Si vous êtes dans le contrôle de pBuffer, comme une œuvre autour, vous pouvez le déclarer comme un tableau de uint32_t (ou quoi correspond l'alignement de votre architecture). Avec déclarant le tampon comme uint32_t, le compilateur choisira l'alignement correct. Vous pouvez le jeter à uint8_t * lorsque vous appelez votre fonction cible.

Cela devrait fonctionner avec le code exemple que vous avez publié, mais peut encore échouer si le code tiers applique tout unaligned décalage du tampon.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top