C 프로그램에서 구조를 사용하는 이유는 링크 오류를 유발합니다.
문제
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 바이트 !!!) 구조는 컴파일러가 내부 메모리 내부에 너무 많은 스택 공간을 예약하도록 강요합니다. 링커 맵 파일을 살펴 보는 것이 좋습니다. 메모리 파티션을 "재 배열"할 수 있습니다. 마사지는 "연속 바이트"라고 말하므로 아마도 여전히 충분한 공간이있을 수 있지만 분열되어 있습니다.
안녕히 계세요