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

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

|
Пишу для STM32F1 на С под Keil Есть кусок кода: Код mtable_do_steps = 1; while (mtable_do_steps != 0); переменная обращается в 0 в прерываниях. Все замечательно работает, если не включать оптимизациию. Если включать, то вваливаемся в ступор((( совсем не включать нельзя - недостаточно мощный проц и разлапистый код. Как отключить оптимизацию только для этих двух строк? Заранее спасибо
|
|
|
|
|
 |
Ответов
(1 - 12)
|
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)
|
|
|
|
|
Aug 14 2015, 18:52
|

Местный
  
Группа: Участник
Сообщений: 329
Регистрация: 23-04-14
Пользователь №: 81 502

|
Цитата(amaora @ Aug 14 2015, 19:38)  А я как-то обхожусь без volatile. В вашем случае можно например вызывать в цикле функцию пустышку из другого модуля. Это будет имитировать для компилятора, что переменная могла изменится в этой функции и нужно ее перечитать. А зубы вы тоже перанально чистите ? Функция-пустышка тоже может быть выкинута умным компилятором.
|
|
|
|
|
Aug 18 2015, 15:59
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Цитата(CrimsonPig @ Aug 14 2015, 21:52)  А зубы вы тоже перанально чистите ? Функция-пустышка тоже может быть выкинута умным компилятором. Если в компилируемом модуле есть только ее прототип, то не может.
|
|
|
|
|
Aug 18 2015, 17:07
|
Местный
  
Группа: Участник
Сообщений: 421
Регистрация: 2-01-08
Пользователь №: 33 778

|
Цитата(zltigo @ Aug 18 2015, 19:45)  Вы отстали от жизни и Ваши представления о возможностиях компиляторов и линкеров устарели. Да LTO я действительно не использую.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|