Python - бесконечные циклы в потоках и доступ IO - PullRequest
0 голосов
/ 06 августа 2020

У меня есть устройство, работающее на плате NanoPi с Armbian. Мое приложение запускает основной l oop и отдельный поток, использующий встроенную библиотеку потоковой передачи Python. Им обоим нужен доступ к GPIO - один опрашивает несколько входов, другой контролирует некоторые выходы. Я столкнулся с проблемой - когда поток работает, мой интерпретатор Python возвращает ошибку: No access to /dev/mem. Try running as root! Похоже, что один поток может получить доступ к файлу / dev / mem (виртуальный?) За раз. Как мне это решить? Мне нужен постоянный доступ к GPIO, так как я не хочу пропускать никакие входящие импульсы.

def impulse_counter():
    global counter

    while 1:

        if GPIO.event_detected(INPUT_1):
            print("Current cnt state: %d" % (counter))
            counter += 1

Это в отдельном модуле:

    input_counter = threading.Thread(target=mbox_io.impulse_counter)

    if __name__ == "__main__":
    
        input_counter.start()
    
        while 1:
            <Some long code is running here, irrelevant>
            mbox_io.red_off()   

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Я отправлю это как ответ, так как он слишком длинный для комментариев.

Я не знаком с этой конкретной системой и проблемой, но есть много случаев, когда что-то не может быть безопасно доступно из многих потоков. Обычно это означает, что вам нужно перепроектировать свое приложение.

Один из возможных способов решения этой проблемы - добавить еще один поток, который обрабатывает все коммуникации с общим ресурсом. У вас может быть, например, очередь, в которой другие потоки передают «задачи» потоку GPIO, который затем выполняет эти задачи и возвращает результаты, если результаты ожидаются. Это ограничит общий ресурс одним потоком, в то время как вы по-прежнему сможете выполнять большую часть обработки данных в других потоках.

Это может не работать с вашим приложением по разным причинам.

0 голосов
/ 06 августа 2020

Просто предположение, но разве / dev / mem не доступен только для чтения для не- root пользователя? Если да, то разве поток опросчика не работает нормально, а тот, который переключает IOs, возвращает эту ошибку? Что показывает ls -l /dev/mem? И действительно ли использование root помогает, потому что вы этого не заявили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...