|
|
  |
Как исправить ошибку. |
|
|
|
Oct 9 2006, 11:49
|
Знающий
   
Группа: Свой
Сообщений: 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. Стеки увеличивал, не помогает.
|
|
|
|
|
Oct 9 2006, 13:42
|

Шаман
     
Группа: Модераторы
Сообщений: 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.
|
|
|
|
|
Oct 9 2006, 20:15
|
Частый гость
 
Группа: Новичок
Сообщений: 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
|
|
|
|
|
Oct 9 2006, 20:45
|

Гуру
     
Группа: Свой
Сообщений: 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. Только код ассемблеровский править придется, где идет прием пакета, и не факт, что он заработает...
--------------------
|
|
|
|
|
Oct 11 2006, 07:30
|
Знающий
   
Группа: Свой
Сообщений: 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-ах. Возможно как?
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|