> 技术文档 > 血泪解决ubuntu下UHD和GNURadio的fpga版本向下兼容(need 38 but got 39)_ubuntu uhd-images

血泪解决ubuntu下UHD和GNURadio的fpga版本向下兼容(need 38 but got 39)_ubuntu uhd-images


问题背景

今年二月份的时候初次接触USRP硬件,由于我自己之前下载过GNURadio(简称gnu),可能当时顺便也把UHD下载了。导致我连接硬件的时候一直有这个报错:

当时就是按照这个提示,出现了问题的变种:

在终端里可以使用,但是一到了gnu运行文件就是还是39的高配版本……

网上给的中文帖子都没有解释的特别清楚地)折磨两三天,尝试了通过命令烧录以及自己找官网文件烧录(非常不推荐,因为官网的文件版本说明很少,乱码的命名你根本不知道对应哪个版本。我当时赌了一把,刷一个特别老的image把机子刷成砖头了qaq虽然胆战心惊找了恢复的方式,但之后就一直在win下用usrp)。这周开始尝试解决这个问题,(在win下跑gnu据说没有linux流畅)。终于解决了,开心!
我在谷歌上看到一些人讨论的论坛,结合自己的情况找到了最有关的可能性------我下载了多个UHD版本。

验证我的猜测:在linux终端uhd_find_devices命令依赖的版本和GNURadio的不一样……终端里面是4.8.0版本,gnu里面是4.1.0版本。

第一次尝试:直接暴力卸载GNURadio和UHD,然后再用PPA方式按装,没有鸟用。

反思:感觉是我自己没有卸载干净,对终端操作命令不了解,基本是gpt老师指哪打哪。

第二次尝试:和一些朋友有过交流以及我充分向AI老师说明了我的“酷比惨境”后,AI老师带领我走向了胜利的曙光。

另外:我之前已经安装了UHD的依赖项,检查到系统有4.1.0,4.8.0版本的UHD

正式解决方案

step1通过命令查找安装的UHD版本,结果是:

apt list --installed | grep uhd 

step2:删除大法好 

sudo apt remove --purge uhd-host# 1. 停止任何可能正在使用UHD的服务或应用程序,例如GNURadio、您的自定义程序等。# 如果GNURadio正在运行,请先关闭。# 2. 执行以下命令删除所有UHD 4.8.0相关软件包sudo apt purge \\ libuhd-dev \\ libuhd4.8.0 \\ python3-uhd \\ uhd-host \\ uhd-images \\#如果找不到这个就删掉 -ysudo apt autoremove -y#一步步执行代码即可

解释:

  • libuhd-dev: 包含了4.8.0的头文件和静态库,用于编译依赖UHD的应用程序。
  • libuhd4.8.0: 4.8.0版本的运行时动态库。
  • python3-uhd: 4.8.0版本的Python接口。
  • uhd-host: 包含了UHD的工具集(如 uhd_find_devicesuhd_usrp_probeuhd_images_downloader 等),这些工具现在是4.8.0版本。
  • uhd-images: 包含了UHD 4.8.0对应的FPGA固件和其他镜像。

step3:更新动态链接库缓存

sudo ldconfig

step4:验证UHD 4.8.0是否已被彻底删除

现在,再次检查您的UHD安装情况:

apt list --installed | grep uhd

或者直接运行uhd_find_devices试试,若找不到该文件,运行不了就说明已经删掉了,这个时候检查有关的uhd文件,我的系统还存在4.1.0 

step5:可以开始操作4.1.0版本的UHD了

现在您的系统上只有 libuhd4.1.0 这个库文件,但没有配套的 uhd-host 工具包。为了让GNURadio能正确工作,并能够下载和烧录FPGA固件,最可靠的方法是重新从源码编译安装UHD 4.1.0。这样可以确保所有的库、头文件和工具都是4.1.0版本,并且它们能被GNURadio正确链接。——gemini老师

5-1:先安装UHD依赖项。在网站上有不同系统版本对应的指令。我已经安装了,可以跳过,当然你在运行一下检查一下也可以咯。

安装编译UHD 4.1.0所需的依赖项: 您最开始提供的依赖项列表很可能已经满足了,因为它们多数是通用库。如果之前没有完整安装,或者您希望重新确认,可以再次运行:

sudo apt-get update sudo apt-get -y install autoconf automake build-essential ccache cmake cpufrequtils doxygen ethtool fort77 g++ gir1.2-gtk-3.0 git gobject-introspection gpsd gpsd-clients inetutils-tools libasound2-dev libboost-all-dev libcomedi-dev libcppunit-dev libfftw3-bin libfftw3-dev libfftw3-doc libfontconfig1-dev libgmp-dev libgps-dev libgsl-dev liblog4cpp5-dev libncurses5 libncurses5-dev libpulse-dev libqt5opengl5-dev libqwt-qt5-dev libsdl1.2-dev libtool libudev-dev libusb-1.0-0 libusb-1.0-0-dev libusb-dev libxi-dev libxrender-dev libzmq3-dev libzmq5 ncurses-bin python3-cheetah python3-click python3-click-plugins python3-click-threading python3-dev python3-docutils python3-gi python3-gi-cairo python3-gps python3-lxml python3-mako python3-numpy python3-opengl python3-pyqt5 python3-requests python3-scipy python3-setuptools python3-six python3-sphinx python3-yaml python3-zmq python3-ruamel.yaml swig wget

5-2:从源代码编译UHD4.1.0版本,我以为会很麻烦其实还好)。

5-2-1-1下载UHD 4.1.0源码:

#下载UHD 4.1.0源码:mkdir ~/uhd_sourcecd ~/uhd_sourcegit clone https://github.com/EttusResearch/uhd.gitcd uhdgit checkout v4.1.0.0 # 切换到UHD 4.1.0.0版本标签

如果一开始git不到网站,试着ping一下github.com,ping成功再执行一下

5-2-1-2:编译UHD4.1.0 

 据说这个命令是能够适应电脑自身CPU核心数,加速进程。

编译的完整命令:

mkdir buildcd buildcmake -DCMAKE_INSTALL_PREFIX=/usr/local ../host # 默认安装到/usr/localmake -j$(nproc)sudo make installsudo ldconfig # 再次更新动态链接库缓存

5-2-2配置过程还是蛮长时间的,然后更新动态链接库、下载image:

5-3:uhd_usrp_probe(用devices那条无法验证是否兼容的问题)命令验证结果,在5-3中遇到了fpga版本不兼容问题看第六步

5-4:如果你之后需要固定某个 UHD 版本使用,可以考虑把 uhd-host 设置成 hold(防止 apt 更新):

sudo apt-mark hold uhd-host libuhd4.1.0

step6不兼容FPGA重新烧录image :

sudo /usr/local/bin/uhd_image_loader --args=\"type=x300,addr=192.168.10.2\"#改你自己的设备ip

这个命令就是用来将您刚才下载到本地的FPGA固件(版本38)烧录到您的USRP X300设备的板载闪存中。

重要说明:来自gemini老师

  • sudo: 烧录固件通常需要root权限,所以请务必加上 sudo
  • /usr/local/bin/uhd_image_loader: 这是您从源码编译安装UHD 4.1.0后,uhd_image_loader 工具的完整路径。
  • --args=\"type=x300,addr=192.168.10.2\":
    • type=x300: 明确指定您的设备类型是X300系列。
    • addr=192.168.10.2: 这是您的USRP X300的IP地址。请确保这个IP地址是您USRP实际的IP地址。 如果不确定,您可以使用 ping 192.168.10.2 检查是否能ping通,或者使用其他网络扫描工具确认。如果您的USRP使用的是默认的IP(通常是192.168.10.2),那这个地址就没问题。

烧录过程注意事项:

  1. 保持连接稳定: 在烧录过程中,请确保USRP设备和电脑之间的网络连接(或USB连接,如果您的USRP是USB型号)稳定,不要断开电源或网线。
  2. 等待完成: 烧录过程可能需要几分钟。终端会显示进度信息。请耐心等待,直到命令执行完成。
  3. 重启设备: 烧录完成后,通常建议对USRP设备进行断电再上电,以确保新的固件完全加载。有些设备在烧录完成后会自动重启,但手动操作更保险。

在烧录的时候,usrp的网线口上面指示灯一个常亮黄,一个橙色)。

烧录完成,并重启USRP后,再次运行 uhd_usrp_probe 来验证FPGA固件版本

uhd_usrp_probe

找到自己已经更新的fpga版本就说明大功告成!

step7:安装GNURadio:

由于您已经卸载了GNURadio,并且系统已经更新,我们可以直接进行安装。

7-1添加 GNU Radio 的官方 PPA (如果之前删除了PPA,或不确定是否还在) 这一步是确保您的 apt 知道从哪里获取GNURadio的最新版本。

sudo add-apt-repository ppa:gnuradio/gnuradio-releases sudo apt update

add-apt-repository 会将PPA添加到您的软件源列表中。

apt update 会更新您的本地包列表,以便识别PPA中的新软件包。

7-2安装 GNU Radio 这一步会下载并安装GNURadio及其所有必要的依赖项。由于您之前安装过UHD的依赖项,很多通用的库可能已经存在,所以安装过程会比较快。

sudo apt install gnuradio gnuradio-dev -y

gnuradio: GNU Radio Companion (GRC) 和其他核心运行时组件。

gnuradio-dev: 包含了开发所需的头文件和静态库,如果您打算编译OOT(Out-Of-Tree)模块,这个包是必需的。

-y: 自动回答“是”以确认安装,避免交互式提示。

7-3验证安装 安装完成后,验证GNURadio是否正常工作,并确保它能正确找到您的UHD设备。

gnuradio-companion启动 GNU Radio Companion

如果GRC能够正常启动,说明基本安装成功。

在这种安装方式下,gnuradio\'通过命令和行打开。如果运行文件出现警告:

直接sudo apt install xterm即可。

打开以后如果界面没有block section 删掉一些缓存文件即可: