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

 
 
> Использование своих секций при компиляции
zuuuuk
сообщение Nov 23 2016, 07:00
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 188
Регистрация: 26-04-07
Пользователь №: 27 334



Доброго времени суток.
Я применяю ARM freescale.
и в моем проекте я располагаю несколько функций в отдельной секции.
Код
uint8_t fn_ld () __attribute__ ((section(".name1")));
uint8_t fn_md () __attribute__ ((section(".name1")));
uint8_t fn_init () __attribute__ ((section(".name1")));

linker script
Код
..............
    .name1 :
    {
     . = ALIGN(4);
    *(.name1)
    . = ALIGN(4);
    } > m_name1
.............


Подскажите, а возможно расположить в одной секции несколько функций и переменную?
вот так
Код
uint8_t var __attribute__ ((section(".name1")));
uint8_t fn_ld () __attribute__ ((section(".name1")));
uint8_t fn_md () __attribute__ ((section(".name1")));
uint8_t fn_init () __attribute__ ((section(".name1")));


что для этого нужно поправить в коде или линковочном скрипте?





Прикрепленные файлы
Прикрепленный файл  attribute_electronix.zip ( 1.72 килобайт ) Кол-во скачиваний: 5
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Сергей Борщ
сообщение Nov 23 2016, 07:48
Сообщение #2


Гуру
******

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



QUOTE (zuuuuk @ Nov 23 2016, 10:00) *
Подскажите, а возможно расположить в одной секции несколько функций и переменную?
Можно. Если эта секция в ОЗУ или переменная константная и статическая.
QUOTE (zuuuuk @ Nov 23 2016, 10:00) *
что для этого нужно поправить в коде или линковочном скрипте?
Ничего не нужно править - достаточно того, что вы написали. Но есть один нюанс:

Наверняка ваша программа компилируется с ключами -function-sections и -fdata-sections, тогда ваш скрипт надо поправить вот так:
CODE
    *(.name1)
    *(.name1.*)
а переменные раскладывать в секции с разными именами, начинающимися на ".name1.":
QUOTE
uint8_t fn_ld () __attribute__ ((section(".name1.ld")));
uint8_t fn_md () __attribute__ ((section(".name1.md")));
uint8_t fn_init () __attribute__ ((section(".name1.init")));


Объясняю: с этими ключами компилятор выделает под каждую функцию (-function-sections) и переменную (-fdata-sections) свою секцию - .text.func1, .data.var1, .bss.var3 и т.д. Это позволяет линкеру по ключу -gc-sections удалять из выходного файла те секции, на которые нет ссылок, т.е. удалять неиспользуемые в программе переменные и функции. *(.name1.*) как раз и говорит линкеру "класть из всех файлов секции, начинающиеся на .name1." А размещение каждой вашей функции/переменной в отдельной секции позволит линкеру выкинуть все лишнее.

Тем не менее, очень интересно - что за задача заставляет вас вот так шаманить с секциями? Подозреваю, что написание загрузчика. В таком случае это делается совсем иначе. Если версия с загрузчиком подтвердится - распишу.


--------------------
На любой вопрос даю любой ответ
"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 Текстовая версия Сейчас: 7th September 2025 - 00:53
Рейтинг@Mail.ru


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