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

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

5 minutes ago, jcxz said:

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

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

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


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

8 часов назад, _lexa_ сказал:

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

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

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

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


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

22 минуты назад, Сергей Борщ сказал:

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

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

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


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

13 minutes ago, Сергей Борщ said:

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

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

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

__no_init const volatile uint32_t my_const @ ".const_noinit";

 

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


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

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

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

Мужик:

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

Женщина:

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

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

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

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


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

6 hours ago, VladislavS said:

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

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

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


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

10 часов назад, _lexa_ сказал:

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

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

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


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

5 часов назад, VladislavS сказал:

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

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

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

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


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

9 hours ago, haker_fox said:

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

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

7 hours ago, VladislavS said:

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

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

 

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

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

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


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

2 минуты назад, _lexa_ сказал:

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

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

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


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

1 minute ago, jcxz said:

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

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

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


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

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

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

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

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


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

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

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

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

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

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

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

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


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

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:

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

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

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


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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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