GNURadio中的错误及解决方发

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_*函数必然出了问题,可以去查。





  • 1
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值