Как решить проблему «Ближний сегмент данных больше 64 КБ» на Palm с помощью CodeWarrior9?

Я работаю над большим проектом, и теперь я сталкиваюсь с ошибкой «Ближний сегмент данных больше 64 КБ».

Если я прокомментирую «FrmSetEventHandler (frm, DadosConstrutivos1HandleEvent);» на PrvAppHandleEvent в PilotMain программа прекрасно его компилирует. Если я попытаюсь использовать de call, я получу сообщение об ошибке.

Я уже использую многосегментный и «Расширенный режим».

Как мне решить эту проблему?

Спасибо Родриго Лейте Гомиде


person Community    schedule 04.05.2009    source источник


Ответы (2)


Я не использую CodeWarrior, но вместо этого использую PocketStudio, и со мной часто случается «та же проблема».

Каждый модуль является «сегментом кода», поэтому, когда ваш скомпилированный модуль становится больше 64 КБ кода, компилятор предупреждает вас и не связывает ваш код.

Попробуйте переместить какой-то код из этого модуля в другой.

Или вы можете использовать #pragma:

#pragma segment Seg1

... code ...

#pragma segment Seg2

... code ...

С уважением,

Кристиан.

person Christian    schedule 27.05.2009

Нет хорошего способа решить эту проблему. Код 68K в Palm OS может получить доступ только к небольшому количеству статических данных программы, поскольку набор инструкций 68K обеспечивает только смещение + -32K для адресации данных. Это потребует серьезных изменений в компиляторе для поддержки дальнейшего развития, поскольку компилятору потребуется сгенерированный код для выполнения сложных арифметических операций с указателями, и ни CodeWarrior, ни инструменты prc не поддерживают это.

Вот несколько советов:

  • Если у вас есть большие таблицы данных, попробуйте переместить их в их собственные ресурсы, где вы загрузите и заблокируете их расположение во время выполнения. Это переместит их из раздела данных.
  • Включите функцию компоновщика карты и посмотрите, как распределяется ваш раздел данных, и посмотрите, есть ли большие объекты данных или массивы, которые вам не нужны.
  • Вместо объявления глобальных переменных используйте глобальные указатели на память, которую вы выделяете с помощью MemGluePtrNew.
person Ben Combee    schedule 14.07.2009