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

 
 
4 страниц V  « < 2 3 4  
Reply to this topicStart new topic
> скрипт Linkera
amw
сообщение Apr 30 2009, 15:33
Сообщение #46


Знающий
****

Группа: Свой
Сообщений: 601
Регистрация: 22-09-05
Из: Kharkov
Пользователь №: 8 847



Цитата(_Pasha @ Apr 30 2009, 11:54) *
Подскажите, уважаемые, как бороться с такой чепухой: (WinAVR-20090313)

Пишу софтину с printf_P периодически выскакивает error: relocation truncated to fit для фрагментов с его использованием.
меняю порядок компиляции файлов - все попускает. Можно ли заставить линкер как-то перетасовать объектники автоматиццки?

Автоматически он делает в том порядке, в каком файлы указаны в командной строке.
Вероятно память у Вас разбита на нескольков кусков в скрипте? Какие-то секции идут в один кусок, другие в другой. Ну если у Вас действительно так, то ошибка вполне законна. Добавили код - перестало влазить, что-то поменяли - размер уменьшился - опять влазит.
Или вот такое
http://www.motherboardpoint.com/relocation...ans-t94967.html

Сообщение отредактировал amw - Apr 30 2009, 15:38


--------------------
- А мораль отсюда такова: всякому овощу свое время. Или, хочешь, я это сформулирую попроще: никогда не думай, что ты иная, чем могла бы быть иначе, чем будучи иной в тех случаях, когда иначе нельзя не быть.
© Lewis Carroll. Alice's adventures in wonderland.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 30 2009, 20:33
Сообщение #47


Гуру
******

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



Цитата(_Pasha @ Apr 30 2009, 11:54) *
Пишу софтину с printf_P периодически выскакивает error: relocation truncated to fit для фрагментов с его использованием.
Это не оно?


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Pasha
сообщение May 3 2009, 12:23
Сообщение #48


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Всем спасибо.

Отключил -mshort-calls проблема ушла. На том и остановился, поскольку почти влез в 60%  флеша
Go to the top of the page
 
+Quote Post
SysRq
сообщение May 3 2009, 13:20
Сообщение #49


Чайник, 1 литр
****

Группа: Свой
Сообщений: 655
Регистрация: 17-05-06
Из: Moscow
Пользователь №: 17 168



Цитата(_Pasha @ May 3 2009, 16:23) *
Отключил -mshort-calls проблема ушла. На том и остановился...
Я аналогично сделал (m128 забита на 80%) :(
Но чуть позднее в TODO добавил посмотрть эффект ключей оптимизации:
Цитата
-freorder-blocks
-freorder-blocks-and-partition
-freorder-functions
-ftoplevel-reorder
однако пока так и не добрался проверить, помогут ли они сохранить отсутствие jmp.
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Sep 7 2009, 13:04
Сообщение #50


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Можно ли как-нибудь создать один регион памяти из двух кусков,
например что-то вроде:

Код
MFlash512 (rx)     : (ORIGIN = 0x20000, LENGTH = 0x1000) OR (ORIGIN = 0x40000, LENGTH = 0x1000)

help.gif????


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Sep 10 2009, 10:52
Сообщение #51


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(Vitaliy_ARM @ Sep 7 2009, 17:04) *
Можно ли как-нибудь создать один регион памяти из двух кусков,
например что-то вроде:

Код
MFlash512 (rx)     : (ORIGIN = 0x20000, LENGTH = 0x1000) OR (ORIGIN = 0x40000, LENGTH = 0x1000)

help.gif????


Написал этот вопрос в поддержку. Посмотрим, что ответят.

Получил ответ smile.gif
Цитата
Hi,

You just need to change ".boot" to ".text" in your linker script.

Full details on linker scripts can be found in the documentation at:
Help->Help Contents
Code Red Technologies Documentation
Tools Documentation
GNU Linker
Section 3 "Linker Scripts"

Best regards,


Попробовал поменять:

Код
    .text : /* .boot*/
    {
        KEEP(*(.isr_vector));
        KEEP(*(.crp_key));
        KEEP(*(.macaddr));
        KEEP(*(.ipaddr));
            
    } > BOOTMEM

    .text :
    {
        *(.text*)
        *(.rodata*)
    } > MFlash512


Не работает.


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Sep 14 2009, 08:17
Сообщение #52


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



После длительной переписки со службой поддержки выяснилось, что надо было делать совсем подругому, нежели в IAR5.x.
Код
MEMORY
{
  /* Define each memory region */
  CODE_MEM (rx)       : ORIGIN = 0x0,         LENGTH = 0x00003000
  MAC_IP_MEM(rx)    : ORIGIN = 0x00003000,     LENGTH = 0x00002000
  Ram32 (rwx)         : ORIGIN = 0x40000000,     LENGTH = 0x8000     /* 32k */
  RAM_ETH_16 (rwx)     : ORIGIN = 0x7fe00000,     LENGTH = 0x4000     /* 16k */
  RAM_USB_8 (rwx)     : ORIGIN = 0x7fd00000,     LENGTH = 0x2000     /* 8k */
  RAM_RTC_2 (rwx)     : ORIGIN = 0xe0084000,     LENGTH = 0x800     /* 2k */
}

.text :
{
     KEEP(*(.isr_vector));   /*вектора прерываний*/
     . = 0x000001FC;         /*смещение указателя на адрес CRP*/
    KEEP(*(.crp_key));      /*секция CRP*/
    *(.text*)                     /*код программы*/
    *(.rodata*)                 /*константы*/
} > CODE_MEM

.MacIpMem :   /*. = 0x00003000;*/
{
  
    KEEP(*(.macaddr))      /*размещаем по адресу 0x00003000*/
        . = 0x00001000;          /*переход на адрес 0x00001000;*/
        KEEP(*(.ipaddr))    /*размещаем по адресу 0x00004000*/
} > MAC_IP_MEM


Вот так почти правильно размещать свой код в разные областя памяти.
Теперь про почти:
Инициализируемая константа находится в исходнике, задается следующим образом:
const BYTE OurMacAddr[6] __attribute__ ((section(".macaddr"))) = {0x00,0x01,0x02,0x03,0x04,0x06};
Инициализируется мусором!!! Почему???


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 14 2009, 08:54
Сообщение #53


Гуру
******

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



Цитата(Vitaliy_ARM @ Sep 14 2009, 11:17) *
После длительной переписки со службой поддержки выяснилось, что надо было делать совсем подругому, нежели в IAR5.x.
Вы конечно извините, но то, что вы показали и исходный ваш вопрос "Можно ли как-нибудь создать один регион памяти из двух кусков" имеют мало общего. Ибо вопрос подразумевает, что задаются два региона и одно описание выходной секции, а линкер впихивает сколько влезет в первый регион и остаток во второй. Вам же нужно было разместить секцию по конкретному адресу, а это совсем другой вопрос.

По поводу мусора - надо смотреть листинг и .map


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Sep 14 2009, 09:42
Сообщение #54


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(Сергей Борщ @ Sep 14 2009, 12:54) *
Вы конечно извините, но то, что вы показали и исходный ваш вопрос "Можно ли как-нибудь создать один регион памяти из двух кусков" имеют мало общего. Ибо вопрос подразумевает, что задаются два региона и одно описание выходной секции, а линкер впихивает сколько влезет в первый регион и остаток во второй. Вам же нужно было разместить секцию по конкретному адресу, а это совсем другой вопрос.
По поводу мусора - надо смотреть листинг и .map


Как я понял, вектора прерываний и код должны сидеть в одной секции. У меня в проекте Iar, секции располагались следующим образом:
- Вектора прерываний
- CRP ключ
- Основной код
- MAC адрес
- IP адрес
В IAR каждая секция у меня сидела в своем регионе памяти. Между векторами и основным кодом сидела секция CRP. Но в GNU Linker вроде бы как нельзя разделять их по разным регионам. Поэтому я решил что можно выйти из этой ситуации, создав секцию .text из двух кусков (поэтому так и задал этот вопрос. laughing.gif, про операцию = ADDR. не догадывался ). Один кусок расположить в свободной области между векторами и CRP, а второй после CRP. Однако так тут так тоже нельзя делать.
А надо было выделить один регион памяти и напихать туда по очереди все секции, а адреса смещать при помощи операции .= ADDR.
Собственно как тут и сделано:
Код
    .text :
    {
    KEEP(*(.isr_vector));
    . = 0x000001FC;
        KEEP(*(.crp_key));
        *(.text*)
        *(.rodata*)
    } > CODE_MEM


Цитата(Сергей Борщ @ Sep 14 2009, 12:54) *
По поводу мусора - надо смотреть листинг и .map

Про map смотреть сюда?:
Код
.MacIpMem       0x00003000     0x1004
*(.macaddr)
.macaddr       0x00003000        0x6 ./src/Emac.o
                0x00003000                OurMacAddr

Как можно листинг посмотреть?


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Sep 15 2009, 11:16
Сообщение #55


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



После разговора со службой поддержики. И после того как я выслал свой проект к ним.
Получил информацию, что мой проект у них компилируется и зашивается нормально.
После разбора в чем может быть дело, оказалось что просто не зашиваются нужные регионы с константами в процессор.
Разбираемся дальше, почему.


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post
alx2
сообщение Sep 17 2009, 13:14
Сообщение #56


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091



Цитата(Vitaliy_ARM @ Sep 14 2009, 13:17) *
Инициализируемая константа находится в исходнике, задается следующим образом:
const BYTE OurMacAddr[6] __attribute__ ((section(".macaddr"))) = {0x00,0x01,0x02,0x03,0x04,0x06};
Инициализируется мусором!!! Почему???
Наверное неправильно написан стартап-код, который и занимается инициализацией (как кариант, инициализация просто забыта, и эта секция просто остается неинициализированной). Кстати, а что говорит objdump -d -j .macaddr <объектный файл> ? Может там вообще этой секции нет? smile.gif
Цитата(Vitaliy_ARM @ Sep 14 2009, 14:42) *
Как я понял, вектора прерываний и код должны сидеть в одной секции.
Совершенно необязательно. Хотите - размещайте в одной, хотите - в разных.
Цитата(Vitaliy_ARM @ Sep 14 2009, 14:42) *
В IAR каждая секция у меня сидела в своем регионе памяти. Между векторами и основным кодом сидела секция CRP. Но в GNU Linker вроде бы как нельзя разделять их по разным регионам.
Неверный вывод. Разделять можно. Кстати, Вы не путаете секции и регионы? Это не одно и то же...


--------------------
Всего наилучшего,
Alex Mogilnikov
Go to the top of the page
 
+Quote Post
Vitaliy_ARM
сообщение Sep 21 2009, 08:17
Сообщение #57


Знающий
****

Группа: Свой
Сообщений: 509
Регистрация: 19-07-07
Из: г. Таганрог
Пользователь №: 29 246



Цитата(alx2 @ Sep 17 2009, 17:14) *
Наверное неправильно написан стартап-код, который и занимается инициализацией (как кариант, инициализация просто забыта, и эта секция просто остается неинициализированной).

Эти константы находятся во флешь.
У меня проблема несколько в другом. Мой код отлично работает у службы поддержки Code-Red. А у меня тупо не зашиваются эти константы в процессор.
Уже несколько дней разбираемся в чем может быть дело. unsure.gif


--------------------
Умные речи подобны строкам, напечатанным курсивом. К. Прутков
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 03:34
Рейтинг@Mail.ru


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