KnightIgor 2 6 ноября, 2020 Опубликовано 6 ноября, 2020 (изменено) · Жалоба Гуру в gcc, подскажите: Есть константа const float A __attribute__((section("BLABLA"), noinline, used)) = 1.2; Эта константа размещена в секции flash, которую я могу МОДИФИЦИРОВАТЬ в процессе исполнения. Поэтому 1.2 может стать, например 2.0. Есть печать: printf("%f", A); Под KEIL все работает хорошо в том смысле, что после модификации A печатается новое значение, т.к. в print() передается значение из того места flash, где эта константа расположена. Примечание: noinline и used как атрибуты необходимы, иначе компилятор жестко генерирует фактически printf("%f", 1.2)! Это НЕ РАБОТАЕТ в gcc: атрибут noinline для переменной/константы в нем игнорируется (пишет предупреждение), а printf() всегда печатает 1.2, даже после модификации константы во flash в процессе исполнения. В каком-либо выражении, однако, например B = 5 * A; gcc, как и KEIL, использует правильное значение из flash. Шо делать? P.S. Вроде надо объявить volatile const или __I из CMSIS, НО на это компоновщик под KEIL слетает ужасно и рекомендует обратиться к производителю! Начал тыкать повсюду #ifdef __GNUC__ .... Изменено 6 ноября, 2020 пользователем KnightIgor Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 6 ноября, 2020 Опубликовано 6 ноября, 2020 · Жалоба 5 часов назад, KnightIgor сказал: Вроде надо объявить volatile const Надо. 5 часов назад, KnightIgor сказал: на это компоновщик под KEIL слетает ужасно и рекомендует обратиться к производителю! Надо обращаться. Можно для начала проверить на другой версии, но в любом случае это ошибка программистов Кейла. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 6 ноября, 2020 Опубликовано 6 ноября, 2020 · Жалоба 7 minutes ago, Сергей Борщ said: Можно для начала проверить на другой версии, но в любом случае это ошибка программистов Кейла. Просто const и volatile -- взаимоисключающие параграфы с точки зрения обычной логики. Просто программисты регулярно забывают о том, что обычная логика и це/це++ -- это тоже взаимоисключающие параграфы. Можно ещё, в принципе, компилировать кейловским компилятором, а сборку производить ГНУсным компоновщиком -- но, понятно, такое только вручную прописать можно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба 3 hours ago, Сергей Борщ said: Надо. Как я теперь понял, ковыряя gcc (ST32CubeIDE), - ARM компилятор из KEIL пофигист еще тот! Перекомпилируя код под gcc, постоянно нарываюсь на строгие предупреждения. Однако в KEIL у связки компилятор-компоновщик есть замечательная способность компоновщика автоматически генерировать символы, которые можно импортировать в C код. В ld из ST32CubeIDE такие константы нужно прописывать в скрипте явно. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VladislavS 39 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба 6 часов назад, SII сказал: Просто const и volatile -- взаимоисключающие параграфы с точки зрения обычной логики const и volatile совершенно не связаны друг с другом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Darth Vader 0 7 ноября, 2020 Опубликовано 7 ноября, 2020 (изменено) · Жалоба 12 часов назад, KnightIgor сказал: ARM компилятор из KEIL Озвучте версию компилятора ARM (не IDE Keil MDK-ARM, а самого компилятора) с которым вы работаете. 15 часов назад, SII сказал: Просто const и volatile -- взаимоисключающие параграфы с точки зрения обычной логики Они не связаны, как теплое и мягкое. const - программист дает указание компилятору проследить, чтобы имя объекта нигде в коде не встречалось слева от оператора присваивания. volatile - программист дает указание компилятору не оптимизировать обращение к объекту, и всегда делать с ним ровно то, что написано в коде: не больше, не меньше. В чем взаимоисключение и противоречие этих двух указаний компилятору? Изменено 7 ноября, 2020 пользователем Darth Vader Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба Вот это - да. Столько гуру программирования разом ! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SII 0 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба 14 minutes ago, Darth Vader said: Они не связаны, как теплое и мягкое. const - программист дает указание компилятору проследить, чтобы имя объекта нигде в коде не встречалось слева от оператора присваивания. volatile - программист дает указание компилятору не оптимизировать обращение к объекту, и всегда делать с ним ровно то, что написано в коде: не больше, не меньше. В чем взаимоисключение и противоречие этих двух указаний компилятору? Читали б внимательно, что другие пишут. Я написал, цитирую: "Просто const и volatile -- взаимоисключающие параграфы с точки зрения обычной логики. Просто программисты регулярно забывают о том, что обычная логика и це/це++ -- это тоже взаимоисключающие параграфы." Поясняю: с точки зрения обычной, а не программистской логики константы не могут быть волатильными в принципе, ибо константность подразумевает неизменность вообще, а волатильность -- как раз изменчивость. Языки же программирования к обычной логике отношение имеют зачастую весьма слабое, про что нужно помнить -- но что регулярно забывают. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 61 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба Может книжку почитать "Гугл за 24 часа" Volatile C Standard In computer programming, particularly in the C, C++, C#, and Java programming languages, the volatile keyword ndicates that a value may change between different accesses, even if it does not appear to be modified. Илиhttps://en.cppreference.com/w/c/language/volatilehttps://en.cppreference.com/w/c/language/const И перейти в разряд теоретиков программирования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 143 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба 3 часа назад, x893 сказал: Может книжку почитать Даже развернуте объяснение на пальцах не все "гуру" осиливают. SII, процитируйте себя для самых невнимательных еще раз, выделив 3 часа назад, SII сказал: с точки зрения обычной логики жирным текстом, курсивом, ядовито-синим цветом, что ли. А то вам еще две страницы будут приводить цитаты стандартов и интернета. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба 06.11.2020 в 19:39, KnightIgor сказал: P.S. Вроде надо объявить volatile const или __I из CMSIS, НО на это компоновщик под KEIL слетает ужасно и рекомендует обратиться к производителю! Хоть описали бы точнее, что происходит... А то у каждого свое понятие "слетает". Для меня, например, это значит что-то типа "Прекращена работа программы Keil uVision...". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба 6 hours ago, Darth Vader said: Озвучте версию компилятора ARM (не IDE Keil MDK-ARM, а самого компилятора) с которым вы работаете. ARMCC 5.06 Update 1 (Build 61), версия Link та же. 1 hour ago, Arlleex said: Хоть описали бы точнее, что происходит... А то у каждого свое понятие "слетает". Для меня, например, это значит что-то типа "Прекращена работа программы Keil uVision...". linking... .\objM3\..\TK_103.axf: Internal fault: [0xc0fbf2:5060061] .\objM3\..\TK_103.axf: Please contact your supplier. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба 51 минуту назад, KnightIgor сказал: ARMCC 5.06 Update 1 (Build 61), версия Link та же. А попробовать перейти на новую версию, все-таки, нет желания? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба 43 minutes ago, Arlleex said: А попробовать перейти на новую версию, все-таки, нет желания? Где взять, чтобы без ограничений? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 190 7 ноября, 2020 Опубликовано 7 ноября, 2020 · Жалоба 11 минут назад, KnightIgor сказал: Где взять, чтобы без ограничений? Ну где где... А эту где брали? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться