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

 
 
 
Reply to this topicStart new topic
> Переопределить дефолтные секции.
jcxz
сообщение Sep 13 2014, 08:55
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Подскажите пожалуйста: можно-ли в IAR переопределить дефолтные секции кода/данных для конкретного файла?
Типа #pragma location = ".some_section", но только не для конкретной функции/переменной, а для всего файла.
А то что-то в мануале к компилятору не найду.... sad.gif
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 13 2014, 11:16
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



iobjmanip

Цитата
This example renames the section .example in input.o to .example2 and stores the result in output.o:

iobjmanip --rename_section .example=.example2 input.o output.o
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 13 2014, 14:01
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(scifi @ Sep 13 2014, 17:16) *
iobjmanip

хм... И куда это вставить? В .icf?
Если компилить из батника то ясно, но в проекте IAR? Надо же между компилёром и линкером.
Да - и нужно всё-таки в исходниках, так как переопределять или нет секцию должно управляться в зависимости от значения некоторого #define (#ifdef..).
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 14 2014, 22:22
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Sep 13 2014, 18:01) *
Если компилить из батника то ясно, но в проекте IAR?
Да - и нужно всё-таки в исходниках, так как переопределять или нет секцию должно управляться в зависимости от значения некоторого #define (#ifdef..).

"Дайте воды напиться, а то так кушать хочется, что переночевать негде" :-)
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 15 2014, 07:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Ну мне изначально и нужно было чтобы, если некий define определён, то устанавливались нестандартные секции для CODE/DATA,
если не определён - дефолтные секции.
Сейчас это решено через использование по всему файлу #pragma location = TEXT_SECTION перед каждой функцией (и соответствующей своей строки для переменных).
Ну а значение TEXT_SECTION задаётся в зависимости от определения или неопределения некоего define (".text" или ".textN").
Но хотелось бы без этой грязи по всему тексту, а в одном месте - в начале файла.

В CCS такая возможность имеется:
#pragma SET_CODE_SECTION ("section name")
#pragma SET_DATA_SECTION ("section name")


Может в IAR тоже есть?
Go to the top of the page
 
+Quote Post
den_po
сообщение Sep 15 2014, 08:05
Сообщение #6


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

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



"грязь" можно украсить, сунув прагму в макрос. для этого есть вариант _Pragma()
Go to the top of the page
 
+Quote Post
SSerge
сообщение Sep 15 2014, 08:43
Сообщение #7


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

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Переопределить секции можно ключом компилятора:
--section OldName=NewName
добавив их в Options->C/C++Compiler->Extra Options

Чтобы не упражняться с дефайнами, может быть проще будет кроме Debug и Release создать несколько конфигураций с разными настройками (Project->Edit Configurations...).
В каждой конфигурации можно задать необходимые настройки, в том числе и определить символы (в разделе Options->C/C++Compiler->Preprocessor), тогда можно будет собирать проект с разными настройками без правки текстов.

Кстати, при компиляции можно получить доступ к символам, определённым в .icf, если определять их с помощью директив
define [ exported ] symbol name = expr;
или
export symbol name;



--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 15 2014, 11:31
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(den_po @ Sep 15 2014, 14:05) *
"грязь" можно украсить, сунув прагму в макрос. для этого есть вариант _Pragma()

Её станет меньше, но она останется wink.gif
Очень неудобно перед каждой функцией и после каждой переменной писать имя секции. Особенно когда их в файле - десятки.
И постоянно забываешь это сделать.

Цитата(SSerge @ Sep 15 2014, 14:43) *
Переопределить секции можно ключом компилятора:
--section OldName=NewName
добавив их в Options->C/C++Compiler->Extra Options
Чтобы не упражняться с дефайнами, может быть проще будет кроме Debug и Release создать несколько конфигураций с разными настройками (Project->Edit Configurations...).
В каждой конфигурации можно задать необходимые настройки, в том числе и определить символы (в разделе Options->C/C++Compiler->Preprocessor), тогда можно будет собирать проект с разными настройками без правки текстов.

О! Это хороший совет! спасибо!
У меня кстати как раз и определено несколько вариантов сборки (FLASH_DEBUG, RAM_DEBUG, FLASH_RELEASE, RAM_RELEASE),
и нужный мне дефайн (определяющий в какие секции памяти какие выходные секции компоновать) он и указывается в Extra options.
При выборе вариантов с RAM_.., он как раз компоновал readonly-секции в ОЗУ (для скорости отладки).
Но про --section OldName=NewName не знал. Значит впишу его туда.
Go to the top of the page
 
+Quote Post
den_po
сообщение Sep 15 2014, 11:39
Сообщение #9


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

Группа: Участник
Сообщений: 139
Регистрация: 9-11-12
Из: Санкт-Петербург
Пользователь №: 74 315



А вот из хелпа, кстати:
Код
/* A better way is to use a corresponding mechanism */
#define FLASH _Pragma("location=\"FLASH\"")
...
FLASH int i; /* i is placed in the FLASH segment */


Для неинициализированных данных есть pragma dataseg.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 15 2014, 14:53
Сообщение #10


Гуру
******

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



Цитата(jcxz @ Sep 15 2014, 14:31) *
При выборе вариантов с RAM_.., он как раз компоновал readonly-секции в ОЗУ (для скорости отладки).
Не проще ли было сделать свой .icf для каждой конфигурации и в нем распихать стандартные секции как душе угодно, не трогая исходники вообще?


--------------------
На любой вопрос даю любой ответ
"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
jcxz
сообщение Sep 16 2014, 15:41
Сообщение #11


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(Сергей Борщ @ Sep 15 2014, 20:53) *
Не проще ли было сделать свой .icf для каждой конфигурации и в нем распихать стандартные секции как душе угодно, не трогая исходники вообще?

У меня и так два .icf.
Но как сказать, что секцию ".text" из одного файла компоновать в одну область памяти, а ".text" из другого - в другую? Вы знаете как?
В CCS это сделать можно. В IAR не знаю как. Это было-бы идеальным решением - вообще не трогать исходник.
Go to the top of the page
 
+Quote Post
scifi
сообщение Sep 16 2014, 15:50
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(jcxz @ Sep 16 2014, 19:41) *
Но как сказать, что секцию ".text" из одного файла компоновать в одну область памяти, а ".text" из другого - в другую? Вы знаете как?

Как-как... В мануале английским по белому написано.
Цитата
where section-selector is:
[ section-attribute ][ section-type ][section sectionname ]
[object {module | filename } ]
Go to the top of the page
 
+Quote Post
jcxz
сообщение Sep 27 2014, 13:47
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(jcxz @ Sep 16 2014, 21:41) *
Но как сказать, что секцию ".text" из одного файла компоновать в одну область памяти, а ".text" из другого - в другую? Вы знаете как?

Наконец-то дошли руки. Если кому интересно, сделал так (линковка одноимённых секций из разных obj-файлов в разные регионы):
Код
place in RAM_regionBB {
  section .text object str.o,
  section .text object mail.o,
  section .text object sntp.o,
  section .text object dns.o};
Go to the top of the page
 
+Quote Post

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

 


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


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