目录

1、创建自己的block(注意 module 与 block 的区别)

1.1、创建 module

1.2、在创建的 myDemux 中创建 block

2、修改相应的代码

2.1、修改 C++ 代码

2.2、修改yaml文件

3、编译安装

4、有关bug的解决


本教程是以实验室实际情况下的经历为背景的记录。主要是记录在修改完某个模块的源码之后,如何创建一个新的模块副本来实现与原来的替换而非覆盖(原始的模块代码并不做修改)。

在实际应用中,我们修改了 gnuradio 的 Header/Payload Demux 模块的源码,但又不想直接覆盖原始代码,因此就需要创建一个名为 my Header/Payload Demux 的自定义模块,在此记录下创建流程以供以后参考。

之前写过如何在 GR3.8 中创建 OOT 模块,其实 GR3.9 中创建 OOT 的方法与 3.8 几乎一样,主要的区别是 GR3.9 中 python 与 C++ 绑定的方式不一样,3.8用的是swing,3.9 用的是 pybind11,但是这都不需要我们考虑,程序会自动进行 python 与 C++ 的绑定。因此整体上没的哈区别。

本过程只简单记录方法,不展开讲。细节可以看流程如下:

1、创建自己的block(注意 module 与 block 的区别)

1.1、创建 module

新建一个文件夹用来存放编写的模块,注意不要与 gnuradio 同一个文件夹,执行下面的命令,首先创建一个名为 myDemux 的 module。

cd  你的文件夹
gr_modtool newmod myDemux

进入 module 中

cd gr-myDemux/

1.2、在创建的 myDemux 中创建 block

之后是添加 block,名为 my_header_payload_demux

teama@teamA:~/USRPWorkArea/mymodule/gr-myDemux$ gr_modtool add -t general -l cpp my_header_payload_demux
GNU Radio module name identified: myDemux
Language: C++
Block/code identifier: my_header_payload_demux
Please specify the copyright holder:
Enter valid argument list, including default arguments:
Add Python QA code? [Y/n] y
Add C++ QA code? [y/N] n
Adding file 'lib/my_header_payload_demux_impl.h'...
Adding file 'lib/my_header_payload_demux_impl.cc'...
Adding file 'include/myDemux/my_header_payload_demux.h'...
Adding file 'python/bindings/docstrings/my_header_payload_demux_pydoc_template.h'...
Adding file 'python/bindings/my_header_payload_demux_python.cc'...
Adding file 'python/qa_my_header_payload_demux.py'...
Editing python/CMakeLists.txt...
Adding file 'grc/myDemux_my_header_payload_demux.block.yml'...
Editing grc/CMakeLists.txt...

2、修改相应的代码

2.1、修改 C++ 代码

编辑相关文件,建议使用VSCode,不为什么,就是方便点,其他编辑器也行

需要将源码文件中的

gr-digital / lib / header_payload_demux_impl.cc

gr-digital / lib / header_payload_demux_impl.h

include / gnuradio / digital / header_payload_demux.h

三个文件内容拷贝到创建的 block 的相应的位置,然后修改相应的源码,注意修改一些类名命名空间namespace包含头文件等内容。这里只举其中几个容易忽略的地方进行说明

1、原来的命名空间:

namespace gr {
namespace digital {
......
}
}

要修改为(每个C++文件中都要修改):

namespace gr {
namespace myDemux {
......
}
}

2、还有原 header_payload_demux_impl.cpp 文件中的所有 header_payload_demux 字段都需要改为 my_header_payload_demux

3、头文件中的预定义名称保持创建时的样子就好

#ifndef INCLUDED_MYDEMUX_MY_HEADER_PAYLOAD_DEMUX_IMPL_H
#define INCLUDED_MYDEMUX_MY_HEADER_PAYLOAD_DEMUX_IMPL_H
。。。。。。。
#endif /* INCLUDED_MYDEMUX_MY_HEADER_PAYLOAD_DEMUX_IMPL_H */

2.2、修改yaml文件

另外,将源码中 grc / digital_header_payload_demux.block.yml 的内容复制到创建的 block 的相应的位置,并注意修改其中所有与 header_payload_demux 有关的内容为 my_header_payload_demux;修改 原 label 标签 Header/Payload Demux 为 my_header_payload_demux;另外还有 import 标签也需要修改为

imports: import myDemux

另外 cpp_templates 标签的 includes 子标签修改为 my_header_payload_demux.h 的绝对路径(图省事)。其他细节比较容易分辨,都需要一一修改。

然后执行以下命令进行 python 与 头文件的绑定。注意!!这步为必要步骤,只要修改了include 文件夹里的头文件(这些都是公共头文件)就需要重新执行这条命令进行绑定,而修改 lib 文件夹里的头文件时可以省略该步骤。该步骤也是与 GR3.8 的一个明显区别。

gr_modtool bind [blockname]

具体地,这里因为创建的 block 名为 my_header_payload_demux,因此命令如下:

gr_modtool bind my_header_payload_demux

3、编译安装

然后回到 gr-myDemux 文件并创建 build 文件夹,然后进行编译。

mkdir build
cd build
cmake ../
make -j10
sudo make install
sudo ldconfig

这就行了。效果如下:

================== 重要的BUG修改 ==================== 

如果编译啥的都通过了,用的时候报错如下

AttributeError: 'myDemux.myDemux_python.my_header_payload_demux' object has no attribute 'to_basic_block'

就是形如:AttributeError: '×××' object has no attribute 'to_basic_block' 这样的错误,这个就又是 binding 文件出问题了(莫慌,bind也就这几个问题,目前还没发现其它问题),解决方法还是官网上的:

就是需要把 python/bindings/[blockname]_python.cc 文件中的相应位置加上这么几个参数:

gr::sync_block,  // 实测这个不要加
gr::block,
gr::basic_block,

加完后的效果:

================== 重要的BUG END ==================== 

最后,如果后续要在新建的 module 中添加新的 block,则需要先到 build 文件夹中吧原来的安装卸掉:

cd build
sudo make uninstall

然后把 build 文件夹删掉

rm -rf build

然后重新建一个 build 文件夹,等新的 block 代码写好后再跟原来的一起编译安装~

4、有关bug的解决

过程中有关的bug及解决方法可以参考:

GNURadio 3.9 使用 OOT 自定义模块问题记录_Flag_ing的博客-CSDN博客最近由于 GR3.8 里的卷积编码模块有问题就换用了GR3.9 ,发现GR3.9 可以正常使用,关于 GR3.8 里的卷积编码模块为什么不能用就先不深究了,之前写过GR3.8 编写 OOT 的流程,GR3.9 编写 OOT 跟 3.8 差别不大,但是有些修改需要注意下。目录1、依赖版本的问题2、每次修改公共头文件后要重新 bind 绑定3、编译啥的都通过了,用的时候有问题了1、依赖版本的问题GR3.9 与GR3.8 一个很重要的区别就是 python 与 C++ 接口的方...https://blog.csdn.net/Flag_ing/article/details/121008197

GNURadio3.9.4创建OOT模块实例相关推荐

  1. GNU Radio3.8创建OOT的详细过程(基础/C++)

    GNU Radio 学习使用 OOT 系列教程: GNU Radio3.8创建OOT的详细过程(基础/C++) GNU Radio3.8创建OOT的详细过程(进阶/C++) GNU Radio3.8创 ...

  2. AWS上创建的notebook实例提示没有导入pytorch模块的解决办法 直接在编辑块中执行如下命令,最后重启kernel问题解决

    AWS上创建的notebook实例提示没有导入pytorch模块的解决办法 直接在编辑块中执行如下命令,最后重启kernel问题解决 conda install pytorch torchvision ...

  3. c语言 threads.h 创建简单的通用多线程模块实例

    对多线程编程的需求不多,因而在这方面的实例和教程很少.对于编程大牛来说,这也不是一个很深奥的实例.这里做一个简单实用的实例,它使用了 C11 标准头 threads.h ,适用于新的多线程标准. th ...

  4. 基于gnuradio的自适应陷波滤波器OOT模块(notch filter)

    基于gnuradio的自适应陷波滤波器OOT模块 Introduction 模型工具gr_modtool 创建OOT Module 创建OOT block 修改impl.h 修改impl.cc 修改a ...

  5. python打开一个不存在的文件时-python判断文件是否存在,不存在就创建一个的实例...

    python判断文件是否存在,不存在就创建一个的实例 如下所示: try: f =open("D:/1.txt",'r') f.close() except IOError: f ...

  6. python判断文件是否存在、不存在则创建_python判断文件是否存在,不存在就创建一个的实例...

    python判断文件是否存在,不存在就创建一个的实例 如下所示: try: f =open("D:/1.txt",'r') f.close() except IOError: f ...

  7. SpringCloud创建Eureka模块集群

    1.说明 本文详细介绍Spring Cloud创建Eureka模块集群的方法, 基于已经创建好的Spring Cloud Eureka Server模块, 请参考SpringCloud创建Eureka ...

  8. SpringCloud创建Gateway模块

    1.说明 本文详细介绍Spring Cloud创建Gateway模块的方法, 基于已经创建好的Spring Cloud父工程, 请参考SpringCloud创建项目父工程, 和已经创建好的Eureka ...

  9. SpringCloud创建Eureka模块

    1.说明 本文详细介绍Spring Cloud创建Eureka模块的方法, 基于已经创建好的Spring Cloud父工程, 请参考SpringCloud创建项目父工程, 在里面创建Eureka模块, ...

  10. GNU Radio3.8创建OOT的详细过程(python)

    GNU Radio 学习使用 OOT 系列教程: GNU Radio3.8创建OOT的详细过程(基础/C++) GNU Radio3.8创建OOT的详细过程(进阶/C++) GNU Radio3.8创 ...

最新文章

  1. 解决WINCE6.0新建工程编译出错的问题
  2. 如何添加java环境变量_如何配置java环境变量
  3. React学习:脚手架搭建、antd引入-学习笔记
  4. C#的二进制序列化组件MessagePack介绍
  5. 使用 Chrome Timeline 来优化页面性能
  6. Androd开发之广告栏设计
  7. v3 微信api 请求微信_GitHub - helibin/wechatpay-postman-script: 微信支付API v3的调试工具...
  8. BSText - YY大神的富文本框架 YYText 的 Swift 版本
  9. html发送邮jmail,[分享]一个ASP写的JMAIL邮件发送测试程序,测试空间是否可以发送邮...
  10. 2019年培养工作室主力计划——第1次任务
  11. c语言中void和define,C语言里面的内联函数(inline)与宏定义(#define)探讨
  12. 理财通app的设计与实现(六)
  13. 利用临时文件恢复PowerPoint(PPT)文件
  14. 电话卡插到终端服务器通话时长,如何降低呼叫中心通话时长而不影响服务质量...
  15. Camera详解(附身份证扫描示例)
  16. 蓝牙室内定位UWB常见场景定位分析
  17. 中国发布了31个加密货币项目排名
  18. matlab实验数据处理
  19. 易百纳rv1126刷firefly的debian固件, 手把手
  20. PLMN各种类型的含义及说明

热门文章

  1. OpenCv鼠标事件
  2. 计算机及应用课程实验,广东北达经贸专修学院主考专业助学班计算机及应用课程实验(二)(实践考核)课程含数据结构、数据库系统原...
  3. mysql 用户 多次登录失败_限制用户登录失败次数,在连续登陆失败10次后冻结该用户。...
  4. 判断是否已经注册过_你的手机号码一定绑定过很多软件,我们如何查询呢?
  5. 计网 - 内容分发网络 : CDN 回源的工作机制初探
  6. 必备技能!聊聊二维码扫码登录的原理
  7. 用钩子(Hook)屏蔽特殊键
  8. c++实现多对多生产者消费者和socket连用
  9. python3 接口获取数据
  10. thinkphp5地址的获取和修改接口过程