Перейти к содержанию
    

Атомарные операции

Всем привет!

 

Подскажите, пожалуйста, какие операции для AVR (8 бит) + WinAVR будут атомарными, а какие нет.

Как я понимаю, все операции с 8-разрядными числами являются атомарными.

Если разрядность данных выше - операция не атомарная и необходимо применять спец. средства, чтобы, допустим, при изменении данных в ISR они не были испорчены.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть исключение такое, например:

PORTB &= (1<<PB7);

При включенной оптимизации транслируется в битовую операцию sbi PORTB,7

 

А в остальном - для атомарного доступа к переменным, используемым в прерываниях, используйте макросы из atomic.h

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть исключение такое, например:

PORTB &= (1<<PB7);

При включенной оптимизации транслируется в битовую операцию sbi PORTB,7

 

Всегда ли? :)

Как я понимаю, зависит это от настроек и умности компилятора...

 

А в остальном - для атомарного доступа к переменным, используемым в прерываниях, используйте макросы из atomic.h

 

Это я уже понял, читал :)

 

Допустим, можно ли считать атомарной следующую операцию?

 

bool flag = true;

 

Нижеследующую, однозначно нельзя.

 

long x = 0xabcdefff;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Есть исключение такое, например:

PORTB &= (1<<PB7);

При включенной оптимизации транслируется в битовую операцию sbi PORTB,7

это PORTB |=(1<<7) можно транслировать в sbi PORTB,7

а PORTB &= (1<<PB7) одной инструкцией сделать не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Допустим, можно ли считать атомарной следующую операцию?

 

Нельзя писать программу, использующую атомарные операции, исходя из некоторых предположений о работе компилятора в разных режимах. Это шаманство. Сегодня вы используете компилятор AB X.Y, а завтра CD V.Z Есть atomic.h - вот им и пользуйтесь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

это PORTB |=(1<<7) можно транслировать в sbi PORTB,7

а PORTB &= (1<<PB7) одной инструкцией сделать не получится.

Пардон, опечатка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...