цифровая электроника
вычислительная техника
встраиваемые системы

 
» » » Реализация обработчика прерываний на Linux (Debian) посредством Python



Реализация обработчика прерываний на Linux (Debian) посредством Python

Автор: Mike(admin) от 30-06-2021, 23:55

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


Реализация обработчика прерываний на Linux (Debian) посредством Python

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


Реализация обработчика прерываний на Linux (Debian) посредством Python

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


Для реализации проекта подключите кнопку к миникомпьютеру BeagleBone Black согласно следующей схеме.


Реализация обработчика прерываний на Linux (Debian) посредством Python

Код несложный и хорошо задокументирован. В коде мы используем библиотеку «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


Теги: BeagleBone, Python




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

Комментарии:

Оставить комментарий