реклама на сайте
подробности

 
 
> 128 мега, проблема при коде > 64к
yung
сообщение Apr 6 2012, 07:46
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 25-03-05
Из: Рязань
Пользователь №: 3 669



ICC6.31a Professional
Atmega128.
Исходный код разросся и при компиляции выскочила ошибка: 'text' area too large (>64K byte) и предложение перенести часть кода в другой файл. Заполнение 55%. Подергавшись и ничего не добившись, решил перекомпилировать на ICC7. На некоторое время помогло (просто объем выходного кода чуть уменьшился). Сейчас опять та же проблема (заполнение 57%). Осознаю, что компилятор не может осилить константы в верхней половине памяти. Поэтому переделал код таким образом, что все строковые константы расположил в начале, а доступ к ним - из одной-единственной подпрограммы. Не помогает. При анализе ассемблера нашел внутреннюю процедурку elpm32. Вставляется ближе к концу файла. Похоже, что она мне жизнь и отравляет. Победить как-нибудь можно?
В настройках проекта пробовал и разрешать, и запрещать RAMPZ/ELPM - без толку.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
arttab
сообщение Apr 6 2012, 08:16
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



может указатель должен быть более 2Байтов?


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
yung
сообщение Apr 6 2012, 08:28
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 25-03-05
Из: Рязань
Пользователь №: 3 669



Даже не может, а наверняка.
Проблема в том, что архитектура AVR предполагает наличие только 2-байтных указателей(максимально адресуется 64 к). Когда появилась 128-я мега, разрядность счетчик команд увеличили, а указателей - невозможно. А я пока не могу угадать, когда компилятор пытается что-то грузить из флэша. То ли все же какие-то константы грузит, то ли таблицы переходов.
Go to the top of the page
 
+Quote Post
GDI
сообщение Apr 6 2012, 08:52
Сообщение #4


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



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


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
yung
сообщение Apr 6 2012, 09:16
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 25-03-05
Из: Рязань
Пользователь №: 3 669



Не победил, но обошел laughing.gif
В опциях проекта выделил верхнюю область памяти (0х10000.0х1Е000, дальше у меня бут-лодер, оформленный отдельным проектом). В эту область переместил большинство своих процедур. Таким образом освободилось место в нижней половине памяти для библиотечных функций (злополучная elpm32).
Go to the top of the page
 
+Quote Post
mempfis_
сообщение Apr 6 2012, 09:45
Сообщение #6


Профессионал
*****

Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409



Обозначте кусок памяти к которой Вы хотите обратится как __farflash. или используйте указатели типа __farflash unsigned char* для доступа к flash памяти за пределами 64к.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Apr 6 2012, 10:25
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(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.
Go to the top of the page
 
+Quote Post
prottoss
сообщение Apr 6 2012, 13:14
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Цитата(yung @ Apr 6 2012, 13:46) *
...и предложение перенести часть кода в другой файл.
Может нужно просто указать выходной файл Intel EXTENDED sm.gif
У Вас наверняка стоит просто Intel sm.gif который рассчитан на описание только 64 кБайт кода.


--------------------
Go to the top of the page
 
+Quote Post
yung
сообщение Apr 6 2012, 13:52
Сообщение #9


Местный
***

Группа: Свой
Сообщений: 207
Регистрация: 25-03-05
Из: Рязань
Пользователь №: 3 669



Мой выбор sm.gif
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
prottoss
сообщение Apr 6 2012, 15:27
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 720
Регистрация: 24-03-05
Пользователь №: 3 659



Мда, как всегда, получил свое, и в лес...


--------------------
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 15:36
Рейтинг@Mail.ru


Страница сгенерированна за 0.015 секунд с 7
ELECTRONIX ©2004-2016