2010-05-26 9 views
0

우리의 임베디드 시스템은 enea가 제조 한 hw/sw 플랫폼을 기반으로합니다. 플랫폼이 최근에 업데이트 된 후에 우리는 전역 변수에 대한 일부 연산이 시스템을 계속 충돌시키는 것을 발견했습니다.플랫폼 변경 후 전역 변수가 변경되지 않음

예를 들어 일부 데이터가 들어있는 글로벌지도 구조가 있습니다. 한 번 또는 두 번지도를 삽입/반복 할 수 있습니다. 그런 다음지도의 요소 주소가 0x0 또는 0x1d와 같은 금지 된 주소로 갑자기 변경되어 시스템이 중단됩니다.

플랫폼 업데이트 전후의 유일한 차이점은 다음과 같습니다. 1) sw 부분 : C++ 소프트웨어이며 컴파일러가 gcc에서 gcc로 변경되었습니다. 2) hw 부분 : 우리는 새 보드를 가지고 있지만, CPU는 여전히 powerpc405입니다.

가능한 모든 방법을 시도했지만 그 이유를 아직 알 수 없습니다. 이견있는 사람?

답변

2

전역에 알려진 문제는 초기화의 순서입니다. 이 순서는 일반적으로 정의되지 않습니다. 결과적으로 한 글로벌의 ctor가 다른 글로벌을 사용하려고하면 충돌이 발생할 수 있습니다. 귀하의 경우, GCC가지도를 사용하는 지점 이후에지도를 초기화하기로 결정한 것이 문제 일 수 있습니다.

빠른 해결책은 단독으로 세계를 대체 할 수 있습니다 :

MyClass& MyClass::instance() { 
    static MyClass singleton; 
    return singleton; 
} 

singleton

은 함수가 반환 이전에 생성되기 때문에 확실히는 사용되기 전에.

+0

고맙습니다. MSalters. 나는 가능한 한 빨리이 해결책을 시도 할 것이다. 그러나 충돌이 발생하기 전에 글로벌 데이터 구조에서 한두 번 작동 할 수 있다고 설명 할 수 있습니까? – Lenciel

0

메모리 부족 조건이나 결함 메모리 할당자가있는 것 같습니다. stl 컨테이너를 사용할 때 할당자를 템플릿 매개 변수로 malloc_alloc로 변경하고 dmalloc과 같은 lib를 사용하여 메모리 하우스 보관이 잘못되었는지 확인할 수 있습니다 (http://www.sgi.com/tech/stl/Allocators.html 참조). 또한 Linux에서 소프트웨어를 컴파일하고 valgrind를 사용하여 메모리 문제를 찾을 수도 있습니다.

0

일부 아이디어 :

  • 변화가있을 수 있습니다 컴파일러, 크로스 플랫폼 매크로 나 컴파일러 미리 정의 된 매크로를 변경하여.
  • 으로 새 보드의 드라이버를 사용했거나 이 새 것으로 포함되었거나 업데이트되었습니다 (소프트웨어 ). CPU는 의 나머지 하드웨어에 대해서는 동일하지 않지만 에있을 수 있습니다. (사용중인 경우)
  • 메모리 할당 문제 : (시스템의 메모리 크기가 같지 않음, 스택/힙 오버플로)
  • 예를 들어 초기화되지 않은 데이터는 서로 다른 두 컴파일러/플랫폼에서 서로 다른 동작을 보일 수 있습니다. (다른 구현 컴파일러에 따라가) 정의되지 않은 동작이 소스 코드의
  • 사용
관련 문제