|
не получается объявить сегменты |
|
|
|
Mar 20 2007, 15:10
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191

|
Пишу в файл линковки: -Z(CODE)INTVEC,NEAR_F,INITTAB,TINY_ID,NEAR_ID,SWITCH,CODE=0000-1FFE /* Correct */ -Z(CODE)CHECKSUM=1FFF-1FFF /* In this example a two byte checksum */
-Z(DATA)TINY_I,TINY_Z=60-FF -Z(DATA)NEAR_I,NEAR_Z=60-25F -Z(DATA)CSTACK=60-25F -Z(DATA)RSTACK#25F
Линкер выдает следующие ошибки: Error[e16]: Segment TINY_I (size: 0xb align: 0) is too long for segment definition. At least 0xb more bytes needed.
и т.д... для каждого сегмента, расположенного в RAM. Rак будто бы линкер не понимает, что TINY_I лежит в ОЗУ, а не в ПЗУ...
В чем я могу ошибаться, или что я не делаю, что нужно делать?
|
|
|
|
|
 |
Ответов
(1 - 6)
|
Mar 20 2007, 18:28
|

Участник

Группа: Участник
Сообщений: 63
Регистрация: 11-11-06
Из: Екатеринбург
Пользователь №: 22 191

|
Цитата(Сергей Борщ @ Mar 20 2007, 18:53)  Почему же? Он просто пишет что памяти не хватило. Покажите весь файл .xcl и убедитесь, что у вас в настройках проекта снята галочка configure system using dialogs (not in .xcl file) Сергей, галочка установлена! Нашел вот такую ссылочку, объясняющую, почему надо снять эту галочку. Завтра попробую все это сделать. Спасибо за совет!
|
|
|
|
|
May 4 2008, 12:09
|

Частый гость
 
Группа: Новичок
Сообщений: 153
Регистрация: 29-03-07
Из: Саратов
Пользователь №: 26 613

|
У меня та же ошибка. Галочку и устанавливал и снимал - все едино. Вот мой файл линковки. Код -! Определение сегментов для ATmega103 -!
-! Определяем семейство процессоров -!
-ca90
-Fintel-extended -! -Y0 -! -xms
-l _release\code.map -Ic:\creator\avriarew22\A90\LIB\
-! Хотя стек возвратов и расположен в ISRAM мы используем эту -! -! директиву для разрешения доступа ESRAM с ожиданием -! -e?RSTACK_IN_EXTERNAL_RAM=?C_STARTUP
-! Адресное пространство памяти программ -! -Z(CODE)INTVEC=0-FF -Z(CODE)RCODE,CDATA0,CDATA1,CCSTR,SWITCH,FLASH,CODE=100-1FFFF
-! Адресное пространство данных (internal EEPROM) -! -! Регистры общего назначения: 0-1F -! -! Пространство адресов портов ввода/вывода: 20-5F -! -Z(DATA)IDATA0,UDATA0=60-FF -Z(DATA)RSTACK+100=100-1FF -Z(DATA)CSTACK+200=200-3FF -Z(DATA)UDATA1=400-0FFF -Z(DATA)IDATA1,ECSTR=1000-7FFF
-! Адресное пространство данных (external EEPROM) -! -Z(DATA)NO_INIT=8000-8FFF
-! Адресное пространство данных (external PROM) -! -Z(DATA)CSTR,CONST=9000-FFFF
-e_small_write=_formatted_write -e_small_write_P=_formatted_write_P
-e_small_read=_formatted_read -e_small_read_P=_formatted_read_P
-! Suppress one warning which is not relevant for this processor -! -w29
-! Now load the 'C' library -!
-C cl3s
Сообщение отредактировал Freeze Anti - May 4 2008, 12:10
--------------------
!!! All you need is LOVE !!!
|
|
|
|
|
May 4 2008, 15:30
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Freeze Anti @ May 4 2008, 15:09)  У меня та же ошибка. Линкер английским по белому пишет - программа не влезает в память. Универсального рецепта исправления этой ошибки нет и быть не может. Если ругается на сегменты ОЗУ - уменьшайте количество глобальных переменных, уменьшайте размер стека до необходимого. Если на сегменты во флеш - оптимизируйте программу, включайте более высокий уровень оптимизации, в крайнем случае - переписывайте какие-то куски на ассемблере или уменьшайте функциональность устройства.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 5 2008, 09:30
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Freeze Anti @ May 5 2008, 12:03)  на все в сумме вроде места хватает, а почему-то непосредственно для TINY_I - нет... Какие-то чудеса вы рассказываете. Не верю. Попробуйте в старом файле указать размер ОЗУ больше, чем его на самом деле, слинкуйте и посмотрите, сколько места заняли эти сегменты, в каких адресах, и что в них попало. Ищите разницу с вашим теперешним вариантом. Наверняка найдете что-нибудь интересное. На всякий случай: сегменты TINY_... в рабочей программе должны располагаться до адреса 0x100 - при косвенном доступе к ним старший байт адресной пары обнулен.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|