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

 
 
 
Reply to this topicStart new topic
> Как исправить ошибку.
Oleg_IT
сообщение Oct 9 2006, 05:45
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Перевожу программы из ATMega32 в ATMega128. Компилятор победил, а линковщик даёт ошибку
Error[e16]: Segment TINY_Z (size: 0x16 align: 0) is too long for segment definition. At least 0x16 more bytes needed. The problem occurred while
processing the segment placement command "-Z(DATA)TINY_I,TINY_Z,TINY_N=_..X_SRAM_TBASE:+_..X_SRAM_TSIZE", where at the moment of
placement the available memory ranges were "DATA:0--1"

Не пойму как исправить.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Oct 9 2006, 11:35
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(Oleg_IT @ Oct 9 2006, 08:45) *
Перевожу программы из ATMega32 в ATMega128. Компилятор победил, а линковщик даёт ошибку
Error[e16]: Segment TINY_Z (size: 0x16 align: 0) is too long for segment definition. At least 0x16 more bytes needed. ...Не пойму как исправить.

А в проекте какой контроллер указан?
А модель памяти?


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 9 2006, 11:49
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(Dog Pawlowa @ Oct 9 2006, 15:35) *
Цитата(Oleg_IT @ Oct 9 2006, 08:45) *

Перевожу программы из ATMega32 в ATMega128. Компилятор победил, а линковщик даёт ошибку
Error[e16]: Segment TINY_Z (size: 0x16 align: 0) is too long for segment definition. At least 0x16 more bytes needed. ...Не пойму как исправить.

А в проекте какой контроллер указан?
А модель памяти?


Контроллер ATMega128, модель памяти Small, CSTACK 0x20, RSTACK 16. Стеки увеличивал, не помогает.
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Oct 9 2006, 13:42
Сообщение #4


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Oleg_IT @ Oct 9 2006, 08:45) *
The problem occurred while processing the segment placement command "-Z(DATA)TINY_I,TINY_Z,TINY_N=_..X_SRAM_TBASE:+_..X_SRAM_TSIZE", where at the moment of
placement the available memory ranges were "DATA:0--1"

Всё дело в том, что память тини в мега128 физически отсутствует, т. к. перекрывается пространством регистров внутренней периферии.
Расположите сегменты TINY_I,TINY_Z,TINY_N не в отдельном диапазоне _..X_SRAM_TBASE:+_..X_SRAM_TSIZE, а вместе с другими сегментами.
Правку придётся делать в xcl файле, а не в настройках среды.
В программе не располагайте переменные в области __tiny.
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 9 2006, 13:48
Сообщение #5


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Большие массивы я во __flash помещаю. А как понять, что переменная в области __tiny лежит?
Во заимствованном коде есть
#ifndef USB_BUFFER_SECTION
# define USB_BUFFER_SECTION "TINY_Z" /* if user has not selected a named section */
#endif

Может это мешает? Если да, то как это исправить?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 9 2006, 15:03
Сообщение #6


Гуру
******

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



Цитата(Oleg_IT @ Oct 9 2006, 21:48) *
Большие массивы я во __flash помещаю. А как понять, что переменная в области __tiny лежит?
Во заимствованном коде есть
#ifndef USB_BUFFER_SECTION
# define USB_BUFFER_SECTION "TINY_Z" /* if user has not selected a named section */
#endif
Может это мешает? Если да, то как это исправить?
ЭТО ни как не мешает, потому что ЭТО - всего лишь препроцессор языка Си...

Вот ежели бы вы привели объявления глобальных переменных, и к чему ЭТО применяется, можно было бы чего то толкового сказать...


--------------------
Go to the top of the page
 
+Quote Post
exSSerge
сообщение Oct 9 2006, 20:15
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 136
Регистрация: 18-08-06
Из: Novosibirsk
Пользователь №: 19 655



Цитата(Oleg_IT @ Oct 9 2006, 20:48) *
Большие массивы я во __flash помещаю. А как понять, что переменная в области __tiny лежит?
Во заимствованном коде есть
#ifndef USB_BUFFER_SECTION
# define USB_BUFFER_SECTION "TINY_Z" /* if user has not selected a named section */
#endif

Может это мешает? Если да, то как это исправить?


Очевидно, определить в коде
#define USB_BUFFER_SECTION "NEAR_Z"

или на вкладке compiler options -> Preprocessor.

Судя по виду эта USB_BUFFER_SECTION скорее всего используется в программе примерно так:
#pragma dataseg=USB_BUFFER_SECTION

Только этим дело скорее всего не ограничится, так как есть ещё TINY_N, TINY_I, TINY_HEAP, TINY_ID.
Описаны в EWAVR_CompilerReference.pdf.
А ещё редко какая программа обходится без указателей, они тоже будут разными (размером 1 или 2 байта).

Есть ещё одно решение - попросту убрать из текста все явные указания в каком сегменте размещать переменные, поскольку в случае с Мегой128 сегмента TINY просто нет, вся память будет NEAR и без явного указания, по умолчанию.
Но обьявления указателей и корректную работу с ними (особенно всякие явные и неявные преобразования типов) проверять придётся.

Сообщение отредактировал exSSerge - Oct 9 2006, 20:18
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 9 2006, 20:45
Сообщение #8


Гуру
******

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



Цитата(Oleg_IT @ Oct 9 2006, 21:48) *
#ifndef USB_BUFFER_SECTION
# define USB_BUFFER_SECTION "TINY_Z" /* if user has not selected a named section */
#endif
Что то знакомое...Уж не c http://obdev.at ли вы драйвер USB мучаете?)))

Если так, то там определен буфер приема,

Код
__no_init UCHAR usbRxBuf[2][USB_BUFSIZE] __attribute__ ((section (USB_BUFFER_SECTION))) IAR_SECTION(USB_BUFFER_SECTION);
как раз для TINY сегмента, что бы можно быстро использовать указатель с использованием 8-и разрядного адреса. В меге128, скорее всего не получится ТАК использовать, там SRAM начинается с 0х0100. Можно попробовать убрать с буфера атрибут "TINY_Z", определить для буфера адрес в памяти, чтобы начинался с 0хХХ00. Только код ассемблеровский править придется, где идет прием пакета, и не факт, что он заработает...


--------------------
Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Oct 11 2006, 07:30
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709



Цитата(prottoss @ Oct 10 2006, 00:45) *
Что то знакомое...Уж не c http://obdev.at ли вы драйвер USB мучаете?)))


Да, это из этого проекта. Я с атрибутами никогда не работал поэтому затрудняюсь в исправлении. Простое удаление __attribute__ ((section (USB_BUFFER_SECTION))) IAR_SECTION(USB_BUFFER_SECTION) даёт ошибку компиляции. Хорошо бы переработать код так, что бы он работал на всех AVR-ах. Возможно как?
Go to the top of the page
 
+Quote Post
prottoss
сообщение Oct 11 2006, 08:18
Сообщение #10


Гуру
******

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



Цитата(Oleg_IT @ Oct 11 2006, 15:30) *
Цитата(prottoss @ Oct 10 2006, 00:45) *

Что то знакомое...Уж не c http://obdev.at ли вы драйвер USB мучаете?)))


Да, это из этого проекта. Я с атрибутами никогда не работал поэтому затрудняюсь в исправлении. Простое удаление __attribute__ ((section (USB_BUFFER_SECTION))) IAR_SECTION(USB_BUFFER_SECTION) даёт ошибку компиляции. Хорошо бы переработать код так, что бы он работал на всех AVR-ах. Возможно как?
Мне пока некогда эти заниматься, о возможном пути решения я написал выше в посте... Может стоит связаться с автором проекта?


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

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

 


RSS Текстовая версия Сейчас: 19th July 2025 - 09:20
Рейтинг@Mail.ru


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