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

Dun*_*yne 5 c malloc retro-computing sdcc

当我运行使用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;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

......它一直在92 malloc()s上点击.我做了460字节,这引出了几个问题:

  • malloc()在这个系统上做什么?我有点希望即使在64kB系统上也能提供更多的存储空间

  • 64kB系统和128kB系统的行为是一致的; 我是否必须执行某种魔术才能访问额外的内存,例如手动银行切换?

ron*_*ldo 6

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

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

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

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


Dun*_*yne 4

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

你好邓肯,

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

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

马丁