2013-06-27 66 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()s上敲擊。我使460字節,這導致我幾個問題:

  • 什麼是malloc()在這個系統上做什麼?即使在64kB系統上,我也希望有更多存儲量的存儲空間

  • 該行爲在64kB系統和128kB系統上是一致的;我是否必須執行某種魔術來訪問額外的內存,如手動銀行切換?

+0

爲什麼要增加5個字節?當你分配更大的塊(只是好奇)會發生什麼?其他問題:您允許使用多少堆棧空間? –

回答

4

答案是,在Z80系統上,堆大小被硬編碼爲1kB。馬騰布洛克answered這個SDCC用戶郵件列表:

您好鄧肯,

你必須自己創建堆如果標準1kB的不 不夠。將heap.s複製到您的項目目錄中並修改它以創建您的首選大小 。然後將其組裝並鏈接到您的項目。

與在_heap.c中定義的mcs51堆不同,本手冊中記錄的Z80不是 。請隨時索要文件 在跟蹤器系統中更新或合併_heap.c和heap.s。

馬騰

5

事實上,鄧肯貝恩說,存在這樣SDCC實現了Z80的默認內存管理器很窄的堆空間。

但是,試圖修改SDCC的堆之前,您應該如果你真的需要上的Amstrad CPC動態內存考慮。通常,在運行擁有整個硬件的獨立應用程序時,使用動態內存毫無意義。你可以測試並知道你有多少內存,並且你可以直接寫入你想要的內存。沒有內存保護,沒有其他應用程序在後臺運行。

因此,設計您自己的內存映射(您希望數據的位置以及使用多少空間),然後直接管理內存,這是非常可取的。而且,代碼優化在這臺機器中非常重要,手動管理內存與優化極其相關。

如果您的代碼直接在Amstrad CPC上運行(即不使用Symbos等現代操作系統),則必須手動處理銀行切換以訪問內存。 Z80 CPU有一個16位總線,只能尋址64KB的存儲器而無需銀行轉換。

+0

靜態內存分配的缺點在於,即使您的應用程序不會同時填充所有緩衝區,您也必須支付所有緩衝區的最壞情況限制。在這樣的系統上授予的成本也非常高,但我肯定不會忽略動態分配(儘管通用的'malloc'肯定不存在。) – doynax

+0

事實上,如果你想到它,這不完全是一個缺點。如果您希望您的應用程序管理X數據,則需要可用內存或無法執行此操作。如果您動態執行該操作,則還需要爲該堆分配該空間。 – ronaldo

+0

(繼續...) 從我的角度來看,設計自己的內存池通常會更有趣,可以爲您自己的目的服務並直接管理它。必須始終考慮最壞情況的限制,特別是在資源有限的情況下。 無論如何,我的一般建議是事先考慮方法,而不是訴諸默認。其餘的只是我個人的看法。 – ronaldo