189 похожих чатов

Пример совершенно корректный. кто за тебя должен следить что ты

используешь свои данные по назначению?

28 ответов

8 просмотров

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

jon pedro
Не соглашусь. Вопрос был лишь в том, какие вариант...

а волатиле тут не причем в твоем случае

Andrey Ermakov
а волатиле тут не причем в твоем случае

Почему? Обычно если посмотреть на плохой код, он весь увешан volatile именно из-за этого

Andrey Ermakov
а волатиле тут не причем в твоем случае

Порой без нее никак, ибо оно и константой может стать

jon pedro
Почему? Обычно если посмотреть на плохой код, он в...

нет из за этого, у тебя задача же обеспечения челостности данных на момент записи чтения

jon pedro
Почему? Обычно если посмотреть на плохой код, он в...

Интересные критерии определения плохого кода. А можно все критерии узнать, я бы записал и повесил бы на стену

Andrey Ermakov
нет из за этого, у тебя задача же обеспечения чело...

Volatile разе это не позволяет гарантировать параллельно то, что данные полностью считаются, не а не изменившись на половину? Во всяком случае это везде так пишут

jon pedro
Не соглашусь. Вопрос был лишь в том, какие вариант...

волотайл не поможет при изменении части бит в разных местах. ибо это уже гонка данных. Волотайл про то что переменная асинхронная по отношению к коду. тобишь она меняется где-то (где не важно) и компилятор каждый раз должен ее вычитывать из памяти (тобишь ему запрещено ее кэшировать или оптимизировать ее в работе) тобишь при двух записях будет две записи!. Тогда как у тебя банальная гонка - тут нужна либо критическая секция. либо атомик. для арма это эксклюзивный монитор смотри операции с LDREX и т.п, как выше сказали если нет атомиков то можно выкл/вкл прерывания

Leonid Zaliubovskyi
Интересные критерии определения плохого кода. А ...

Ну чем не критерий писать везде volatile не давая многие куски кода оптимизировать?

jon pedro
Volatile разе это не позволяет гарантировать парал...

это поможет разве что для целостности простых типов, дата рейсы волатилом не победишь, критические секции, мьютексы, атомики - вот туда копай

Vitaly
это поможет разве что для целостности простых типо...

Я это и имел в виду, наверное, надо было мне точнее выразиться

Stas Koynov
волотайл не поможет при изменении части бит в разн...

Я об этом и говорил, меня интерисовало именно то, чтобы переменная целостно считалась и не важно на сколько актуально на момент исполнения

jon pedro
Я об этом и говорил, меня интерисовало именно то, ...

ну чтение будет одно ок. потом будет модификация + сохранения. и если между ними будет другое прерывание которое будет тоже менять эту переменную то мы получили тыкву.! если есть гонка данных то волотайл не поможет! Волотайл про другое!

Stas Koynov
ну чтение будет одно ок. потом будет модификация +...

Но у меня же переменная стандартного типа данных неразрывно будет считана и записана. Конкретно в этом кейсе не важно, изменит её потом другое прерывание в процессе исполнения кода или нет. Гонка данных, на сколько я понимаю, ситуация когда мы хотим работать с одним участком памяти одновременно. Волатайл же тупо говорит, что если мы используем какую-то переменную с этим модификатор ом, то мы просто её по новой берём, а не используем промежуточное значения. Если вы думаете, что я не понимаю, что я не понимаю, что переменная val в этом коде может в любой момент измениться, то я это понимаю. И понимаю, что volatile не позволит мне гарантировать равенство v и v3 int v = val; inv v3 = val;

jon pedro
Но у меня же переменная стандартного типа данных н...

Так у вас как я понял такой кейс, что в переменной что-то меняется побитно так?

Stas Koynov
Так у вас как я понял такой кейс, что в переменной...

Просто чтобы небыло такой ситуации когда int a = val; И при этом первая половина бит равна старому значению, а вторая новому значению.

jon pedro
Просто чтобы небыло такой ситуации когда int a = ...

если есть ассинхронная работа с переменной! то волотайл не поможет - он не может помочь при гонке данных. ситуация код: val |= CTRL_POWER_ON будет три операции mov из памяти or установка бита mov в память если после or произойдет прерывание и там будет банально val |= bla bla то после того как мы вернемся и сделаем mov в память. наши bla bla биты потеряны!

Stas Koynov
если есть ассинхронная работа с переменной! то вол...

Очень хороший пример, спасибо, к счастью дважды менять пока мне не надо, но буду держать это в голове, про такую ситуацию я не думал. Мне просто читать не криво было нужно. А можно в догонку тогда такой вопрос. Если мне надо просто получать +- актуальное значение переменной, которая может измениться в прерывании, использую функцию типа int get() {return val;} Без volatile так же я могу вернуть ерунду?

jon pedro
Просто чтобы небыло такой ситуации когда int a = ...

ну в коде выше заменишь на свои функции запрета/разрешения прерываний. Соответвенно пишешь и читаешь из "общих" переменных через соответсвующие функции

Александр Баракин
ну в коде выше заменишь на свои функции запрета/ра...

О, спасибо, я что-то не подумал про то, чтобы подобную функцию накидать. Компактно получается

jon pedro
Очень хороший пример, спасибо, к счастью дважды ме...

нет волотайл это штука. которая говорит компилятору что переменная меняется осинхронно по отношению к тому коду который видишь ты. Это либо в прерывании. либо это вообще часть железа и т.п это значит компилятор видя это дело понимает, что когда я читаю переменную я должен сделать чтение из памяти. когда записываю сделать запись. Все на этом все. прям все и точка. Теперь примеры зачем и где это нужно. 1. скажем есть переменная terminated есть код аля while(!terminated) {} скажем значение этой переменной меняется в прерывании кнопки. юзер нажал мы мол = 1. Так вот если переменная не волотильная, то компилятор видя код с while может сделать так: читаем переменную в регистр. проверяем ... и получается что мы всегда (вечно) будет проверять значение регистра который закешировал значение переменной. и даже когда нажали кнопку и реальная переменная давно уже == 1. мы в нашем коде с while как читали 0 из регистра так и читаем. если мы говорим что чувак переменная волотильная. то будь добр при обращении вычитай ее еще раз. и да каждый раз делай это... второй пример. аналогичный с таймером. есть некий cnt который ++ в прерывании таймера. и код который мол while(cnt < 1000) nop ситуация аналогичная счетчик уже убежал а мы об этом не знаем. ибо компилятор оптимизировал цикл... пример три: есть железный регистр CTRL_UART, в датошите написано установить скорость. а потом устновить битк поехали если мы напишем код типа: CTRL_UART |= (bdr57600); CTRL_UART |= UART_START; компилятор видя это думает ну этож можно оптимизировать как одну запись (НО это нарушает требование датошита) если мы скажем что это волотайл. компилятор такой ок две записи значит две записи без вопросов. PS. Волотайл это отключение вот таких вот оптимизаций для переменной не больше не меньше.

jon pedro
Очень хороший пример, спасибо, к счастью дважды ме...

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

jon pedro
Volatile разе это не позволяет гарантировать парал...

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

Stas Koynov
нет волотайл это штука. которая говорит компилятор...

Сохранил в мемориз. Мне как раз Джуна предстоит скоро натаскивать

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Вот еще странный косяк, подскажите как бороться. Я git clone сделал себе всего embassy и примеры там запускаю. Всё хорошо. Но вот решил в cargo.toml зависимости не как в приме...
Lukutin R2AJP
1
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Ребят в СИ можно реализовать ООП?
Николай
33
Карта сайта