2013-06-27 56 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