Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

GCC - мъки с линкера
http://mcu-bg.com/mcu_site/viewtopic.php?f=3&t=10113
Страница 1 от 1

Автор:  Цецо [ Сря Май 09, 2012 9:15 am ]
Заглавие:  GCC - мъки с линкера

Много оплетен тоя мануал.

1.
Как да разположа константи на фиксиран адрес във флеша?

__attribute__(("section_name"))???

Ама аз искам на точен адрес вътре в секцията. Има ли синтаксис дето да го разполага на точен адрес?


2.
Дефинирам си секция за разполагане на въпросните константи (стрингове за версии):

Код:
/* Versions strings section */
    .version :
    {
   . = ALIGN(4);
       *(.version)
   . = ALIGN(4);
    } >FLASH_VERSION


Освен това в линкера имам:

Код:
MEMORY
{
  RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 20K
  FLASH (rx) : ORIGIN = 0x08000000, LENGTH =  0xFC0
  FLASH_VERSION (r) : ORIGIN = 0x08000FC0, LENGTH = 0x40
}


В кода съм написал съответно това:

Код:
const char strBLVersion[16]  __attribute__ ((section (".version"))) = {"1.0.0"};
const char strProcessor[16]  __attribute__ ((section (".version"))) = {"STM32F103C8T6"};


Дотук добре, ама като тръгна да компилирам, ми се получава това:


Цитат:
section .version [08000fc0 -> 08000fdf] overlaps section .bss [08000f4c -> 08001383] DanHW6C_BOOT


Чии го търси .bss в региона 08000f4c -> 08001383???

в скрипта .bss е дефинирана така:

Код:
/* This is the uninitialized data section */
    .bss :
    {
       . = ALIGN(4);
        /* This is used by the startup in order to initialize the .bss secion */
        _sbss = .;
       
        *(.bss)
        *(COMMON)
       
       . = ALIGN(4);
       /* This is used by the startup in order to initialize the .bss secion */
       _ebss = . ;
    } >RAM
   
    PROVIDE ( end = _ebss );
    PROVIDE ( _end = _ebss );


Установих, че ако увелича размера на FLASH региона, така, че да побира и .bss секцията нещата се оправят. Айде иницилизационни променливи са. Реших че им трябва флеш регион за първоначално инициализиране. Намалих използването на .bss до минимум за сметка на .data. И получих следния отговор:

Цитат:
section .version [08000fc0 -> 08000fdf] overlaps section .data[08000... бла, бла


Е какво мама му стара дири .data в региона на флеша???

Автор:  woody [ Сря Май 09, 2012 11:07 am ]
Заглавие:  Re: GCC - разполагане на константи на фиксиран адрес

__attribute__((section(".version")))

За абсолютно позициониране можеш така:
Код:
        . = 0x00202000;
        __text_start = .;
        .text : {
                *(.vectors)
                *(.text)
                *(.rodata)
                *(.rodata.*)
        }
        __text_end = .;
        __text_size = __text_end - __text_start;


Обикновено има смисъл само една структура да е позиционирана на фиксиран адрес, така че слагаш отделна изходна секция за нея. Другата игра за позициониране е да направиш голям ALIGN-мент в линкер скрипта и така да си сигурен къде ще отиде.

KEEP е за да включи входните секции дори да нямаш никакви референции към тях (т.е. излишни са от гледна точка на линкера).

Автор:  Цецо [ Сря Май 09, 2012 11:10 am ]
Заглавие:  Re: GCC - мъки с линкера

Да това с keep-a го разбрах. С точното позициониране... ще се оправя по заобиколни начини :)

Автор:  woody [ Сря Май 09, 2012 11:13 am ]
Заглавие:  Re: GCC - мъки с линкера

Пусни си един .map файл и огледай какво се случва.

Автор:  Цецо [ Сря Май 09, 2012 11:33 am ]
Заглавие:  Re: GCC - мъки с линкера

Ми те го какво генерира в map-a.

Прикачени файлове:
DanHW6C_boot.map.txt [37.77 KiB]
191 пъти


Аз не виждам нищо ненормално в него...или поне нищо дето да подсказва, що чинят .bss или .data в региона на флеша.

Автор:  woody [ Сря Май 09, 2012 11:48 am ]
Заглавие:  Re: GCC - мъки с линкера

Изглежда ОК от птичи поглед. Не видях грешки (не помня дали ги отразяваше тях в .map файла) и като да е побрал всичко в секциите.
Ти сигурен ли си че тази грешка е точно от линкера а не нещо друго дето ти е набутано по веригата?

Автор:  Цецо [ Сря Май 09, 2012 11:54 am ]
Заглавие:  Re: GCC - мъки с линкера

Да. Засега се оказава май, че линкера е гърбав. Тоя е 4.3.2, сложих 4.4.1 и нещата си заспаха. :axe:

Сега ще видя да пробвам направо с 4.6, че то ми е време май...

П.С.

С 4.6.1 пък друго дърво:

http://old.nabble.com/-Bug-gas-13215--N ... 16436.html

Аман вече. Но като направих това което съветват, компилира и линква също без проблеми. Явно дъртия 4.3.2 има някакъв яд и аз естествено уцелих глухата акула.

Автор:  relsys [ Сря Май 09, 2012 3:34 pm ]
Заглавие:  Re: GCC - мъки с линкера

Ебати и мъката.....
Докато всичко може и би трябвало да изглежда така:

Код:
const aconst : array[10] of byte = (1,2,3,4,5,6,7,8,9,0); org $5678;


Но това е друга тема.

Примерът е с образователна цел, да не изпадаме в поредния безсмислен спор.... :partyman:

Автор:  woody [ Чет Май 10, 2012 10:44 am ]
Заглавие:  Re: GCC - мъки с линкера

relsys написа:
Ебати и мъката.....
Докато всичко може и би трябвало да изглежда така:

Код:
const aconst : array[10] of byte = (1,2,3,4,5,6,7,8,9,0); org $5678;

Всъщност въобще не.

Страница 1 от 1 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/