Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 128 мега, проблема при коде > 64к
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
yung
ICC6.31a Professional
Atmega128.
Исходный код разросся и при компиляции выскочила ошибка: 'text' area too large (>64K byte) и предложение перенести часть кода в другой файл. Заполнение 55%. Подергавшись и ничего не добившись, решил перекомпилировать на ICC7. На некоторое время помогло (просто объем выходного кода чуть уменьшился). Сейчас опять та же проблема (заполнение 57%). Осознаю, что компилятор не может осилить константы в верхней половине памяти. Поэтому переделал код таким образом, что все строковые константы расположил в начале, а доступ к ним - из одной-единственной подпрограммы. Не помогает. При анализе ассемблера нашел внутреннюю процедурку elpm32. Вставляется ближе к концу файла. Похоже, что она мне жизнь и отравляет. Победить как-нибудь можно?
В настройках проекта пробовал и разрешать, и запрещать RAMPZ/ELPM - без толку.
arttab
может указатель должен быть более 2Байтов?
yung
Даже не может, а наверняка.
Проблема в том, что архитектура AVR предполагает наличие только 2-байтных указателей(максимально адресуется 64 к). Когда появилась 128-я мега, разрядность счетчик команд увеличили, а указателей - невозможно. А я пока не могу угадать, когда компилятор пытается что-то грузить из флэша. То ли все же какие-то константы грузит, то ли таблицы переходов.
GDI
В IARе была huge memory для этого и идентификаторы переменных __huge и __hugeflash.
yung
Не победил, но обошел laughing.gif
В опциях проекта выделил верхнюю область памяти (0х10000.0х1Е000, дальше у меня бут-лодер, оформленный отдельным проектом). В эту область переместил большинство своих процедур. Таким образом освободилось место в нижней половине памяти для библиотечных функций (злополучная elpm32).
mempfis_
Обозначте кусок памяти к которой Вы хотите обратится как __farflash. или используйте указатели типа __farflash unsigned char* для доступа к flash памяти за пределами 64к.
Палыч
Цитата(mempfis_ @ Apr 6 2012, 13:45) *
Обозначте кусок памяти к которой Вы хотите обратится как __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.
prottoss
Цитата(yung @ Apr 6 2012, 13:46) *
...и предложение перенести часть кода в другой файл.
Может нужно просто указать выходной файл Intel EXTENDED sm.gif
У Вас наверняка стоит просто Intel sm.gif который рассчитан на описание только 64 кБайт кода.
prottoss
Мда, как всегда, получил свое, и в лес...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.