GNURadio3.9.4创建OOT模块实例
目录
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模块实例相关推荐
- GNU Radio3.8创建OOT的详细过程(基础/C++)
GNU Radio 学习使用 OOT 系列教程: GNU Radio3.8创建OOT的详细过程(基础/C++) GNU Radio3.8创建OOT的详细过程(进阶/C++) GNU Radio3.8创 ...
- AWS上创建的notebook实例提示没有导入pytorch模块的解决办法 直接在编辑块中执行如下命令,最后重启kernel问题解决
AWS上创建的notebook实例提示没有导入pytorch模块的解决办法 直接在编辑块中执行如下命令,最后重启kernel问题解决 conda install pytorch torchvision ...
- c语言 threads.h 创建简单的通用多线程模块实例
对多线程编程的需求不多,因而在这方面的实例和教程很少.对于编程大牛来说,这也不是一个很深奥的实例.这里做一个简单实用的实例,它使用了 C11 标准头 threads.h ,适用于新的多线程标准. th ...
- 基于gnuradio的自适应陷波滤波器OOT模块(notch filter)
基于gnuradio的自适应陷波滤波器OOT模块 Introduction 模型工具gr_modtool 创建OOT Module 创建OOT block 修改impl.h 修改impl.cc 修改a ...
- python打开一个不存在的文件时-python判断文件是否存在,不存在就创建一个的实例...
python判断文件是否存在,不存在就创建一个的实例 如下所示: try: f =open("D:/1.txt",'r') f.close() except IOError: f ...
- python判断文件是否存在、不存在则创建_python判断文件是否存在,不存在就创建一个的实例...
python判断文件是否存在,不存在就创建一个的实例 如下所示: try: f =open("D:/1.txt",'r') f.close() except IOError: f ...
- SpringCloud创建Eureka模块集群
1.说明 本文详细介绍Spring Cloud创建Eureka模块集群的方法, 基于已经创建好的Spring Cloud Eureka Server模块, 请参考SpringCloud创建Eureka ...
- SpringCloud创建Gateway模块
1.说明 本文详细介绍Spring Cloud创建Gateway模块的方法, 基于已经创建好的Spring Cloud父工程, 请参考SpringCloud创建项目父工程, 和已经创建好的Eureka ...
- SpringCloud创建Eureka模块
1.说明 本文详细介绍Spring Cloud创建Eureka模块的方法, 基于已经创建好的Spring Cloud父工程, 请参考SpringCloud创建项目父工程, 在里面创建Eureka模块, ...
- GNU Radio3.8创建OOT的详细过程(python)
GNU Radio 学习使用 OOT 系列教程: GNU Radio3.8创建OOT的详细过程(基础/C++) GNU Radio3.8创建OOT的详细过程(进阶/C++) GNU Radio3.8创 ...
最新文章
- 解决WINCE6.0新建工程编译出错的问题
- 如何添加java环境变量_如何配置java环境变量
- React学习:脚手架搭建、antd引入-学习笔记
- C#的二进制序列化组件MessagePack介绍
- 使用 Chrome Timeline 来优化页面性能
- Androd开发之广告栏设计
- v3 微信api 请求微信_GitHub - helibin/wechatpay-postman-script: 微信支付API v3的调试工具...
- BSText - YY大神的富文本框架 YYText 的 Swift 版本
- html发送邮jmail,[分享]一个ASP写的JMAIL邮件发送测试程序,测试空间是否可以发送邮...
- 2019年培养工作室主力计划——第1次任务
- c语言中void和define,C语言里面的内联函数(inline)与宏定义(#define)探讨
- 理财通app的设计与实现(六)
- 利用临时文件恢复PowerPoint(PPT)文件
- 电话卡插到终端服务器通话时长,如何降低呼叫中心通话时长而不影响服务质量...
- Camera详解(附身份证扫描示例)
- 蓝牙室内定位UWB常见场景定位分析
- 中国发布了31个加密货币项目排名
- matlab实验数据处理
- 易百纳rv1126刷firefly的debian固件, 手把手
- PLMN各种类型的含义及说明
热门文章
- OpenCv鼠标事件
- 计算机及应用课程实验,广东北达经贸专修学院主考专业助学班计算机及应用课程实验(二)(实践考核)课程含数据结构、数据库系统原...
- mysql 用户 多次登录失败_限制用户登录失败次数,在连续登陆失败10次后冻结该用户。...
- 判断是否已经注册过_你的手机号码一定绑定过很多软件,我们如何查询呢?
- 计网 - 内容分发网络 : CDN 回源的工作机制初探
- 必备技能!聊聊二维码扫码登录的原理
- 用钩子(Hook)屏蔽特殊键
- c++实现多对多生产者消费者和socket连用
- python3 接口获取数据
- thinkphp5地址的获取和修改接口过程