2010-03-10 10 views
0

8051 아키텍처 칩과 SDCC 컴파일러 용 C 프로그램을 작성하고 있습니다.왜 C 프로그램에서 구조를 사용하면 링크 오류가 발생합니까?

필자는 FilterStructure라는 구조를 가지고 있습니다.

내 코드는 내가 링크 오류

을 "? ASlink이-오류-수 영역 DSEG 내부 RAM에서 29 연속 바이트를 얻을 수 없습니다"를 얻을 몇 가지 이유를 들어

#define NAME_SIZE 8 

typedef struct { 
char Name[NAME_SIZE]; 
} FilterStructure; 

void ReadFilterName(U8 WheelID, U8 Filter, FilterStructure* NameStructure); 

int main (void) 
{ 
    FilterStructure testStruct; 
    ReadFilterName('A', 3, &testFilter);  
    ... 
    ... 
    return 0; 
} 

void ReadFilterName(U8 WheelID, U8 Filter, FilterStructure* NameStructure) 
{  
    int StartOfName = 0; 
    int i = 0; 
    ///... do some stuff... 
    for(i = 0; i < 8; i++) 
    { 
     NameStructure->Name[i] = FLASH_ByteRead(StartOfName + i); 
    } 
    return; 
} 

... 다음과 같습니다 FilterStructure testStruct;이라는 줄을 주석 처리하면 오류가 사라집니다.

이 오류는 무엇을 의미합니까? 내가 그 일을 마치면 구조물을 버릴 필요가 있습니까?

+0

난 내가 XDATA FilterStructure testStruct 내 구조체의 선언을 변경 여기에 다른 질문의 빛 –

답변

1

메시지는 메모리 관리자가 할당하는 29 연속 바이트를 찾을 수 없기 때문에 지역 변수 testStruct가 (이진의 데이터 세그먼트되어야한다 또는 DSEG) RAM 할당 할 수 없음을 의미한다.

구조체가 8 바이트 길이가되어야하기 때문에 이상합니다. 구조체를 버리는 것과 아무런 관련이 없습니다. 이것은 메모리 관리 문제로 보입니다. 8051 사양은 잘 모르겠지만 꽤 있어야합니다. 제한된 권리?

EDIT : 8051 스펙을 보면 128 바이트 RAM 만있는 것 같습니다. 로컬로 선언 된 변수가 내부 RAM에 할당되어 있기 때문에 가능한 경우 (칩의 주소/데이터 버스를 사용하여) 외부 RAM 칩에 할당하려고 시도해야하므로 변수가 문제가 될 수 있습니다. 이러한 종류의 마이크로 컨트롤러를 사용해서는 안되기 때문에 확실하지 않습니다.

+0

에이 태그를 다시 지정; 그리고 문제가 해결 된 것 같습니다. – PICyourBrain

1

메모리가 부족합니다. 외모로 보았습니다.

글로벌 변수로 이동해보십시오. 그게 더 나은지 확인하십시오.

1

8051에는 128 또는 256 바이트의 "내부 RAM"만 있습니다. 그리 많지는 않지만 스택의 일부분과 레지스터의 일부분을 사용할 수 있습니다. 어쩌면 스택에 "큰"(8 바이트 !!!) 구조체가 내부 메모리 내부에 너무 많은 스택 공간을 예약하도록 컴파일러를 강제 할 수 있습니다. 필자는 링커 맵 파일을 살펴 보길 권합니다. 아마도 메모리 파티션을 "재정렬"할 수 있습니다. 마사지는 "연속적인 바이트"라고 말하며, 아마도 아직 충분한 공간이있을 수 있지만 조각화되어 있습니다.

안녕은