目录
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 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 。。。。。。。 #endif2.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_demux3、编译安装
然后回到 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)