|
Вредная оптимизация |
|
|
|
Jul 14 2015, 19:06
|

Частый гость
 
Группа: Участник
Сообщений: 106
Регистрация: 4-04-06
Пользователь №: 15 783

|
Пишу для STM32F1 на С под Keil Есть кусок кода: Код mtable_do_steps = 1; while (mtable_do_steps != 0); переменная обращается в 0 в прерываниях. Все замечательно работает, если не включать оптимизациию. Если включать, то вваливаемся в ступор((( совсем не включать нельзя - недостаточно мощный проц и разлапистый код. Как отключить оптимизацию только для этих двух строк? Заранее спасибо
|
|
|
|
|
 |
Ответов
|
Jul 15 2015, 04:11
|

Частый гость
 
Группа: Участник
Сообщений: 156
Регистрация: 27-09-06
Из: Irkutsk
Пользователь №: 20 747

|
Добавлю, что при включенной оптимизации если пишете в прерывании в глобальную переменную, всегда делайте ее volatile. Иначе компилятор просто не понимает, кто изменяет ее значение, и может, например, выпилить даже цикл, как бесполезный.
--------------------
Блог о разработке на CC430, SIM900, GPS, ARM и не только...
|
|
|
|
|
Jul 15 2015, 07:00
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(Mihey_K @ Jul 15 2015, 07:11)  если пишете в прерывании в глобальную переменную, всегда делайте ее volatile. Такой совет скорее из серии вредных. Во-первых, для глобальной переменной, которая пишется/читается только в невытесняющих друг друга прерываний volatile не нужен. Он даже лишний, ибо связывает руки оптимизатору и заставляет программиста в погоне за скоростью/размером раздувать исходник ненужными ручными кешированиями такой переменной во временные. Во-вторых переменная, которая читается в прерывании, а пишется в основном цикле или в вытесняющем прерывании volatile тоже обязателен. То есть полностью правило звучит так: volatile обязателен для переменных, которые используются в нескольких потоках управления (неважно каких - прерывание и основной цикл, два вытесняющих прерывания, два потока/процесса/нити в ОС и т.п.).
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Jul 15 2015, 07:47
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(megajohn @ Jul 15 2015, 10:06)  наверное НЕ пропустили Нет, все верно. В первом случае компилятор обязан считать значение из переменной после входа в обработчик и записать новое значение в переменную до выхода из обработчика. В промежутке между этими действиями значение переменной нигде кроме обработчика не используется, volatile не нужен и даже вреден. Во втором случае volatile нужен, так как заставляет компилятор сразу же записать новое значение в переменную (запрещает откладывать запись) и это новое значение станет доступно прерыванию, другому потоку и т.д. "Тоже" имелось в виду "а не только в процитированном случае".
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
Сообщений в этой теме
ruslannd Вредная оптимизация Jul 14 2015, 19:06 SSerge Вам надо срочно найти учебник по С и прочитать там... Jul 14 2015, 19:42 ruslannd Помогло. Спасибо. Jul 15 2015, 07:21 demiurg_spb Цитата(ruslannd @ Jul 15 2015, 10:21) Пом... Jul 15 2015, 09:35 amaora А я как-то обхожусь без volatile. В вашем случае м... Aug 14 2015, 18:38 CrimsonPig Цитата(amaora @ Aug 14 2015, 19:38) А я к... Aug 14 2015, 18:52  amaora Цитата(CrimsonPig @ Aug 14 2015, 21:52) А... Aug 18 2015, 15:59   zltigo QUOTE (amaora @ Aug 18 2015, 18:59) Если ... Aug 18 2015, 16:45    amaora Цитата(zltigo @ Aug 18 2015, 19:45) Вы от... Aug 18 2015, 17:07
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|