Страница 1 из 1

volatile C AVR Atmega8

Добавлено: Вт июл 11, 2006 13:37:56
Adekamer
в общем хочу поделиться некоторым вопросом - мыслей:
на некотором ресурсе по AVR есть такая фраза:
volatile - если нужно предотвратить повреждение содержимого переменной в прерывании, компилятор просто не будет размещать эту переменную ни в одном из 32-х регистров общего назначения и не будет пытаться выкинуть её при оптимизации кода.
у меня же на практике - наоборот - переменная обьявленная как volatile - нормально модифицируется (меняется) в подпрограмме обработки прерывания
компилил в WinAVR камушек ATmega8

Добавлено: Вт июл 11, 2006 13:56:31
xelos
не так интерпретируешь
переменная, не объявленная как volatile может быть размещена как в регистре, так и в памяти.
если она размещена в регистре, то этот регистр может быть изменен в ходе выполнения какого-то прерывания без твоего ведома, т.е. значение может быть изменено самим контроллером.
а volatile указывает что переменная должна быть обязательно размещена в памяти, т.е. по служебным надобнастям мк она изменена не будет.

Volative

Добавлено: Вс авг 06, 2006 04:57:15
Gena
А шоб программа обработки прерывания не гавнякала регистры-пишем при входе:
push r16
in r16,SREG
push r16
push r17
push r18
.............тута сама подпрограмма
..............
pop r18 ;востанавливаем регистры при выходе
pop r17
pop r16
out SREG,r16
pop r16
rety

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

Добавлено: Вс авг 06, 2006 11:05:14
xelos
если пишешь на С, то эту вставку можно заменить средствами самого С.

к асму рекомендую прибегать тока в самом, самом крайнем случае. иначе весь смысл программирования на С теряется.

Добавлено: Чт фев 01, 2007 14:53:52
Abakt
volatile - советую использовать всегда новичкам если вы не знаете точно механизм компиляции компилятора и не можете отключить оптимизацию полностью.