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

GCC vs. KEIL (ARM) - printf изменяемой константы.

Гуру в 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__  ....

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

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


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

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

Вроде надо объявить volatile const

Надо.

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

на это компоновщик под KEIL слетает ужасно и рекомендует обратиться к производителю!

Надо обращаться. Можно для начала проверить на другой версии, но в любом случае это ошибка программистов Кейла.

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


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

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

Можно для начала проверить на другой версии, но в любом случае это ошибка программистов Кейла.

Просто const и volatile -- взаимоисключающие параграфы с точки зрения обычной логики. Просто программисты регулярно забывают о том, что обычная логика и це/це++ -- это тоже взаимоисключающие параграфы.

Можно ещё, в принципе, компилировать кейловским компилятором, а сборку производить ГНУсным компоновщиком -- но, понятно, такое только вручную прописать можно.

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


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

3 hours ago, Сергей Борщ said:

Надо.

Как я теперь понял, ковыряя gcc (ST32CubeIDE), - ARM компилятор из KEIL пофигист еще тот! Перекомпилируя код под gcc, постоянно нарываюсь на строгие предупреждения. Однако в KEIL у связки компилятор-компоновщик есть замечательная способность компоновщика автоматически генерировать символы, которые можно импортировать в C код. В ld из ST32CubeIDE такие константы нужно прописывать в скрипте явно.

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


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

6 часов назад, SII сказал:

Просто const и volatile -- взаимоисключающие параграфы с точки зрения обычной логики

const и volatile совершенно не связаны друг с другом.

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


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

12 часов назад, KnightIgor сказал:

ARM компилятор из KEIL

Озвучте версию компилятора ARM (не IDE Keil MDK-ARM, а самого компилятора) с которым вы работаете.

15 часов назад, SII сказал:

Просто const и volatile -- взаимоисключающие параграфы с точки зрения обычной логики

Они не связаны, как теплое и мягкое.

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

volatile - программист дает указание компилятору не оптимизировать обращение к объекту, и всегда делать с ним ровно то, что написано в коде: не больше, не меньше.

В чем взаимоисключение и противоречие этих двух указаний компилятору?

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

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


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

14 minutes ago, Darth Vader said:

Они не связаны, как теплое и мягкое.

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

volatile - программист дает указание компилятору не оптимизировать обращение к объекту, и всегда делать с ним ровно то, что написано в коде: не больше, не меньше.

В чем взаимоисключение и противоречие этих двух указаний компилятору?

Читали б внимательно, что другие пишут. Я написал, цитирую: "Просто const и volatile -- взаимоисключающие параграфы с точки зрения обычной логики. Просто программисты регулярно забывают о том, что обычная логика и це/це++ -- это тоже взаимоисключающие параграфы."

Поясняю: с точки зрения обычной, а не программистской логики константы не могут быть волатильными в принципе, ибо константность подразумевает неизменность вообще, а волатильность -- как раз изменчивость. Языки же программирования к обычной логике отношение имеют зачастую весьма слабое, про что нужно помнить -- но что регулярно забывают.

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


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

Может книжку почитать

"Гугл за 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/volatile
https://en.cppreference.com/w/c/language/const

И перейти в разряд теоретиков программирования.

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


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

3 часа назад, x893 сказал:

Может книжку почитать

Даже развернуте объяснение на пальцах не все "гуру" осиливают.  SII, процитируйте себя для самых невнимательных еще раз, выделив

3 часа назад, SII сказал:

с точки зрения обычной логики

жирным текстом, курсивом, ядовито-синим цветом, что ли. А то вам еще две страницы будут приводить цитаты стандартов и интернета.

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


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

06.11.2020 в 19:39, KnightIgor сказал:

P.S. Вроде надо объявить volatile const или __I из CMSIS, НО на это компоновщик под KEIL слетает ужасно и рекомендует обратиться к производителю!

Хоть описали бы точнее, что происходит... А то у каждого свое понятие "слетает".
Для меня, например, это значит что-то типа "Прекращена работа программы Keil uVision...".

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


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

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.

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


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

51 минуту назад, KnightIgor сказал:

ARMCC 5.06 Update 1 (Build 61), версия Link та же.

А попробовать перейти на новую версию, все-таки, нет желания?

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


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

43 minutes ago, Arlleex said:

А попробовать перейти на новую версию, все-таки, нет желания?

Где взять, чтобы без ограничений?

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


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

11 минут назад, KnightIgor сказал:

Где взять, чтобы без ограничений?

Ну где где... А эту где брали?:wink:

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


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

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

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

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

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

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

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

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

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

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