2013-06-27 3 views
5

SDCC 3.1.0을 사용하여이 코드를 컴파일하고 Amstrad CPC 464 (WinCPC 0.9.26을 Wine에서 실행하는 에뮬레이션)에서 실행하십시오.SDCC 및 malloc() - 사용 가능한 메모리보다 훨씬 적은 메모리 할당

void _test_malloc() 
{ 
    long idx = 0; 
    while (1) 
    { 
     if (malloc(5)) 
    { 
     printf("%ld\r\n", ++idx); 
    } 
     else 
    { 
     printf("done"); 
     break; 
    } 
    } 
} 

... 92 malloc()에서 일관되게 탭 아웃됩니다. 460 바이트를 만들면 다음과 같은 몇 가지 질문을하게됩니다.

  • 이 시스템에서 malloc()은 무엇을하고 있습니까? 나는 64kB 시스템에서도 더 많은 저장 용량을 기대하고있다.

  • 64kB 시스템과 128kB 시스템에서는 동작이 일관된다. 수동 뱅크 전환 같은 추가 메모리에 액세스하려면 어떤 종류의 마법을 수행해야합니까?

+0

왜 5 바이트 단위로 증가합니까? 더 큰 덩어리를 할당하면 (단지 호기심이 생기는 것) 어떤 일이 발생합니까? 다른 질문 : 스택 공간을 얼마나 허용합니까? –

답변

4

대답은 Z80 시스템에서 힙 크기가 1kB로 하드 코딩된다는 것입니다. SDCC에 사용자의 메일 링리스트에 마틴 브록 answered이 : 표준 1KB가 충분히 없는 경우

안녕하세요 던컨,

당신은 힙을 직접 만들어야합니다. 힙을 프로젝트 디렉토리에 복사하고 수정하여 기본 크기를 만듭니다. 그런 다음 그것을 조립하고 프로젝트와 링크하십시오.

_heap.c에 정의 된 mcs51 힙과 달리 이것은 설명서에서 Z80에 대해 설명 된 이 아닙니다. 트래커 시스템에서 _heap.c 및 heap.s의 업데이트 또는 병합 문서를 요청하십시오. 던컨 Bayne 말한대로

마틴 사실

5

는 SDCC는 Z80에 대한 구현의 기본 메모리 관리자에 매우 좁은 힙 공간이있다.

그러나 SDCC의 힙을 수정하기 전에 실제로 Amstrad CPC에서 동적 메모리가 필요한지 고려해야합니다. 일반적으로 전체 하드웨어를 소유 한 독립 실행 형 응용 프로그램을 실행할 때 동적 메모리를 사용할 필요가 없습니다. 보유하고있는 메모리 양을 테스트하고 알 수 있으며 원할 때마다 직접 메모리에 쓸 수 있습니다. 메모리 보호는 없으며 백그라운드에서 실행되는 다른 응용 프로그램도 없습니다.

따라서 자신의 메모리 맵 (데이터를 원하는 위치와 사용할 공간)을 직접 디자인하고 메모리를 직접 관리하는 것이 좋습니다. 또한 코드 최적화가이 시스템에서 매우 중요하며 수동으로 메모리를 관리하면 최적화와 관련이 있습니다.

코드가 Amstrad CPC에서 직접 실행되는 경우 (즉, Symbos와 같은 최신 OS를 사용하지 않는 경우) 은행 액세스를 수동으로 처리하여 메모리에 액세스해야합니다. Z80 CPU에는 뱅크 전환없이 64KB의 메모리 만 주소 지정할 수있는 16 비트 버스가 있습니다.

+0

여기서 정적 메모리 할당의 단점은 응용 프로그램이 모든 버퍼를 동시에 채우지 않을지라도 모든 버퍼에 대해 최악의 한계를 효과적으로 지불해야한다는 것입니다. 이와 같은 시스템에 수반되는 비용도 매우 높습니다. 그러나 확실히 동적 인 할당을 사용하지 않을 것입니다. (일반적인 malloc이 확실히 나와 있지만 말입니다.) – doynax

+0

사실, 당신이 그것을 생각한다면 그것은 정확히 단점이 아닙니다. 응용 프로그램에서 X 데이터를 관리하기를 원하면 해당 메모리가 필요하거나이를 수행 할 수 없게됩니다. 동적으로 수행하는 경우 힙에 해당 공간을 할당해야합니다. – ronaldo

+0

(계속 ...) 필자의 견해로는, 자신의 고유 한 목적을 위해 직접 메모리 풀을 설계하고 직접 관리하는 것이 일반적으로 더 흥미 롭습니다. 최악의 한계를 항상 고려해야하며, 특히 제한된 자원의 경우에 그러합니다. 어쨌든 내 일반적인 조언은 접근 방식을 미리 고려하고 기본값에 의존하지 않는 것입니다. 나머지는 내 개인적인 견해 일뿐입니다. – ronaldo