Инструкции

Справочный раздел

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

Разделы инструкций

В сети

Пользователей: 99
Из них просматривают:
Аналоги: 70. Даташиты: 13. Инструкции: 1. Новости: 4. Остальное: 5. Профиль пользователя: 1. Форум: 5.
Участников: 2
Гостей: 97

Google , Яндекс , далее...
Рекорд 2375 человек онлайн установлен 26.12.2015.

Партнёры


Партнёры

Новые объявления

В настоящее время нет объявлений.
Оглавление

volatile

Описание
volatile - это ключевое слово, известное как квалификатор переменной, оно обычно используется перед типом переменной, чтобы изменить способ, которым компилятор и последующая программа обрабатывают переменную.

Объявление переменной volatile - это директива для компилятора. Компилятор - это программное обеспечение, которое переводит ваш код C / C++ в машинный код, который является набором команд для Atmega в Arduino.

В частности, он указывает компилятору загружать переменную из ОЗУ, а не из регистра хранения, который представляет собой временную ячейку памяти, в которой хранятся программные переменные и которыми ими управляют. При определенных условиях значение переменной, хранящейся в регистрах, может быть неточным.

Переменная должна быть объявлена ​​как volatile всякий раз, когда ее значение может быть изменено чем-либо, находящимся вне участка кода, в котором она появляется, например, одновременно выполняющимся потоком. В Arduino единственное место, где это может произойти, - это участки кода, связанные с прерываниями, которые называются процедурами обработки прерываний.


int или long volatiles
Если измененная переменная больше байта (например, 16-битное int или 32-битное), то микроконтроллер не может прочитать ее за один шаг, потому что это 8-битный микроконтроллер. Это означает, что пока ваш основной участок кода (например, ваш цикл) считывает первые 8 бит переменной, прерывание может уже изменить вторые 8 бит. Это приведет к случайным значениям переменной.

Лекарство:
Пока переменная читается, прерывания необходимо отключить, чтобы они не могли вмешиваться в биты во время чтения. Есть несколько способов сделать это:
1. noInterrupts() -  запрет прерываний
2. используйте макрос ATOMIC_BLOCK. Атомарные операции - это отдельные операции MCU - наименьшая возможная единица.

Пример
Модификатор volatile гарантирует, что состояние изменения переменной сразу же будут видны в loop(). Без модификатора volatile состояние переменной может быть загружено в регистр при входе в функцию и больше не будет обновляться до завершения функции.

// переключаем светодиод, когда вызывается прерывание.
// изменением состояния входного пина.

volatile byte changed = 0;

void setup() {
  pinMode(LED_BUILTIN, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(2), toggle, CHANGE);
}

void loop() {
  if (changed == 1) {
   // toggle() has been called from interrupts!

   // Reset changed to 0
   changed = 0;

   // Blink LED for 200 ms
   digitalWrite(LED_BUILTIN, HIGH);
   delay(200);
   digitalWrite(LED_BUILTIN, LOW);
  }
}

void toggle() {
  changed = 1;
}


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

#include // эта библиотека включает макрос ATOMIC_BLOCK.
volatile int input_from_interrupt;

// Где-то в коде, например внутри loop()
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
// code with прерывания заблокированы
int result = input_from_interrupt;
}

Комментарии принадлежат их авторам. Мы не несем ответственности за их содержание.

Разное

Dogecoin (DOGE) Wallet

Интересно

Если "ревёт" один из дросселей резонансного стабилизатора, забейте деревянный клин между его катушками.

Похожие инструкции