0

我在使用 UHD USRP C API 最新版本和 Python 3.6 作为编程环境的 Windows 10 系统上的 USB3 上有 2 个 B210 无线电。我可以“有点”在单独的进程中同时运行它们,但想知道是否可以在单个线程中运行它们?如何?

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")
4

1 回答 1

0

是的,您可以有多个multi_usrp句柄。

顺便说一句,请注意 UHD 本身就是 C++,而 C API 只是围绕它的一个包装器。它是为生成脚本接口而设计的,比如你正在使用的 Python 东西(不知道 Python 和你正在使用的 C API 之间的哪个接口——一些自写的东西?)。

虽然有可能,但没有充分的理由从同一个线程调用recvandsend函数——大多数现代机器都是多线程的,你应该利用它。实时 SDR 是一项 CPU 密集型任务,您应该使用所有可用的 CPU 资源从驱动程序获取数据和从驱动程序获取数据,以避免缓冲区溢出。

于 2017-03-21T19:32:31.917 回答