-
- а как это связано с критическими секциями? - Vit(13.12.2017 18:19)
- volatile в прерываниях имеет смысл только если переменная изменяется внутри них - 0men(13.12.2017 17:40)
- Ага. А также если не изменяется а просто читается для вывода. А то оптимизатор запрсто сочтет все ее вычисления в теле программы ненужной (ни к чему не приводящей) тряхомудией. И выкинет. - Petrovich(14.12.2017 13:20, )
- пример кода можете привести, где компилятор счел, выкинул, а вам это было нужно? - 0men(14.12.2017 13:31)
- Вы хотите код, заработавший только когда я, обозвав себя идиотом, добавил volatile к переменной, используемой в прерывании, после чего он заработал? Таких, уверен, у каждого компилирующего с высокой оптимизацией есть. За прошедший месяц у меня Petrovich(188 знак., 14.12.2017 13:40, )
- за 20 лет никогда такой проблемы не встречал. Переменная в прерывании изменялась? Тогда да, "сам дурак", volatile там обязателен. Нет, только считывалась? Тогда код в студию - 0men(14.12.2017 13:43)
- Пожалуйста: SciFi(439 знак., 14.12.2017 14:43)
- Все же херово, даже с волатилой, выходить из функции после txhead++ без такого же прокруста. Ведь значение головы после инкремента может стать некорректным, и сравнение с хвостом в обработчике не будет иметь смысла. Или хоть при сравнении Доширак(52 знак., 14.12.2017 23:21, )
- [txhead & (TXFIFOSZ - 1)] - Ruslan(14.12.2017 19:38, картинка)
- Не надо грязи! Ещё есть такое "assert_static(IS_POWER_OF_TWO(TXFIFOSZ));" - SciFi(14.12.2017 20:24)
- вам нужно в этом примере обеспечить атомарность выполнения send, использовать для этого volatile несколько странно - 0men(14.12.2017 17:49)
- Кстати, про атомарность. В проекте на F303 у меня ИАР спокойно относится к std::atomic, а в проекте на F042 вываливает кучу ошибок, к чему бы это? - йцукен(14.12.2017 18:39)
- Не нужна там атомарность выполнения send. Вот и misyachniy носится с такой же глупой затеей. - SciFi(14.12.2017 17:51)
- при обеспечении атомарности в вашем примере никакого volatile не понадобилось. Внутри send был бы возможен любой порядок операций. - 0men(14.12.2017 17:54)
- При обеспечении атомарности volatile вообще нигде не понадобится. Только зачем из пушки по воробьям? - SciFi(14.12.2017 17:55)
- ок, уговорили ) - 0men(14.12.2017 18:02)
- При обеспечении атомарности volatile вообще нигде не понадобится. Только зачем из пушки по воробьям? - SciFi(14.12.2017 17:55)
- при обеспечении атомарности в вашем примере никакого volatile не понадобилось. Внутри send был бы возможен любой порядок операций. - 0men(14.12.2017 17:54)
- Нет, в прерывании только считывалась и выдавалась по UART. Переменная-результат ADC, полученная в main, фильтрованная, масштабированная, обновлялась несколько раз в секунду для выдачи. В другом файле, в обработчике прерывания по ежесекундному Petrovich(96 знак., 14.12.2017 13:53, )
- )) считывалась в регистр и присваивалась переменной? Ну так вот оно и изменение )) - 0men(14.12.2017 14:15)
- Пожалуйста: SciFi(439 знак., 14.12.2017 14:43)
- за 20 лет никогда такой проблемы не встречал. Переменная в прерывании изменялась? Тогда да, "сам дурак", volatile там обязателен. Нет, только считывалась? Тогда код в студию - 0men(14.12.2017 13:43)
- Вы хотите код, заработавший только когда я, обозвав себя идиотом, добавил volatile к переменной, используемой в прерывании, после чего он заработал? Таких, уверен, у каждого компилирующего с высокой оптимизацией есть. За прошедший месяц у меня Petrovich(188 знак., 14.12.2017 13:40, )
- пример кода можете привести, где компилятор счел, выкинул, а вам это было нужно? - 0men(14.12.2017 13:31)
- Ага. А также если не изменяется а просто читается для вывода. А то оптимизатор запрсто сочтет все ее вычисления в теле программы ненужной (ни к чему не приводящей) тряхомудией. И выкинет. - Petrovich(14.12.2017 13:20, )
- На всякий случай - volatile НЕ гарантирует Вам целостность неатомарных данных, он всего лишь говорит компилятору чтобы тот не делал предположений насчет содержания переменной. - sav6622(13.12.2017 17:03)
- А то он первый год замужем :) - Petrovich(13.12.2017 17:06, )