血泪解决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_devices
,uhd_usrp_probe
,uhd_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),那这个地址就没问题。烧录过程注意事项:
- 保持连接稳定: 在烧录过程中,请确保USRP设备和电脑之间的网络连接(或USB连接,如果您的USRP是USB型号)稳定,不要断开电源或网线。
- 等待完成: 烧录过程可能需要几分钟。终端会显示进度信息。请耐心等待,直到命令执行完成。
- 重启设备: 烧录完成后,通常建议对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 删掉一些缓存文件即可: