Адресация к нескольким устройствам 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 в реальном времени - это сложная задача для ЦП, и вы должны использовать все доступные ресурсы ЦП для получения данных в драйвер и из него, чтобы избежать переполнения буферов.