C 프로그램에서 구조를 사용하는 이유는 링크 오류를 유발합니다.

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

  •  19-09-2019
  •  | 
  •  

문제

8051 아키텍처 칩과 SDCC 컴파일러에 대한 C 프로그램을 작성하고 있습니다.

필터 구조라는 구조가 있습니다.

내 코드는 이렇게 보인다 ...

#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;
}

어떤 이유로 링크 오류 "? Aslink-Error는 영역 DSEG의 내부 RAM에서 29 개의 연속 바이트를 얻지 못할 것입니다."

내가 말하는 줄을 언급하면 FilterStructure testStruct; 오류가 사라집니다.

이 오류는 무엇을 의미합니까? 구조를 완료 할 때 구조를 폐기해야합니까?

도움이 되었습니까?

해결책

메시지는 로컬 변수를 의미합니다 testStruct 메모리 관리자가 29 개의 연속 바이트를 찾을 수 없기 때문에 RAM (또는 이진의 데이터 세그먼트 여야하는 DSEG)에 할당 할 수 없습니다.

구조물은 8 바이트 길이가되어야하기 때문에 이상합니다. 그러나 BTW는 구조를 버리는 것과 관련이 없습니다. 이것은 메모리 관리 문제인 것 같습니다. 8051 사양을 잘 모르지만 아주 제한적이어야합니까?

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

다른 팁

당신은 기억이 부족합니다 .... 그것의 외모로.

글로벌 변수로 옮기십시오. 그것이 더 나은지 확인하십시오.

단지 추측 : 8051에는 128 또는 256 바이트의 "내부 RAM"만 있습니다. 그다지 많지는 않습니다 ... 그것의 일부를 스택으로 사용하고 레지스터의 일부를 사용할 수 있습니다. 어쩌면 스택의 "큰"(8 바이트 !!!) 구조는 컴파일러가 내부 메모리 내부에 너무 많은 스택 공간을 예약하도록 강요합니다. 링커 맵 파일을 살펴 보는 것이 좋습니다. 메모리 파티션을 "재 배열"할 수 있습니다. 마사지는 "연속 바이트"라고 말하므로 아마도 여전히 충분한 공간이있을 수 있지만 분열되어 있습니다.

안녕히 계세요

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