SDCC和malloc() - 分配的内存比可用内存少得多

时间:2013-06-27 23:29:35

标签: c malloc sdcc retro-computing

当我运行使用SDCC 3.1.0编译此代码时,在Amstrad CPC 464上运行它(在仿真下,在Wine上运行WinCPC 0.9.26):

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系统的行为一致;我是否必须执行某种魔术来访问额外的内存,例如手动银行切换?

2 个答案:

答案 0 :(得分:6)

事实上,正如Duncan Bayne所说,SDCC为Z80实现的默认内存管理器中存在非常窄的堆空间。

但是,在尝试修改SDCC的堆之前,您应该考虑是否确实需要Amstrad CPC上的动态内存。通常,在运行拥有整个硬件的独立应用程序时,使用动态内存是没有意义的。您可以测试并知道您拥有多少内存,并且可以直接在任何您想要的内存中写入内存。没有内存保护,也没有其他应用程序在后台运行。

因此,您最好设计自己的内存映射(您希望数据在哪里以及使用多少空间),然后直接管理内存。此外,代码优化在这台机器中非常重要,手动管理内存与优化非常相关。

如果您的代码直接在Amstrad CPC中运行(即不使用像Symbos这样的现代操作系统),则必须手动处理银行切换以访问内存。 Z80 CPU有一个16位总线,只能在不进行存储区切换的情况下处理64KB内存。

答案 1 :(得分:4)

答案是,在Z80系统上,堆大小被硬编码为1kB。 Maarten Brock answered在sdcc用户邮件列表上:

  

Hello Duncan,

     

如果标准1kB不是,则必须自己创建堆   足够。将heap.s复制到您的项目目录并修改它以创建您的   首选尺寸。然后组装它并与您的项目链接。

     

与_heap.c中定义的mcs51堆不同,这不是   在手册中记录了Z80。随意索取文件   在跟踪系统中更新或合并_heap.c和heap.s。

     

马腾