Jump to content

    

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

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
6 hours ago, VladislavS said:

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

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

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

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now