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

 
 
> GCC, размещение переменной по фиксированному адресу
esaulenka
сообщение May 20 2015, 11:53
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 032
Регистрация: 13-03-08
Из: Маськва
Пользователь №: 35 877



Захотелось мне разместить переменную в самом конце используемой области флеш - после секций .text и .data.

И я не придумал ничего лучшего, как в скрипте линкера написать
Код
/*выше - секция .data */

    /* конец данных во флеш - кладём сюда контрольную сумму */
    .CheckSum :
        /*AT ( _sidata + SIZEOF ( .data ) )*/
        AT ( _sidata + (_edata - _sdata) )
    {
        . = ALIGN(4);
        KEEP(*(.CheckSum))
    } > FLASH

/*ниже - секция .bss*/

(пробовал оба варианта AT(), работает одинаково)

Код
__attribute__ ((section(".CheckSum")))
const uint32_t gCoreChksum = 0xAABBCCDD;



И получил следующее:
- в map-файле моя переменная имеет тот же адрес, что и начало .data
- в программе взятие адреса также возвращает адрес начала .data
- в скомпилированном бинарнике переменную явно видно в самом конце, как я и хотел. Адрес её при этом с не совпадает с тем, что написано в map'е.

Собственно, вопросы:

- я правильно понимаю, что нашёл баг в линкере?
Код
C:\Program Files\GNU Tools ARM Embedded\4.9 2015q1\bin>arm-none-eabi-ld.exe --version
GNU ld (GNU Tools for ARM Embedded Processors) 2.24.0.20150304

По хорошему, он должен работать единообразно. Или же единообразно не работать :-)

- (более насущный) как по-человечески сделать?

UPDATE
Вот так работает:
Код
    /* конец данных во флеш - кладём сюда контрольную сумму */
    .CheckSum  (_sidata + SIZEOF(.data)) :
    {
        . = ALIGN(4);
        KEEP(*(.CheckSum))
    } > FLASH


Плохо, что я никак концепцию этого странного скрипта не пойму...


--------------------
Тут обсуждается творческий порыв, а не соответствие каким-либо стандартам ©
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение May 20 2015, 12:17
Сообщение #2


Гуру
******

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



Вы можете написать просто
Код
    /* конец данных во флеш - кладём сюда контрольную сумму */
    .text.CheckSum :
    {
        . = ALIGN(4);
        KEEP(*(.CheckSum))
    } > FLASH

И оно ляжет вслед за всем предыдущим содержанием региона FLASH. Причем во избежание неприятных сюрпризов (типа выкидывания этой секции при генерации .hex) имя этой секции должно начинаться с .text.

А еще можно там же определить символ конца занятой памяти (для расчета этой самой контрольной суммы в программе):
Код
    /* конец данных во флеш - кладём сюда контрольную сумму */
    .text.CheckSum :
    {
        . = ALIGN(4);
        KEEP(*(.CheckSum))
        _image_end = .;
    } > FLASH



И еще - смею предположить, что в объявлении секций .bss и .data у вас тоже прописаны эти совершенно лишние AT(). Положитесь на линкер, он сам умеет размещять секции подряд:
Код
    .data :
    {
        . = ALIGN(4);
        _sdata = .;                /* start of .data label */
        *(.ramfunc)
        *(.ramfunc.*)
        *(.data)
        *(.data.*)
        . = ALIGN(4);
        _edata = .;                /* end of .data label */
    } > RAM AT > FLASH
    _sidata = LOADADDR(.data);    /* start of initialized data label */
    .bss (NOLOAD):
    {
        . = ALIGN(4);
        _sbss = .;                /* start of .bss label (for startup) */
         *(.bss)
         *(.bss.*)
         *(COMMON)
        . = ALIGN(4);
        _ebss = .;                /* end of .bss label (for startup) */
        _end = .;                /* end of used ram (start of free memory, for malloc) */
        __end = .;                /* the same */
    } > RAM


--------------------
На любой вопрос даю любой ответ
"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



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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 00:54
Рейтинг@Mail.ru


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