Jump to content

    
KnightIgor

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

Recommended Posts

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

Edited by KnightIgor

Share this post


Link to post
Share on other sites
5 часов назад, KnightIgor сказал:

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

Надо.

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

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

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

Share this post


Link to post
Share on other sites
7 minutes ago, Сергей Борщ said:

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

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

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

Share this post


Link to post
Share on other sites
3 hours ago, Сергей Борщ said:

Надо.

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

Share this post


Link to post
Share on other sites
6 часов назад, SII сказал:

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

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

Share this post


Link to post
Share on other sites
12 часов назад, KnightIgor сказал:

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

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

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

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

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

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

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

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

Edited by Darth Vader

Share this post


Link to post
Share on other sites
14 minutes ago, Darth Vader said:

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

"Гугл за 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

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

Share this post


Link to post
Share on other sites
3 часа назад, x893 сказал:

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

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

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

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

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

Share this post


Link to post
Share on other sites
06.11.2020 в 19:39, KnightIgor сказал:

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

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

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.