Jump to content

    
_lexa_

Инициализация констант по умолчанию

Recommended Posts

5 minutes ago, jcxz said:

...то поместить их внутрь структуры, которую и разместить в нужном диапазоне адресов.

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

Share this post


Link to post
Share on other sites
8 часов назад, _lexa_ сказал:

volatile размещает константу в RAM. Мне не нужно оптимизировать для нее код, мне нужно однажды сохранить туда информацию, потом при необходимости считывать

Компилятор не обладает телепатией. Он привык "джентельменам верить на слово". Вы ему сказали, что содержимое данной переменной не меняется? Сказали. Он имеет полное право не вычитывать ее каждый раз из памяти, а вставить ее значение в код команды, если посчитает это более эффективным. Более того, он не только имеет право, но и делает так (в свое время обжегся в такой же ситуации - объявил серийный номер устройства без volatile и программировал его в нужную ячейку на последнем этапе производства. Долго разбирался, почему устройство не отзывается на свой адрес).

Добавлено: и volatile ничего никуда не размещает.

Share this post


Link to post
Share on other sites
22 минуты назад, Сергей Борщ сказал:

Из тех, что сейчас у всех на слуху - STM32Lxxx. Были еще какие-то, сейчас уже не вспомню.

STM8S (по крайней мере младшие представители) тоже такие:smile:

Share this post


Link to post
Share on other sites
13 minutes ago, Сергей Борщ said:

Компилятор не обладает телепатией.

Я и не спорю, что надо учитывать оптимизацию компилятора при работе с памятью, как и работу кэша. Но запись и чтение памяти не ограничивается простой операцией "а = b". Можно сделать для этого специальную функцию, в которую передаются указатели на "а" и "b", можно сделать ассемблерную вставку, можно использовать ДМА и т.п.

Кстати работает такая конструкция (константа в ROM, при этом не инициализируется и volatile)

__no_init const volatile uint32_t my_const @ ".const_noinit";

 

Share this post


Link to post
Share on other sites

Мужик в скафандре сено косит. Мимо проходит женщина, и говорит:

  — А почему в скафандре?

Мужик:

  — Трудности люблю.

Женщина:

  — Плюнь ты на эти трудности, пошли лучше потр%%аемся!

Мужик, подумав:

  — Ладно, пошли, только в гамаке. И — стоя.

Share this post


Link to post
Share on other sites
10 часов назад, _lexa_ сказал:

Но если константы в разных модулях программы

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

Share this post


Link to post
Share on other sites
5 часов назад, VladislavS сказал:

а как вы собрались в них писать, если они не организованы должным образом в памяти?

Мне интересно - а где автор такое писал?  :wacko2:

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

Share this post


Link to post
Share on other sites
9 hours ago, haker_fox said:

В тему. Так я и не понял, что хочет автор топика...((((

Да уже ничего понимать не требуется, решение вопроса на второй странице.

7 hours ago, VladislavS said:

Всё украдено до нас.

вот потребовалась мне константа для отладки, чтобы можно было после перезагрузки платы посмотреть значение которое было до перезагрузки. Потом я ее вообще удалю. Зачем мне для нее структуру создавать? Но при этом есть массив для записи диагностической информации. И для чего мне объединять временную константу с данными диагностики.

 

А по поводу анекдота - вариативность ситуаций может быть довольно большой. Вы это не рассматриваете? Например, расположил я данные в DTCMRAM (STM32F7), зачем их объявлять как volatile. А запись во флэш - отдельная функция, при этом чтение (копирование) данных в определенных ситуациях проще поручить ДМА 

Edited by _lexa_

Share this post


Link to post
Share on other sites
2 минуты назад, _lexa_ сказал:

Например, расположил я данные в DTCMRAM (STM32F7), зачем их объявлять как volatile.

Какая разница в какой RAM Вы их расположили? volatile - оно вообще не про это. И должно использоваться (там где надо!) с любой RAM.

Share this post


Link to post
Share on other sites
1 minute ago, jcxz said:

Какая разница в какой RAM Вы их расположили? volatile - оно вообще не про это. И должно использоваться (там где надо!) с любой RAM.

согласен, пример не удачный. В свое время решал проблему с кэшированием денных из RAM (оптимизация доступа к данным контроллером), которые не должны были кэшироваться. Спутал с оптимизацией компилятора.

Share this post


Link to post
Share on other sites
2 часа назад, _lexa_ сказал:

А по поводу анекдота - вариативность ситуаций может быть довольно большой.

Согласен, одна из версий этого анегдота заканчивается "в ластах стоя в гамаке".

Share this post


Link to post
Share on other sites

В продолжение темы... Схожая ситуация...

Определяю константы, конкретно  - таблицу адресов во внешней памяти (через #define ). При определении, ессно использую размеры размещаемых переменных (через sizeof()). В качестве переменных "участвуют" и структуры тоже. Вот кусочек..

#define BEGIN_ROM 		0
#define PRIMARYDATA_ROM	BEGIN_ROM + 10
#define SECONDDATA_ROM	PRIMARYDATA_ROM+sizeof(struct MY_STRUCT)
  ....

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

Спасает ситуацию только явный "запрет" упаковки  "#pragma pack()" перед объявлением структуры. Тогда размер структуры во врем проекте одинаков.

Что это за "вольности" компилятора (линковщика скорее)? Или "лыжи", которые не едут, ни при чем?

Share this post


Link to post
Share on other sites
1 hour ago, Stas633 said:

В продолжение темы... Схожая ситуация...

Определяю константы, конкретно  - таблицу адресов во внешней памяти (через #define ). При определении, ессно использую размеры размещаемых переменных (через sizeof()). В качестве переменных "участвуют" и структуры тоже. Вот кусочек..


#define BEGIN_ROM 		0
#define PRIMARYDATA_ROM	BEGIN_ROM + 10
#define SECONDDATA_ROM	PRIMARYDATA_ROM+sizeof(struct MY_STRUCT)
  ....

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

Спасает ситуацию только явный "запрет" упаковки  "#pragma pack()" перед объявлением структуры. Тогда размер структуры во врем проекте одинаков.

Что это за "вольности" компилятора (линковщика скорее)? Или "лыжи", которые не едут, ни при чем?

Определить тип структуры в отдельном заголовке, причём явным образом указать для неё alignas (если используется Си++11 или старше; насчёт чистых сей не в курсе -- не использую в связи с бессмысленностью); тогда компилятор вольничать с выравниванием не будет.

 

On 2/19/2020 at 2:54 PM, VladislavS said:

Согласен, одна из версий этого анегдота заканчивается "в ластах стоя в гамаке".

А ещё -- в три часа ночи и на болоте (но таки да, в гамаке, стоя и в ластах).

Share this post


Link to post
Share on other sites
2 часа назад, Stas633 сказал:

Определяю константы, конкретно  - таблицу адресов во внешней памяти (через #define ). При определении, ессно использую размеры размещаемых переменных (через sizeof()).

А почему пытаетесь врукопашную заменить компоновщик? Для размещения переменных в памяти ещё в прошлом веке придумали компоновщики. И в IAR "ессно" оно есть.

И IAR сам посчитает все необходимые смещения с оптимизацией и без.

2 часа назад, Stas633 сказал:

Или "лыжи", которые не едут, ни при чем?

Потому что пытаетесь в лыжах да по асфальту... :russian_ru:

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.