Size: a a a

2019 January 30

A

Aleksander in ELECTRONIX
Volatile — ключевое слово языков C/C++, которое информирует компилятор о том, что значение переменной может меняться из вне и что компилятор не будет оптимизировать эту переменную.
источник

GK

Grigorii Kuzmin in ELECTRONIX
Sergey
Разница может быть, если писать в регистр МК. Например, в ПИКах бывает нужно загрузить "волшебную последовательность":
ireg=0x45;
ireg=0x55;
Если компилятор такое заоптимизирует, то последующая команда активации записи не сработает. Но компиляторы под конкретные семейства уже обученны этим моментам и не удаляют лишний код. Если же переменная просто в RAM лежит... я бы, на месте компилятора, заоптимизировал (удалил "++").
После обеда буду за компьютером, гляну АСМ для приведенного выше примера обнуления.
Ну обычно регистры как раз волатильными и объявлены
источник

A

Aleksander in ELECTRONIX
Sergey
Разница может быть, если писать в регистр МК. Например, в ПИКах бывает нужно загрузить "волшебную последовательность":
ireg=0x45;
ireg=0x55;
Если компилятор такое заоптимизирует, то последующая команда активации записи не сработает. Но компиляторы под конкретные семейства уже обученны этим моментам и не удаляют лишний код. Если же переменная просто в RAM лежит... я бы, на месте компилятора, заоптимизировал (удалил "++").
После обеда буду за компьютером, гляну АСМ для приведенного выше примера обнуления.
регистры объявляются специальным образом и они не оптимизируются
источник

GK

Grigorii Kuzmin in ELECTRONIX
Sergey
Какие проблемы? Повторный вызов?
Ага
источник

GK

Grigorii Kuzmin in ELECTRONIX
Aleksander
а для чего нужно?
Для правильного использования в обработчиках прерывания, которые с точки зрения компилятора являются мёртвым кодом
источник

A

Aleksander in ELECTRONIX
как тогда объяснишь что без volatile пример от 16-06  будет работать верно
источник

u

username in ELECTRONIX
up
источник

u

username in ELECTRONIX
Aleksander
как тогда объяснишь что без volatile пример от 16-06  будет работать верно
Наверное из за того что в функции нет записи в переменную, а только чтение
источник

A

Aleksander in ELECTRONIX
если бы была запись, то надо ставить обертку из __disable_irq();   __enable_irq();
источник

A

Aleksander in ELECTRONIX
volatile не поможет от проблем
источник

S

Sergey in ELECTRONIX
username
Наверное из за того что в функции нет записи в переменную, а только чтение
Теоретически,
global_msec=0;
while(global_msec<100)
{ d++; }
Без volatie может быть заоптимизированна компилятором до:
global_msec=0;
while(1) { d++;}
источник

DS

Dolphin Soft in ELECTRONIX
Расскажи
источник

DS

Dolphin Soft in ELECTRONIX
Aleksander
компилятор разместит счетчик в регситре и все
зуб даешь?
источник

DS

Dolphin Soft in ELECTRONIX
покажи код с двойным срабатыванием
источник

DS

Dolphin Soft in ELECTRONIX
поди в обработчике прерывания разрешаешь
источник

GK

Grigorii Kuzmin in ELECTRONIX
если найду его)
источник

DS

Dolphin Soft in ELECTRONIX
Grigorii Kuzmin
если найду его)
я например на подобный фикус наткнулся когда писал обработчик UART, причем в протеусе работало все отлично, а в железе из обработчика не выходил.
источник

DS

Dolphin Soft in ELECTRONIX
Сброс флага вконце прерывания решил.
источник

DS

Dolphin Soft in ELECTRONIX
источник

DS

Dolphin Soft in ELECTRONIX
Там в прерывании эпилог отдельно вынесен
источник