Урок 19. Ключевое слово global
Оставим схему сборки из урока 16, однако, нам понадобится только модуль кнопки.
В предыдущем уроке мы поговорили о видимости переменных. Ещё раньше мы работали с прерываниями. И здесь нужно знать ещё одну особенность прерываний. Помимо того что код прерываний должен быть максимально простым, нужно учитывать тот момент что у прерываний нет доступа к памяти устройства. То есть внутри функции прерывания мы не можем использовать переменные, которые были объявлены вне функции-обработчика прерывания.
Но как быть, если нужно знать состояние одной из переменных? Здесь придёт на помощь ключевое слово global
, которое указывает на то, что переменная берётся из зоны глобальной видимости (общей видимости всего скрипта).
Вернёмся к уроку 17 по работе с прерываниями. Там мы описали функцию, которая выполняется при прерывании. Это был вывод сообщения о том, с какого вывода поступило прерывание. Доработаем данную функцию. Будем считать количество наступивших прерываний. Для этого введём переменную-счётчик количества прерываний и затем будем при каждом прерывании добавлять к этой переменной единицу.
В области объявления переменных объявим новую переменную и назовём её irq_q, присвоим ей значение 0.
irq_q = 0 # счётчик количества прерываний
А теперь в функции-обработчике прерывания, прибавим к переменной единицу и выведем её значение.
# функция, которая будет вызвана при возникновении прерывания def callback(pin): irq_q = irq_q + 1 # увеличение количества прерываний print("Количество прерываний: ", irq_q)
Если попробовать запустить исправленный скрипт в таком виде, то получим ошибку. Как было сказано выше, у обработчика прерывания нет доступа к переменным, которые были объявлены вне функции. Для того чтобы обеспечить доступ к этой переменной, нужно добавить следующую строку:
global irq_q # "достать" переменную
Весь код будет выглядеть так:
# импорт модулей from machine import Pin # выводы к которым подключены платы: but = Pin(13, Pin.IN) # кнопка irq_q = 0 # счётчик количества прерываний # функция, которая будет вызвана при возникновении прерывания def callback(pin): global irq_q # "достать" переменную irq_q = irq_q + 1 # увеличение количества прерываний print("Количество прерываний: ", irq_q) # подключение прерывания на вывод кнопки but.irq(trigger=Pin.IRQ_RISING, handler=callback) # основной цикл программы while True: pass # ничего не делать
Если теперь запустить скрипт, то при возникновении прерывания в терминале будет выводиться количество прерываний, которое будет соответствовать нажатию кнопки.
Запомнить:
- Функция-обработчик прерываний “не видит” переменные, которые были объявлены вне функции
- Для того чтобы прочитать или изменить переменную вне функции-обработчика, нужно предварительно “достать”
- Ключевое слово global “достаёт” переменную из памяти