2009-03-23 5 views
3

Architecture ARM9. Langage de programmation C.Quelle est la solution de contournement pour l'exception d'accès mémoire non alignée sur ARM9 utilisant C?

Nous avons une pile tierce et l'un des appels prend un pointeur (pBuffer) vers un emplacement de mémoire. Dans la pile, ils sont libres de se déplacer autour du pointeur et d'y accéder 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 emplacement de mémoire impair/unalighed

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

value est de type uint16 et index est bornes cochée et les index pBuffer . Cela provoque une exception d'accès mémoire non alignée. pBuffer indique char * sur le tas. Comme mentionné précédemment, même si nous pouvons jeter un coup d'œil dans la pile tierce, nous ne pouvons pas mettre à jour le code officiellement. Nous avisons donc le fournisseur et ils fournissent la mise à jour dans la prochaine version.

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

Répondre

6

Copiez la valeur octet par octet. Convertissez-le en un pointeur char (non signé), puis copiez un octet à la fois.

Ce n'est pas joli, mais il ne semble pas que vous ayez beaucoup d'options.

1

Il y a trois possibilités, et je ne peux pas déterminer à partir de votre question jusqu'ici quel est le cas.

Cas 1: L'index est toujours impair. Solution: memmove() pBuffer sur 1 octets Cas 2: L'index est parfois impair, et vous pouvez prédire à l'avance quand il le sera. Solution: memmove() pBuffer sur 1 byte quand vous savez que l'index sera impair. Cas 3: L'index est parfois impair, et vous ne pouvez pas prédire quand il le sera. C'est dommage, car le code sera faute.

+0

Merci MSalters. Ceci est en fait le cas 3, donc ne peut pas faire beaucoup dans l'appelant. La routine réelle qui effectue ces opérations nous est fournie. Ils devront donc se mettre à jour, mais nous pouvons mettre à jour de manière non officielle et indiquer au fournisseur où le problème doit être résolu et fournir une pile mise à jour. – dubnde

Questions connexes