通过 UHD 寻址多个 B200 设备 API
Addressing multiple B200 devices through the UHD API
我在 Windows 10 系统的 USB3 上有 2 个 B210 收音机,使用 UHD USRP C API 最新版本和 Python 3.6 作为编程环境。我可以在单独的进程中同时 "sort of" 运行 它们,但想知道是否可以在单个线程中 运行 它们?怎么样?
1 很高兴搬到 Linux 如果它让事情变得更容易,我只是更熟悉 Windows。
2 "sort of" = 我有时会遇到错误,这可能是两个进程在堆栈的某处发生冲突。
下面的代码说明了竞争条件,有时一个或两个进程失败,错误代码为 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")
是的,您可以有多个 multi_usrp
句柄。
顺便说一句,请注意 UHD 本身是 C++,而 C API 只是它的包装器。它是为生成脚本接口而设计的,比如你正在使用的 Python 东西(不知道 Python 和你正在使用的 C API 之间的哪个接口——是自己写的?) .
虽然有可能,但没有充分的理由从同一个线程调用 recv
和 send
函数——大多数现代机器都是多线程的,您应该利用它。实时 SDR 是一项 CPU 密集型任务,您应该使用所有可用的 CPU 资源从驱动程序中获取数据,以避免缓冲区溢出。
我在 Windows 10 系统的 USB3 上有 2 个 B210 收音机,使用 UHD USRP C API 最新版本和 Python 3.6 作为编程环境。我可以在单独的进程中同时 "sort of" 运行 它们,但想知道是否可以在单个线程中 运行 它们?怎么样?
1 很高兴搬到 Linux 如果它让事情变得更容易,我只是更熟悉 Windows。
2 "sort of" = 我有时会遇到错误,这可能是两个进程在堆栈的某处发生冲突。
下面的代码说明了竞争条件,有时一个或两个进程失败,错误代码为 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")
是的,您可以有多个 multi_usrp
句柄。
顺便说一句,请注意 UHD 本身是 C++,而 C API 只是它的包装器。它是为生成脚本接口而设计的,比如你正在使用的 Python 东西(不知道 Python 和你正在使用的 C API 之间的哪个接口——是自己写的?) .
虽然有可能,但没有充分的理由从同一个线程调用 recv
和 send
函数——大多数现代机器都是多线程的,您应该利用它。实时 SDR 是一项 CPU 密集型任务,您应该使用所有可用的 CPU 资源从驱动程序中获取数据,以避免缓冲区溢出。