GNURadio中的错误及解决方发

本文汇总了GNU Radio开发中常见的六种错误及其解决方案,包括共享内存配置、模块导入失败、缓冲区请求不匹配等问题,并提供了详细的排查步骤及修复建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、buffer相关的错误之一        

        错误信息:

gr::vmcircbuf_sysv_shm: shmget(1): 无效的参数
gr::vmcircbuf_sysv_shm: shmget(1): 无效的参数
gr::vmcircbuf_sysv_shm: shmget(1): 无效的参数
gr::buffer::allocate_buffer: failed to allocate buffer of size 30728 KB
gr::vmcircbuf_sysv_shm: shmget(1): 无效的参数
gr::vmcircbuf_sysv_shm: shmget(1): 无效的参数
gr::vmcircbuf_sysv_shm: shmget(1): 无效的参数
gr::buffer::allocate_buffer: failed to allocate buffer of size 30728 KB
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc


参考解决方案:

首先在命令行中执行:

sysctl kernel.shmmax,来查看系统的共享缓存大小,
如果过小的话,执行:
sudo sysctl -w kernel.shmmax=2147483648
来增大系统的共享缓存
参考:https://www.ruby-forum.com/topic/4418749#new

2、ImportError  

完整错误信息:

Traceback (most recent call last):
  File "/home/abing/pro/test_ca.py", line 17, in <module>
    import lte_sat
  File "/usr/local/lib/python2.7/dist-packages/lte_sat/__init__.py", line 45, in <module>
    from lte_sat_swig import *
  File "/usr/local/lib/python2.7/dist-packages/lte_sat/lte_sat_swig.py", line 26, in <module>
    _lte_sat_swig = swig_import_helper()
  File "/usr/local/lib/python2.7/dist-packages/lte_sat/lte_sat_swig.py", line 22, in swig_import_helper
    _mod = imp.load_module('_lte_sat_swig', fp, pathname, description)
ImportError: /usr/local/lib/libgnuradio-lte_sat.so: undefined symbol: fftwf_execute

可能的错误原因:

我这里碰到的错误时我自己写的、并不是用gr_modtool工具添加的,头文件在include/目录下,c/c++文件在lib/目录下,同时在各自目录下的CmakeLists.txt中添加相应的文件名以便于make安装,原本以为这样就可以执行,其实不然,还需要在swig/目录下在**_swig.i文件中包含include目录下的头文件名,用于wrap  C 程序到Python中。


还有,检查总目录下的CmakeLists.txt文件中是否有:find_package(FFTW3f) ,如果没有,那么在make的过程中虽然不会报错,但编译并没有连接到fftw库,需要添加上,这一句尤为重要。

3、buffer相关的错误之二

完整错误信息:

sched: <block dl_baseband_sync (2)> is requesting more input data
  than we can provide.
  ninput_items_required = 20000
  max_possible_items_available = 10239
  If this is a filter, consider reducing the number of taps.

错误原因:

        自定义模块的输入与输出之间比例过大,但是并没有通知top_block或者相关的调度模块,关于输入或者输出一端所需数据量过大,因此系统按照默认配置的值分配的输入与输出buffer不能满足要求,如上面提示的,系统提供的最大输入缓存为10239,而实际所需的为20000,必然出现错误.

解决办法:

        GNURadio的top_block提供了接口函数:

void set_relative_rate(double rate)
可以调用设置,之后就可解决这个问题.

4、undefined reference to `uhd::device_addr_t::device_addr_t

完整错误信息:

libgnuradio-lte_sat.so: undefined reference to `gr::uhd::usrp_sink::make(uhd::device_addr_t const&, uhd::stream_args_t const&)'
libgnuradio-lte_sat.so: undefined reference to `uhd::time_spec_t::operator-=(uhd::time_spec_t const&)'
libgnuradio-lte_sat.so: undefined reference to `uhd::time_spec_t::time_spec_t(double)'
libgnuradio-lte_sat.so: undefined reference to `uhd::time_spec_t::get_system_time()'
libgnuradio-lte_sat.so: undefined reference to `uhd::time_spec_t::time_spec_t(long, double)'
libgnuradio-lte_sat.so: undefined reference to `uhd::device_addr_t::device_addr_t(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'

错误原因:

       这是连接(link)错误,首先能说明,头文件包含正确,因为已经能够完成编译,但是在链接(link)过程中没有找到相应的动态库,就是libuhd.so和libgnuradio-uhd.so,可能的原因有两个:

1)uhd或者gnuradio安装路径不是默认的,即其库文件没有在/usr/local/lib/目录下;

2)自己定义的功能模块的CMakelists.txt中没有指定连接到相应的库;

解决办法:

          对于原因1),要么手动修改路径,要么重新安装。

          对于2),要手动修改CMakelists.txt,在/lib/目录下的修改为:

include_directories(
    ${Boost_INCLUDE_DIR}
    ${CMAKE_CURRENT_BINARY_DIR}
    ${GR_UHD_INCLUDE_DIRS}
    ${GNURADIO_RUNTIME_INCLUDE_DIRS}
    ${UHD_INCLUDE_DIRS}
)

link_directories(
  ${UHD_LIBRARY_DIRS}
  ${GR_UHD_LIBRARY_DIRS}
)
          对于外面总的CMakelists.txt,

set(GR_REQUIRED_COMPONENTS RUNTIME FILTER UHD)
find_package(UHD)

5、RuntimeError: fifo ctrl timed out looking for acks

完整错误信息:

 File "/usr/local/lib/python2.7/dist-packages/gnuradio/uhd/__init__.py", line 116, in constructor_interceptor
   return old_constructor(*args)
 File "/usr/local/lib/python2.7/dist-packages/gnuradio/uhd/uhd_swig.py", line 2895, in usrp_sink
   return _uhd_swig.usrp_sink(*args)
RuntimeError: RuntimeError: fifo ctrl timed out looking for acks

硬件为USRP N210      

错误原因:

一般情况下是由于网络传输的丢包造成的;一般使用N210时候会用到千兆网卡,所以主机直接连到USRP不会有问题,而需要通过千兆交换机/路由器来访问USRP的时候一般会出现问题。至少我们用的是这种情况,由于USRP N210数据传输采用UDP协议,而UDP通过交换机时候在大量吞吐量时候难免会丢包,因此产生上述错误。


暂时未能在网上找到这种错误的解决办法,期待大牛能给出答案。


6、RuntimeError: port does not exist

完整错误信息:

Traceback (most recent call last):
  File "/home/abing/software/grc_work/new_test.py", line 96, in <module>
    tb = new_test()
  File "/home/abing/software/grc_work/new_test.py", line 38, in __init__
    self.lte_sat_dl_baseband_sync_0 = lte_sat.dl_baseband_sync(0.8)
  File "/usr/local/lib/python2.7/dist-packages/lte_sat/lte_sat_swig.py", line 10124, in make
    return _lte_sat_swig.dl_baseband_sync_make(*args, **kwargs)
RuntimeError: port does not exist

错误原因:

       首先找到了这句错误的打印位置:$/gnuradio-3.7.2.1/gnuradio-runtime/lib/basic_block.cc,函数

void basic_block::message_port_pub(pmt::pmt_t port_id, pmt::pmt_t msg)
执行过程中首先检测所要输出的消息id,就是message_port_register_*函数注册时候的参数,因为在注册时候系统将该string转换成可识别的类型,然后将该string与实际的消息端口一字典(dict)的形式映射到一起,在上面的函数中,首先检测所要发布消息的port_id在映射的字典中是否存在,不存在则说明在此之前的message_port_register_*函数必然出了问题,可以去查。





### GNURadio 安装与配置指南 #### 1. 准备工作 在安装 GNU Radio 前,需确保操作系统已更新至最新状态并安装必要的依赖项。对于 Ubuntu 18.04 用户,可以按照以下方法准备环境[^1]。 ```bash sudo apt update && sudo apt upgrade -y sudo apt install build-essential python3-dev python3-numpy git cmake libboost-all-dev \ libgmp-dev swig doxygen pybind11-dev python3-sip qtbase5-dev python3-pyqt5 \ python3-scipy python3-matplotlib python3-gi-cairo gir1.2-goocanvas-2.0 \ libffi-dev libgsl-dev libusb-1.0-0-dev python3-lxml python3-click python3-zmq \ libsdl1.2-dev gnuradio-devuhd-host uhd-utils ``` 上述命令会安装一系列基础工具和库文件,这些是构建 GNU Radio 所必需的资源。 --- #### 2. 获取源码 通过 Git 工具克隆官方仓库中的 GNU Radio 源代码到本地机器上: ```bash git clone https://gitcode.com/gh_mirrors/gn/gnuradio.git cd gnuradio ``` 此操作将下载最新的稳定版本源码,并进入对应的目录以便后续编译过程顺利进行[^3]。 --- #### 3. 构建与安装 完成准备工作之后,依次执行以下脚本来完成项目的初始化、配置以及最终部署阶段的工作流程[^2]: ```bash ./bootstrap ./configure --prefix=/usr/local/gnuradio make -j$(nproc) sudo make install ``` 其中 `-j$(nproc)` 参数用于加速多核 CPU 的编译效率;如果遇到权限不足的情况,则可能需要额外赋予写入目标路径 `/usr/local/gnuradio` 的适当访问权限。 --- #### 4. 验证安装成果 为了确认整个设置环节无误,可尝试启动图形界面版的应用程序 `gnuradio-companion` 来测试基本功能是否正常运作[^4]。 ```bash gnuradio-companion & ``` 当成功弹出设计窗口即表明系统集成完毕。另外还可以借助简单 Python 脚本进一步检测核心模块加载状况: ```python import gnuradio print(gnuradio.version()) ``` 若能正确返回当前使用的 GNU Radio 版本号字符串则说明一切就绪! --- ### 注意事项 某些情况下初次运行相关指令可能会触发错误提示信息,请关闭现有 shell session 并重新打开后再试一次即可解决大部分常见问题。 ---
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值