_lexa_ 0 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба 5 minutes ago, jcxz said: ...то поместить их внутрь структуры, которую и разместить в нужном диапазоне адресов. Но если константы в разных модулях программы, и логической связи нет, и добавлялись по ходу написания программы в течении длительного времени, в ходе ее развития, то первый вариант все-таки удобней. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба 8 часов назад, _lexa_ сказал: volatile размещает константу в RAM. Мне не нужно оптимизировать для нее код, мне нужно однажды сохранить туда информацию, потом при необходимости считывать Компилятор не обладает телепатией. Он привык "джентельменам верить на слово". Вы ему сказали, что содержимое данной переменной не меняется? Сказали. Он имеет полное право не вычитывать ее каждый раз из памяти, а вставить ее значение в код команды, если посчитает это более эффективным. Более того, он не только имеет право, но и делает так (в свое время обжегся в такой же ситуации - объявил серийный номер устройства без volatile и программировал его в нужную ячейку на последнем этапе производства. Долго разбирался, почему устройство не отзывается на свой адрес). Добавлено: и volatile ничего никуда не размещает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 131 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба 22 минуты назад, Сергей Борщ сказал: Из тех, что сейчас у всех на слуху - STM32Lxxx. Были еще какие-то, сейчас уже не вспомню. STM8S (по крайней мере младшие представители) тоже такие Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_lexa_ 0 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба 13 minutes ago, Сергей Борщ said: Компилятор не обладает телепатией. Я и не спорю, что надо учитывать оптимизацию компилятора при работе с памятью, как и работу кэша. Но запись и чтение памяти не ограничивается простой операцией "а = b". Можно сделать для этого специальную функцию, в которую передаются указатели на "а" и "b", можно сделать ассемблерную вставку, можно использовать ДМА и т.п. Кстати работает такая конструкция (константа в ROM, при этом не инициализируется и volatile) __no_init const volatile uint32_t my_const @ ".const_noinit"; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 18 февраля, 2020 Опубликовано 18 февраля, 2020 · Жалоба Мужик в скафандре сено косит. Мимо проходит женщина, и говорит: — А почему в скафандре? Мужик: — Трудности люблю. Женщина: — Плюнь ты на эти трудности, пошли лучше потр%%аемся! Мужик, подумав: — Ладно, пошли, только в гамаке. И — стоя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 6 hours ago, VladislavS said: — Ладно, пошли, только в гамаке. И — стоя. В тему. Так я и не понял, что хочет автор топика...(((( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 10 часов назад, _lexa_ сказал: Но если константы в разных модулях программы Всё украдено до нас. Делается заголовочный файл с описанием структуры и подключается по необходимости. Мне вот интересно, а как вы собрались в них писать, если они не организованы должным образом в памяти? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 5 часов назад, VladislavS сказал: а как вы собрались в них писать, если они не организованы должным образом в памяти? Мне интересно - а где автор такое писал? Он вроде писал только, что они могут быть описаны в разных местах исходников. Про размещение в памяти - ничего не писал. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_lexa_ 0 19 февраля, 2020 Опубликовано 19 февраля, 2020 (изменено) · Жалоба 9 hours ago, haker_fox said: В тему. Так я и не понял, что хочет автор топика...(((( Да уже ничего понимать не требуется, решение вопроса на второй странице. 7 hours ago, VladislavS said: Всё украдено до нас. вот потребовалась мне константа для отладки, чтобы можно было после перезагрузки платы посмотреть значение которое было до перезагрузки. Потом я ее вообще удалю. Зачем мне для нее структуру создавать? Но при этом есть массив для записи диагностической информации. И для чего мне объединять временную константу с данными диагностики. А по поводу анекдота - вариативность ситуаций может быть довольно большой. Вы это не рассматриваете? Например, расположил я данные в DTCMRAM (STM32F7), зачем их объявлять как volatile. А запись во флэш - отдельная функция, при этом чтение (копирование) данных в определенных ситуациях проще поручить ДМА Изменено 19 февраля, 2020 пользователем _lexa_ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 2 минуты назад, _lexa_ сказал: Например, расположил я данные в DTCMRAM (STM32F7), зачем их объявлять как volatile. Какая разница в какой RAM Вы их расположили? volatile - оно вообще не про это. И должно использоваться (там где надо!) с любой RAM. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_lexa_ 0 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 1 minute ago, jcxz said: Какая разница в какой RAM Вы их расположили? volatile - оно вообще не про это. И должно использоваться (там где надо!) с любой RAM. согласен, пример не удачный. В свое время решал проблему с кэшированием денных из RAM (оптимизация доступа к данным контроллером), которые не должны были кэшироваться. Спутал с оптимизацией компилятора. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 29 19 февраля, 2020 Опубликовано 19 февраля, 2020 · Жалоба 2 часа назад, _lexa_ сказал: А по поводу анекдота - вариативность ситуаций может быть довольно большой. Согласен, одна из версий этого анегдота заканчивается "в ластах стоя в гамаке". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Stas633 0 16 июля, 2020 Опубликовано 16 июля, 2020 · Жалоба В продолжение темы... Схожая ситуация... Определяю константы, конкретно - таблицу адресов во внешней памяти (через #define ). При определении, ессно использую размеры размещаемых переменных (через sizeof()). В качестве переменных "участвуют" и структуры тоже. Вот кусочек.. #define BEGIN_ROM 0 #define PRIMARYDATA_ROM BEGIN_ROM + 10 #define SECONDDATA_ROM PRIMARYDATA_ROM+sizeof(struct MY_STRUCT) .... Все прекрасно работало, пока вынуждено не пришлось уровень оптимизации установить на максимальный по размеру... В результате для одной и той же структуры значение "sizeof" в разных файлах проекта разное - структура или упакована или нет. Соответственно "плывет" адресация... Спасает ситуацию только явный "запрет" упаковки "#pragma pack()" перед объявлением структуры. Тогда размер структуры во врем проекте одинаков. Что это за "вольности" компилятора (линковщика скорее)? Или "лыжи", которые не едут, ни при чем? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 16 июля, 2020 Опубликовано 16 июля, 2020 · Жалоба 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: Согласен, одна из версий этого анегдота заканчивается "в ластах стоя в гамаке". А ещё -- в три часа ночи и на болоте (но таки да, в гамаке, стоя и в ластах). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 16 июля, 2020 Опубликовано 16 июля, 2020 · Жалоба 2 часа назад, Stas633 сказал: Определяю константы, конкретно - таблицу адресов во внешней памяти (через #define ). При определении, ессно использую размеры размещаемых переменных (через sizeof()). А почему пытаетесь врукопашную заменить компоновщик? Для размещения переменных в памяти ещё в прошлом веке придумали компоновщики. И в IAR "ессно" оно есть. И IAR сам посчитает все необходимые смещения с оптимизацией и без. 2 часа назад, Stas633 сказал: Или "лыжи", которые не едут, ни при чем? Потому что пытаетесь в лыжах да по асфальту... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться