В данном материале будет представлена простая демонстрация того, как написать обработчик прерываний на Python для одноплатного компьютера BeagleBone Black, работающего под управлением Debian.

В аппаратном плане это, несомненно, проект для новичков. Однако, сложность заключается в программной части, а именно в написании обработчика прерываний (ISR) на Python для BeagleBone Black, работающему с операционной системой типа Linux, в данном случае использовался образ Debian Buster IoT 2020-04-06.

Ни Python, ни Linux не являются программными средами реального времени. Python называет прерывание «обратным вызовом» (callback). Тем не менее, в этом проекте мы продемонстрируем, что мы можем прервать вычисление аппаратным импульсом, вернуться к прерванному программному обеспечению и продолжить. Это больше демонстрация концепции имитации ISR более или менее в реальном времени в среде, на самом деле не предназначенной для этого. В итоге пользователи, которым необходимо иметь дело с аппаратными прерываниями, смогут адаптировать методологию для выполнения реального проекта.
Для реализации проекта подключите кнопку к миникомпьютеру BeagleBone Black согласно следующей схеме.

Код несложный и хорошо задокументирован. В коде мы используем библиотеку «Adafruit GPIO library for the BBB», которая позволяет нам работать с выводами одноплатного компьютера.
import Adafruit_BBIO.GPIO as GPIO
import time
from math import factorial
from decimal import Decimal, getcontext
getcontext().prec = 120
#
times=0
bounce=40
#
# Правый разъем обозначен как P8, а левый обозначен как P9
# Мы используем разъем P9 и контакт 12, т.е. GPIO_60
#
Pin = "P9_12"
def ISR_P9_12(channel): # Это ISR, который вызывается при обнаружении импульса
global times
times = times + 1
#
# Очистим прерывание и снова включим его в следующий раз
#
GPIO.remove_event_detect(Pin)
time.sleep(0.1)
GPIO.add_event_detect(Pin, GPIO.RISING, callback=ISR_P9_12, bouncetime=bounce)
#
# Первоначальная настройка ISR для срабатывания по нарастающему фронту импульса, подаваемого на банк GPIO P9, вывод 12
#
GPIO.setup(Pin, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.add_event_detect(Pin, GPIO.RISING, callback=ISR_P9_12, bouncetime=bounce)
#
# Вычислим число пи с использованием алгоритма Чудновского согласно:
# craig-wood.com/nick/articles/pi-chudnovsky/
#
def cal_pi(digits):
t= Decimal(0)
pi = Decimal(0)
deno= Decimal(0)
for k in range(digits):
t = ((-1)**k)*(factorial(6*k))*(13591409+545140134*k)
deno = factorial(3*k)*(factorial(k)**3)*(640320**(3*k))
pi += Decimal(t)/Decimal(deno)
pi = pi * Decimal(12) / Decimal(640320 ** Decimal(1.5))
pi = 1/pi
return round(pi,digits+1)
#
# Основной цикл
#
try:
print("Press the button. Use ctrl-C to exit.")
while True:
print(cal_pi(100))
except KeyboardInterrupt:
print()
print("Keyboard interrupt")
print()
print("Detected",times,"button presses")
GPIO.cleanup()
print("GPIO Cleaned")
© digitrode.ru