Перейти к содержанию
    

128 мега, проблема при коде > 64к

ICC6.31a Professional

Atmega128.

Исходный код разросся и при компиляции выскочила ошибка: 'text' area too large (>64K byte) и предложение перенести часть кода в другой файл. Заполнение 55%. Подергавшись и ничего не добившись, решил перекомпилировать на ICC7. На некоторое время помогло (просто объем выходного кода чуть уменьшился). Сейчас опять та же проблема (заполнение 57%). Осознаю, что компилятор не может осилить константы в верхней половине памяти. Поэтому переделал код таким образом, что все строковые константы расположил в начале, а доступ к ним - из одной-единственной подпрограммы. Не помогает. При анализе ассемблера нашел внутреннюю процедурку elpm32. Вставляется ближе к концу файла. Похоже, что она мне жизнь и отравляет. Победить как-нибудь можно?

В настройках проекта пробовал и разрешать, и запрещать RAMPZ/ELPM - без толку.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Даже не может, а наверняка.

Проблема в том, что архитектура AVR предполагает наличие только 2-байтных указателей(максимально адресуется 64 к). Когда появилась 128-я мега, разрядность счетчик команд увеличили, а указателей - невозможно. А я пока не могу угадать, когда компилятор пытается что-то грузить из флэша. То ли все же какие-то константы грузит, то ли таблицы переходов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В IARе была huge memory для этого и идентификаторы переменных __huge и __hugeflash.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не победил, но обошел :laughing:

В опциях проекта выделил верхнюю область памяти (0х10000.0х1Е000, дальше у меня бут-лодер, оформленный отдельным проектом). В эту область переместил большинство своих процедур. Таким образом освободилось место в нижней половине памяти для библиотечных функций (злополучная elpm32).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обозначте кусок памяти к которой Вы хотите обратится как __farflash. или используйте указатели типа __farflash unsigned char* для доступа к flash памяти за пределами 64к.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обозначте кусок памяти к которой Вы хотите обратится как __farflash...

Разве такое возможно в среде от ImageCraft ? Вероятно, всё дело в:

To access Flash memory beyond 64K bytes (e.g. on a M103 or M128), the ELPM instruction must be used in conjunction of setting the RAMPZ bit to 1. A check box ("Use ELPM") has been added to the Compiler Target Options page for this purpose. This is useful for bootloader that are in the high memory. Unfortunately, in the general case, the compiler cannot determine whether a pointer to the flash memory is pointing to the high or low memory. You must enable this check box manually if you are putting constant data in the high memory and you must set the RAMPZ bit yourself.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

...и предложение перенести часть кода в другой файл.
Может нужно просто указать выходной файл Intel EXTENDED :)

У Вас наверняка стоит просто Intel :) который рассчитан на описание только 64 кБайт кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...