2013-06-27 25 views
5

Po uruchomieniu skompiluj ten kod za pomocą SDCC 3.1.0 i uruchom go na Amstrad CPC 464 (w emulacji, z WinCPC 0.9.26 uruchomionym na Wine):SDCC i malloc() - przydzielanie znacznie mniej pamięci niż jest dostępne

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

... konsekwentnie wygrywa w 92 malloc(). I sprawiają, że 460 bajtów, który prowadzi mnie na kilka pytań:

  • Co jest malloc() robi na tym systemie? Miałem nadzieję, że więcej miejsca zostanie zapisane w pamięci masowej nawet w systemie 64 kB. Jest to zgodne z systemami 64kB i 128kB; czy muszę wykonywać magię, aby uzyskać dostęp do dodatkowej pamięci, np. ręczne przełączanie banków?

+0

Dlaczego 5-bajtowe przyrosty? Co się stanie, gdy przydzielisz większe porcje (po prostu będąc ciekawym)? Inne pytanie: Ile miejsca na stos możesz zabrać? –

Odpowiedz

4

Odpowiedź jest taka, że ​​w systemach Z80 wielkość sterty jest zakodowana na stałe do 1 kB. Maarten Brock answered to na liście mailingowej użytkowników SDCC:

Witam Duncan,

Trzeba stworzyć sterty samodzielnie, jeśli średnia 1kB nie jest wystarczy. Skopiuj plik heap.s do katalogu projektu i zmodyfikuj go, aby uzyskać preferowany rozmiar w formacie . Następnie zmontuj go i połącz z projektem.

W przeciwieństwie do sterty mcs51 zdefiniowanej w _heap.c, nie jest to udokumentowane dla Z80 w instrukcji. Możesz poprosić o aktualizację lub scalenie dokumentacji _heap.c i heap.s w systemie śledzenia.

Maarten

5

W rzeczywistości, jak mówi Duncan Bayne, jest bardzo wąska przestrzeń sterty w domyślnym menedżerze pamięci, który implementuje SDCC dla Z80.

Zanim jednak spróbujesz zmodyfikować stertę SDCC, powinieneś rozważyć, czy rzeczywiście potrzebujesz pamięci dynamicznej na CPC Amstrad. Zasadniczo nie ma sensu korzystanie z pamięci dynamicznej podczas uruchamiania autonomicznej aplikacji, która jest właścicielem całego sprzętu. Możesz przetestować i wiedzieć, ile masz pamięci i możesz bezpośrednio zapisywać w pamięci gdziekolwiek chcesz. Nie ma ochrony pamięci ani innych aplikacji działających w tle.

Dlatego lepiej jest zaprojektować własną mapę pamięci (miejsce, w którym ma się znajdować dane i ile miejsca), a następnie bezpośrednio zarządzać pamięcią. Co więcej, optymalizacja kodu jest bardzo ważna w tym komputerze, a ręczne zarządzanie pamięcią ma ogromne znaczenie dla optymalizacji.

Jeśli Twój kod działa bezpośrednio w usłudze Amstrad CPC (tzn. Nie używasz nowoczesnego systemu operacyjnego, takiego jak Symbos), musisz ręcznie zarządzać przełączaniem banków, aby uzyskać dostęp do pamięci. Procesor Z80 ma 16-bitową magistralę, która może adresować tylko 64 KB pamięci bez przełączania banków.

+0

Wadą przydzielania pamięci statycznej jest to, że jesteś zmuszony zapłacić za najgorsze możliwe limity dla wszystkich buforów, nawet jeśli twoja aplikacja nie wypełni ich wszystkich jednocześnie. Przyznane na takich systemach koszty są również bardzo wysokie, ale z pewnością nie odrzucałbym alokacji dynamicznej poza domem (chociaż ogólny "malloc" z pewnością jest niedostępny.) – doynax

+0

W rzeczywistości, jeśli myślisz o tym, nie jest to dokładnie wadą. Jeśli chcesz, aby aplikacja zarządzała danymi X, potrzebujesz tej pamięci lub nie będziesz w stanie tego zrobić. Jeśli robisz to dynamicznie, musisz również przydzielić to miejsce dla sterty. – ronaldo

+0

(kontynuacja ...) Z mojego punktu widzenia generalnie bardziej interesujące jest zaprojektowanie własnej puli pamięci, aby służyć własnym celom i zarządzać nią bezpośrednio. Należy zawsze brać pod uwagę najgorsze przypadki, zwłaszcza przy ograniczonych zasobach. W każdym razie, moją ogólną radą jest rozważenie wcześniejszych podejść i nie uciekanie się do domyślnych. Reszta to tylko mój osobisty pogląd. – ronaldo

Powiązane problemy