Перейти к содержанию
    

Переопределить дефолтные секции.

Подскажите пожалуйста: можно-ли в IAR переопределить дефолтные секции кода/данных для конкретного файла?

Типа #pragma location = ".some_section", но только не для конкретной функции/переменной, а для всего файла.

А то что-то в мануале к компилятору не найду.... :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

iobjmanip

хм... И куда это вставить? В .icf?

Если компилить из батника то ясно, но в проекте IAR? Надо же между компилёром и линкером.

Да - и нужно всё-таки в исходниках, так как переопределять или нет секцию должно управляться в зависимости от значения некоторого #define (#ifdef..).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если компилить из батника то ясно, но в проекте IAR?

Да - и нужно всё-таки в исходниках, так как переопределять или нет секцию должно управляться в зависимости от значения некоторого #define (#ifdef..).

"Дайте воды напиться, а то так кушать хочется, что переночевать негде" :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну мне изначально и нужно было чтобы, если некий 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 тоже есть?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"грязь" можно украсить, сунув прагму в макрос. для этого есть вариант _Pragma()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Переопределить секции можно ключом компилятора:

--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;

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"грязь" можно украсить, сунув прагму в макрос. для этого есть вариант _Pragma()

Её станет меньше, но она останется ;)

Очень неудобно перед каждой функцией и после каждой переменной писать имя секции. Особенно когда их в файле - десятки.

И постоянно забываешь это сделать.

 

Переопределить секции можно ключом компилятора:

--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 не знал. Значит впишу его туда.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вот из хелпа, кстати:

/* 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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не проще ли было сделать свой .icf для каждой конфигурации и в нем распихать стандартные секции как душе угодно, не трогая исходники вообще?

У меня и так два .icf.

Но как сказать, что секцию ".text" из одного файла компоновать в одну область памяти, а ".text" из другого - в другую? Вы знаете как?

В CCS это сделать можно. В IAR не знаю как. Это было-бы идеальным решением - вообще не трогать исходник.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но как сказать, что секцию ".text" из одного файла компоновать в одну область памяти, а ".text" из другого - в другую? Вы знаете как?

Как-как... В мануале английским по белому написано.

where section-selector is:

[ section-attribute ][ section-type ][section sectionname ]

[object {module | filename } ]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но как сказать, что секцию ".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};

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...