SDCC и malloc() - выделяют гораздо меньше памяти, чем доступно

Когда я запускаю, скомпилируйте этот код с 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 () в этой системе? Я как бы надеялся на порядок больше памяти даже в системе 64 КБ

  • Поведение согласованно в системах 64 кБ и 128 кБ; я должен выполнить какое-то волшебство, чтобы получить доступ к дополнительной памяти, как ручное переключение банка?

2 ответа

Решение

Ответ заключается в том, что в системах Z80 размер кучи жестко задан в 1 КБ. Мартен Брок ответил на это в списке рассылки sdcc-user:

Привет Дункан,

Вы должны создать кучу самостоятельно, если стандартного 1 КБ недостаточно. Скопируйте heap.s в каталог вашего проекта и измените его, чтобы создать предпочитаемый вами размер. Затем соберите его и свяжите с вашим проектом.

В отличие от кучи mcs51, которая определена в _heap.c, это не задокументировано для Z80 в руководстве. Не стесняйтесь запрашивать обновление документации или слияние _heap.c и heap.s в системе отслеживания.

Маартен

На самом деле, как говорит Дункан Бэйн, в диспетчере памяти по умолчанию, который SDCC реализует для Z80, очень узкое пространство кучи.

Однако, прежде чем пытаться изменить кучу SDCC, вы должны подумать, действительно ли вам нужна динамическая память на Amstrad CPC. Как правило, нет смысла использовать динамическую память, когда вы запускаете отдельное приложение, которому принадлежит все оборудование. Вы можете проверить и узнать, сколько памяти у вас есть, и вы можете напрямую записывать в память, где вы хотите. Нет защиты памяти и других приложений, работающих в фоновом режиме.

Поэтому для вас гораздо предпочтительнее создать собственную карту памяти (где вы хотите, чтобы ваши данные были, и сколько места использовать), а затем непосредственно управлять памятью. Более того, оптимизация кода очень важна для этой машины, и ручное управление памятью чрезвычайно важно для оптимизации.

Если ваш код работает непосредственно в Amstrad CPC (т.е. не использует современную операционную систему, такую ​​как Symbos), вам придется вручную переключиться на переключение банков для доступа к памяти. Процессор Z80 имеет 16-битную шину, которая может адресовать только 64 КБ памяти без переключения банков.

Другие вопросы по тегам