Адресация к нескольким устройствам B200 через UHD API

У меня есть 2 радиомодуля B210 по USB3 в системе Windows 10, использующей последний выпуск UHD USRP C API и Python 3.6 в качестве среды программирования. Я могу "как бы" запускать их одновременно в отдельных процессах, но хотел бы знать, возможно ли запустить их в одном потоке? Как?

1 Рад переходить на Linux, если это облегчает ситуацию, я просто больше знаком с Windows.

2 "вроде" = иногда я получаю ошибки, которые могут быть двумя процессами, сталкивающимися где-то вниз по стеку.

Приведенный ниже код иллюстрирует состояние гонки, иногда один или оба процесса завершаются с ошибкой с кодом ошибки 40 (UHD_ERROR_ASSERTION) или иногда с кодом 11 ( UHD_ERROR_KEY)

from ctypes import (windll, byref, c_void_p, c_char_p)
from multiprocessing import Process, current_process

def pread(argstring):
    # get handle for device
    usrp = c_void_p(0)  
    uhdapi = windll.uhd
    p_str=c_char_p(argstring.encode("UTF8"))
    errNo = uhdapi.uhd_usrp_make(byref(usrp),p_str) 
    if errNo != 0: 
        print("\r*****************************************************************")
        print("ERROR: ",errNo," IN: ",  current_process())
        print("=================================================================")
    if usrp.value != 0:
        uhdapi.uhd_usrp_free(byref(usrp))
    return

if __name__ == '__main__':
    while True:
        p2 = Process(target=pread, args=("",))
        p1 = Process(target=pread, args=("",))
        p1.start()
        p2.start()
        p1.join()
        p2.join()
        print("end")

1 ответ

Решение

Да, вы можете иметь несколько multi_usrp ручки.

Кстати, обратите внимание, что UHD изначально является C++, а C API - просто оболочка для этого. Он предназначен для генерации скриптовых интерфейсов, таких как Python, который вы используете (не знаете, какой интерфейс между Python и C Api вы используете - что-то написанное самостоятельно?).

Хотя это возможно, нет веских причин recv а также send функции из одного потока - большинство современных машин многопоточные, и вы должны использовать это. SDR в реальном времени - это сложная задача для ЦП, и вы должны использовать все доступные ресурсы ЦП для получения данных в драйвер и из него, чтобы избежать переполнения буферов.

Другие вопросы по тегам