C를 사용하여 ARM9에서 정렬되지 않은 메모리 액세스 예외에 대한 해결 방법은 무엇입니까?

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

  •  21-08-2019
  •  | 
  •  

문제

아키텍처 ARM9. 프로그래밍 언어 C.

우리는 타사 스택이 있고 통화 중 하나는 포인터를 가져옵니다 (pBuffer) 메모리 위치에. 스택 내에서는 포인터를 통과하여 자유롭게 움직여 원하는대로 접근 할 수 있습니다. 불행히도, 그들은 전달 된 것을 포인터로 상쇄하고 그것을 홀수/unalighed 메모리 위치

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

어디 value 유형입니다 uint16 그리고 index IS 경계 확인 및 색인 pBuffer. 이로 인해 정렬되지 않은 메모리 액세스 예외가 발생합니다. pBuffer ~를 가리키다 char * 힙에.

언급했듯이, 우리는 타사 스택을 들여다 볼 수 있지만 공식적으로 코드를 업데이트 할 수 없습니다. 따라서 제공자에게 알리고 다음 릴리스에서 업데이트를 제공합니다.

이것에 대한 작업이 있는지 이해하고 싶습니다. 정렬되지 않은 액세스를 위반하지 않고 위의 과제를 어떻게 수행합니까? 그러한 문제를 해결하기위한 최선의 방법은 무엇입니까?

도움이 되었습니까?

해결책

바이트를 바이트 바이트로 복사하십시오. (서명되지 않은) 숯 포인터에 캐스트 한 다음 한 번에 바이트를 복사하십시오.

예쁘지는 않지만 많은 옵션이있는 것처럼 들리지 않습니다.

다른 팁

세 가지 가능성이 있으며, 지금까지 귀하의 질문에서 결정할 수 없습니다.

사례 1 : 색인은 항상 홀수입니다. 솔루션 : MEMMOVE () PBUFFER 1 BYTES CASE 2 : 인덱스는 때때로 홀수이며, 그렇지 않을 때 앞을 예측할 수 있습니다. 솔루션 : Memmove () Pbuffer 1은 1 바이트 이상의 색인이 홀수임을 알 수 있습니다. 사례 3 : 지수는 때때로 홀수이며 언제 될지 예측할 수 없습니다. 코드이기 때문에 이것은 불행한 일입니다 ~ 할 것이다 잘못.

Pbuffer를 통제하는 경우 주변의 작업으로 UINT32_T 배열 (또는 아키텍처의 정렬과 일치하는 것)으로 선언 할 수 있습니다. 버퍼를 UINT32_T로 선언하면 컴파일러는 올바른 정렬을 선택합니다. 대상 기능을 호출 할 때 UINT8_T*에 캐스트 할 수 있습니다.

이것은 게시 한 예제 코드와 함께 작동하지만 타사 코드가 버퍼에 정렬되지 않은 오프셋을 적용한 경우에도 여전히 실패 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top