Jump to content

    
Sign in to follow this  
yung

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

Recommended Posts

ICC6.31a Professional

Atmega128.

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
Обозначте кусок памяти к которой Вы хотите обратится как __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.

Share this post


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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this