Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: скрипт Linkera
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
Страницы: 1, 2
Vitaliy_ARM
Цитата(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


Не работает.
Vitaliy_ARM
После длительной переписки со службой поддержки выяснилось, что надо было делать совсем подругому, нежели в 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};
Инициализируется мусором!!! Почему???
Сергей Борщ
Цитата(Vitaliy_ARM @ Sep 14 2009, 11:17) *
После длительной переписки со службой поддержки выяснилось, что надо было делать совсем подругому, нежели в IAR5.x.
Вы конечно извините, но то, что вы показали и исходный ваш вопрос "Можно ли как-нибудь создать один регион памяти из двух кусков" имеют мало общего. Ибо вопрос подразумевает, что задаются два региона и одно описание выходной секции, а линкер впихивает сколько влезет в первый регион и остаток во второй. Вам же нужно было разместить секцию по конкретному адресу, а это совсем другой вопрос.

По поводу мусора - надо смотреть листинг и .map
Vitaliy_ARM
Цитата(Сергей Борщ @ 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

Как можно листинг посмотреть?
Vitaliy_ARM
После разговора со службой поддержики. И после того как я выслал свой проект к ним.
Получил информацию, что мой проект у них компилируется и зашивается нормально.
После разбора в чем может быть дело, оказалось что просто не зашиваются нужные регионы с константами в процессор.
Разбираемся дальше, почему.
alx2
Цитата(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 вроде бы как нельзя разделять их по разным регионам.
Неверный вывод. Разделять можно. Кстати, Вы не путаете секции и регионы? Это не одно и то же...
Vitaliy_ARM
Цитата(alx2 @ Sep 17 2009, 17:14) *
Наверное неправильно написан стартап-код, который и занимается инициализацией (как кариант, инициализация просто забыта, и эта секция просто остается неинициализированной).

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