5

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

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

4

2 回答 2

6

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

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

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

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

于 2015-05-29T17:20:15.083 回答
4

答案是,在 Z80 系统上,堆大小被硬编码为 1kB。Maarten Brock在 sdcc-user 邮件列表中回答了这个问题:

你好邓肯,

如果标准的 1kB 还不够,您必须自己创建堆。将 heap.s 复制到您的项目目录中并对其进行修改以创建您喜欢的大小。然后组装它并与您的项目链接。

与 _heap.c 中定义的 mcs51 堆不同,手册中没有为 Z80 记录。随时请求文档更新或在跟踪器系统中合并 _heap.c 和 heap.s。

马丁

于 2013-07-02T23:02:19.383 回答