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

 
 
> 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



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

 


RSS Текстовая версия Сейчас: 28th June 2025 - 08:23
Рейтинг@Mail.ru


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