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

  • 5
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

地球被支点撬走啦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值