spongebob 0 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Всем привет! Подскажите, пожалуйста, какие операции для AVR (8 бит) + WinAVR будут атомарными, а какие нет. Как я понимаю, все операции с 8-разрядными числами являются атомарными. Если разрядность данных выше - операция не атомарная и необходимо применять спец. средства, чтобы, допустим, при изменении данных в ISR они не были испорчены. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 29 апреля, 2011 Опубликовано 29 апреля, 2011 · Жалоба Есть исключение такое, например: PORTB &= (1<<PB7); При включенной оптимизации транслируется в битовую операцию sbi PORTB,7 А в остальном - для атомарного доступа к переменным, используемым в прерываниях, используйте макросы из atomic.h Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
spongebob 0 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба Есть исключение такое, например: PORTB &= (1<<PB7); При включенной оптимизации транслируется в битовую операцию sbi PORTB,7 Всегда ли? :) Как я понимаю, зависит это от настроек и умности компилятора... А в остальном - для атомарного доступа к переменным, используемым в прерываниях, используйте макросы из atomic.h Это я уже понял, читал :) Допустим, можно ли считать атомарной следующую операцию? bool flag = true; Нижеследующую, однозначно нельзя. long x = 0xabcdefff; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ae_ 2 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба Есть исключение такое, например: PORTB &= (1<<PB7); При включенной оптимизации транслируется в битовую операцию sbi PORTB,7 это PORTB |=(1<<7) можно транслировать в sbi PORTB,7 а PORTB &= (1<<PB7) одной инструкцией сделать не получится. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 1 мая, 2011 Опубликовано 1 мая, 2011 · Жалоба Допустим, можно ли считать атомарной следующую операцию? Нельзя писать программу, использующую атомарные операции, исходя из некоторых предположений о работе компилятора в разных режимах. Это шаманство. Сегодня вы используете компилятор AB X.Y, а завтра CD V.Z Есть atomic.h - вот им и пользуйтесь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
_Pasha 0 3 мая, 2011 Опубликовано 3 мая, 2011 · Жалоба это PORTB |=(1<<7) можно транслировать в sbi PORTB,7 а PORTB &= (1<<PB7) одной инструкцией сделать не получится. Пардон, опечатка. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться