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

 
 
> Использование своих секций при компиляции
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
Ответов
zuuuuk
сообщение Nov 23 2016, 10:00
Сообщение #2


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

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



дело в том, что передо мной стоит задача обновления устройства на базе ARM freescale.

Но канал для обновления медленный. Поэтому принято решение обновлять частично.
Я хочу создать программный модуль.
вот map файл
Код
.mod1           0x0000cc60       0x7c
                0x0000cc60                . = ALIGN (0x4)
*(.name1.all)
.name1.all     0x0000cc60       0x14 ./Sources/mod1.o
                0x0000cc60                fn_all
*(.name1.*)
.name1.var     0x0000cc74        0x1 ./Sources/mod1.o
*fill*         0x0000cc75        0x3
.name1.init    0x0000cc78       0x1c ./Sources/mod1.o
                0x0000cc78                fn_init
.name1.ld      0x0000cc94       0x24 ./Sources/mod1.o
                0x0000cc94                fn_ld
.name1.md      0x0000ccb8       0x24 ./Sources/mod1.o
                0x0000ccb8                fn_md
*(.name1)
                0x0000ccdc                . = ALIGN (0x4)


где функция fn_all () имеет фиксированный адрес и она вызывается из основной программы.
а все остальные функции могут меняться .
Код
uint8_t fn_all () {
  fn_ld ();
  fn_md ();
  return 0;
}


такой модуль будет меньше чем вся программа.
и замену производить только этого модуля.
вот примерно так..



Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 23 2016, 11:36
Сообщение #3


Гуру
******

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



QUOTE (zuuuuk @ Nov 23 2016, 13:00) *
а все остальные функции могут меняться .
Но ведь если изменится функция - изменится ее длина и изменится адрес следующей функции. Тогда надо делать таблицу с точками входа во все эти функции и все функции вызывать через эту таблицу и таблицу обновлять при замене любой функции. Но ведь кроме вашего кода существуют еще и библиотечные функции, без которых ваш код работать не сможет и которые компилятор пихает в секцию .text и каждый раз в разном порядке.
А обновляемые функции у вас меняются по одной в случайное время или все скопом?


--------------------
На любой вопрос даю любой ответ
"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
AVI-crak
сообщение Nov 24 2016, 01:31
Сообщение #4


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

Группа: Участник
Сообщений: 182
Регистрация: 16-10-15
Пользователь №: 88 894



Есть вариант - внешние функции на внешней памяти запускаемые по внешнему событию (буквально). В этом случае каталог функций можно разместить на внешней памяти, будет одна точка входа. Определение номера внешней функции для запуска - универсальное, описывается как изменяемое внешним процессом, в этом случае gcc не оптимизирует этот код до нуля. Ну и естественно варианты: исполнять код по месту хранения, или предварительно копировать в память - от этого зависит способ компиляции.
Чем дальше в лес, тем больше дров можно наломать. Часто проще менять всю прошивку, даже если она весит гигабайты.
Go to the top of the page
 
+Quote Post



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

 


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


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