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

Распределение памяти STM32H7

Тут вопрос от колеги, так что, "мопед не мой", сам я ответа не знаю.

Quote

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

Заказчик требует определенное распределение памяти (смысла и причин не говорит), типа чтобы все переменные что в нашем куске, были в конретной области, прописанной в скаттере. Они ее для нас выделили.

Ну это мы сделали, пока вся программа в виде исходников. Но(!) - впоследствии весь наш кусок дожен быть скомпилирован отдельно в виде либы, и вместе с .h передан заказчику. Исходники либы по договору. мы не передаем.

Собственно сам вопрос, поскольку с либами вообще мало работал, и тут еще не приступал - а с либами это вообще будет работать? Как я понимаю куда чего засунуть, это уже работа линкера а не компилятора. В либе сохраняется вся информация о распределении для линкера?

Компилятор ИАР.

 

 

Изменено пользователем haker_fox
Тему переместил. Т.к. вопрос скорее по среде разработки, чем по самой архитектуре.

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


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

В "либе" сохраняется информация о секциях, в которые помещаются переменные. А уж - в какую область памяти направить какую секцию, то забота компоновщика. Коллеге достаточно расположить все переменные своей "либы" в одной определённой секции.

 

PS: Хотя и прибить гвоздями все переменные к абсолютным адресам в объектниках  IAR тоже позволяет. Но делать так - некрасиво.

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


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

Как я понял из его рассказа, у него есть проект, с исходниками заказчика, к которму он добавляет свои исзходники.

После отладки в таком "окрытом виде", он удалает все чужое и компилирует как либу.

Затем берез чужую часть и пдключает своб полученную либу.

Получается, то если него все работает и память распределяется праивльно "в открытом виде", то и потом с либой все будет ОК?

Спасибо.

 

P.S. Не знаю, почему тему перенесли в тему про IAR - тут как бы "общий вопрос" програмирования а не "среды разработкти", непосредственно никак не касающийся самого IAR-а. Ничего бы не изменилось, если бы это был Кейл или какая-нибудь гнусность.

 

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


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

17 минут назад, Allregia сказал:

Получается, то если него все работает и память распределяется праивльно "в открытом виде", то и потом с либой все будет ОК?

Да вообще не факт. Может название секций перепутают и все все равно будет работать. Проверять надо не "в открытом виде", а так, как это будет делать заказчик - вашу скомпилированную либу впихнуть в их код, собрать, проверить. Проверить работу и map-файл, разумеется.

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


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

1 hour ago, Arlleex said:

Проверять надо не "в открытом виде", а так, как это будет делать заказчик - вашу скомпилированную либу впихнуть в их код, собрать

Разумеется он так и собирается делать, Просто сначала отладка "в окрытом виде".

 

1 hour ago, Arlleex said:

Может название секций перепутают и все все равно будет работать.

 

Не, там заказчики дотошные - скаттер ихний, и они в мар-файл тоже смотреть умеют.

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


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

скаттер ихний
В ИАРе нету скаттеров ;-) в ИАРе - .icf: они даже не "однофамильцы" (-;

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


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

Ну я не IAR-щик, поэтому по привычке называю "скаттер", задачи-то теже.

 

 

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


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

Ну, судя по вопросу, нужно указать компилятору, в каких секциях что размещать -- он и сгенерит соответствующий код и управляющую информацию. Затем можно, например, все объектники собрать компоновщиком в один объектник (кейловский компоновщик такое умеет -- если память не изменяет, partial linking это обзывается), который скармливать при сборке полного приложения у заказчика.

Как секции указывать, зависит от компилятора, так как стандарт это не регламентирует. В ARM Clang кейловском можно, в GCC можно (насколько помню), в мелкомягком компиляторе можно -- так что и в ИАРовском наверняка сие поддерживается.

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


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

Я не заметил, какой компилятор используется, посему скажу за GCC.

Первое. Нужно сказать компилятору, в какую секцию кода помещать тот или иной объект, например:

image.thumb.png.2d56fa3cfd81d41a7abc078aef27d146.png

Второе. Нужно в файле линкёра указать, какая секция какой памяти принадлежит и где она находится:

image.thumb.png.c4f3e22637afca72869452f947e07269.png

image.png.444cbdd4d3fdaf52a70fd5a00c87055b.png

Если линкёру не описать секцию, то он положит объект туда, куда кладёт по-умолчанию.

Поэтому вам в своём коде нужно разместить объекты по именованным вами секциям и передать эту информацию заказчику. У GCC есть опции компилятора, которые указывают компилятору в какие секции класть код и данные из исходных файлов.

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


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

On 2/8/2023 at 5:18 PM, Allregia said:

Собственно сам вопрос, поскольку с либами вообще мало работал, и тут еще не приступал - а с либами это вообще будет работать? Как я понимаю куда чего засунуть, это уже работа линкера а не компилятора. В либе сохраняется вся информация о распределении для линкера?

Компилятор ИАР.

Я с либами тоже дел не имел, но, так думаю, если в исходнике есть прямые команды, чего куда положить, значит, они обязательны для дальнейшего использования. В доке IAR'а есть глава "Controlling data and function placement in memory", там всё подробно расписано. Данные можно расположить по конкретным адресам, областям, либо использовать свои, пользовательские сегменты. То же самое относится и к функциям.

====

#pragma location=0xFF2002
__no_init const int beta; /* OK */
const int gamma @ 0xFF2004 = 3; /* OK */

__no_init int alpha @ "MY_NOINIT"; /* OK */
#pragma location="MY_CONSTANTS"
const int beta = 42; /* OK */
const int gamma @ "MY_CONSTANTS" = 17;/* OK */
int theta @ "MY_ZEROS"; /* OK */
int phi @ "MY_INITED" = 4711; /* OK */

void f(void) @ "MY_FUNCTIONS";
void g(void) @ "MY_FUNCTIONS"
{
}
#pragma location="MY_FUNCTIONS"
void h(void);

Да, забыл добавить - это дока для AVR, но, я думаю, для ARM всё будет очень похожее.

Изменено пользователем vvppvv

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


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

7 hours ago, tonyk_av said:

Я не заметил, какой компилятор используется,

ИАР.

 

7 hours ago, tonyk_av said:

Первое. Нужно сказать компилятору, в какую секцию кода помещать тот или иной объект,

Второе. Нужно в файле линкёра указать, какая секция какой памяти принадлежит и где она находится:

Если линкёру не описать секцию, то он положит объект туда, куда кладёт по-умолчанию.

Вопрос-же был не в этом, все распределено, указано, и положено куда следует.

Вопрос был - сохраниться ли все это когда часть проекта будет скомпилирована как либа, и в виде либы (без исходников)  подключена к остальному.

Уже отеветили что да, сохранится.

 

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


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

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

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

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

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

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

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

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

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

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