GNU Radio3.8创建OOT的详细过程(进阶/C++)

2023-05-16

GNU Radio 学习使用 OOT 系列教程:

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

GNU Radio3.8创建OOT的详细过程(进阶/C++)

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

GNU Radio自定义模块:Embedded Python Block的使用

GNU Radio3.8:编辑yaml文件的方法

GNU Radio3.8:创建自定义的QPSK块(C++)

----------------------------------------------------------------------------------------

目录

一、sync block 的创建

二、一些其他类型的块

1、Sources 和 Sinks

2、Hierarchical blocks

3、Decimation Block

4、Interpolation Block


在上篇文章《GNU 3.8创建OOT的详细过程(基础/C++) 》我们创建了一个 general 类型的 block ,文章的结尾我们提到,对于输入输出数据比固定为 1:1 的情况下,我们可以对 “general” 类型的 block 的代码进行进行简化,这样就引出了本文要讲的 sync 类型的 block 。

对于输入输出数据比固定为 1:1 时还有一种特殊情况:即我们需要用到 N 个数据来生成一个输出,但是这 N 个数据中前 N-1 个数据为历史记录的数据,只有第 N 个数据为当前的新数据(类似滑动窗口中每滑动一步就会记载一个新的数据并丢掉一个最旧的数据,注意其与插值 1:N 数据比以及抽取操作 N:1 数据比的区别)。对于前 N-1 个数据来说,这在 GR 中是一种叫做 “history” 的概念,这时就需要在构造函数中或在需求发生变化时调用 set_history()。例如,对于非抽取、非插值的 FIR 滤波器来说,需要检查它产生的每个输出样本的 N 个输入样本,其中 N 是滤波器中的抽头数。但是,它每次只消耗1个输入样本来产生1个输出。

官方对 generalsync 的解释为:

GeneralThis block a generic version of all blocks
SyncThe sync block allows users to write blocks that consume and produce an equal number of items per port. From the user perspective, the GNU Radio scheduler synchronizes the input and output items, it has nothing to with synchronization algorithms

一、sync block 的创建

sync block 的创建过程与 general block 的创建方法类似。我们还在 之前创建的 mymod 模块 的基础上 添加一个名为 square2_ff 的 sync block,作用与之前的 square1_ff 一样。命令为:gr_modtool add -t sync -l cpp square2_ff

wsx@wsx:~/temp/gr-mymod$ gr_modtool add -t sync -l cpp square2_ff
GNU Radio module name identified: mymod
Language: C++
Block/code identifier: square2_ff
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/square2_ff_impl.h'...
Adding file 'lib/square2_ff_impl.cc'...
Adding file 'include/mymod/square2_ff.h'...
Editing swig/mymod_swig.i...
Adding file 'python/qa_square2_ff.py'...
Editing python/CMakeLists.txt...
Adding file 'grc/mymod_square2_ff.block.yml'...
Editing grc/CMakeLists.txt...

同样的,仍然使用 python 测试文件,命令参数及最终生成的文件等内容在 上一篇文章 中已详细介绍,这里就不在赘述啦~

下面是测试代码 python/qa_square2_ff.py 的编写:

# python/qa_square2_ff.py
from gnuradio import gr, gr_unittest
from gnuradio import blocks
import mymod_swig as mymod

class qa_square2_ff(gr_unittest.TestCase):

    def setUp(self):
        self.tb = gr.top_block()

    def tearDown(self):
        self.tb = None

    def test_001_square2_ff(self):
        src_data = (-3, 4, -5.5, 2, 3)
        expected_result = (9, 16, 30.25, 4, 9)
        src = blocks.vector_source_f(src_data)
        sqr = mymod.square2_ff()
        dst = blocks.vector_sink_f()
        self.tb.connect(src, sqr, dst)
        self.tb.run()
        result_data = dst.data()
        self.assertFloatTuplesAlmostEqual(expected_result, result_data, 6)
        # check data

if __name__ == '__main__':
    gr_unittest.run(qa_square2_ff)

然后是 lib/square2_ff_impl.cc 代码的填写:

#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include <gnuradio/io_signature.h>
#include "square2_ff_impl.h"

namespace gr {
  namespace mymod {

    square2_ff::sptr
    square2_ff::make()
    {
      return gnuradio::get_initial_sptr
        (new square2_ff_impl());
    }

    /* 构造函数 */
    square2_ff_impl::square2_ff_impl()
      : gr::sync_block("square2_ff",
                  gr::io_signature::make(1, 1, sizeof (float)), // input signature
                  gr::io_signature::make(1, 1, sizeof (float))) // output signature
    {}

    /* 析构函数 */
    square2_ff_impl::~square2_ff_impl()
    { }

    // work()是执行实际信号处理任务的函数
    int
    square2_ff_impl::work(int noutput_items,
        gr_vector_const_void_star &input_items,
        gr_vector_void_star &output_items)
    {
      const float *in = (const float *) input_items[0];
      float *out = (float *) output_items[0];

      for(int i = 0; i < noutput_items; i++) {
        out[i] = in[i] * in[i];
      }

      // Tell runtime system how many output items we produced.
      return noutput_items;
    }

  } /* namespace mymod */
} /* namespace gr */

上述代码中,测试文件的编写没啥区别,区别主要是在 square2_ff_impl.cc 代码中。可以发现,新的代码中的代码量少了不少,信号处理主函数由 work() 取代了 general_work() ,并且省略了 ninput_items 参数,同时 consume_each() 以及 forecast() 函数也不见了。如果 block 需要大于 1 个 history,则需要在构造函数中或在需求发生变化时调用 set_history()。

这里 forecast 函数虽然没显式调用,但在代码中会隐式实现,系统会默认为1:1的关系。consume_each 函数也是如此。

之后对 square2_ff 进行编译安装。由于之前添加 square2_ff 时 gr_modtool 已自动修改 CMakeList 文件,这里在 build/ 文件夹中可以直接 make,系统会自动重新 cmake 然后再make:

wsx@wsx:~/temp/gr-mymod/build$ make -j10
-- Build type not specified: defaulting to release.
-- Using GMP.
-- User set python executable /usr/bin/python3
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.8.so (found suitable exact version "3.8.10") 
-- Using install prefix: /usr/local
-- Building for version: v1.0-compat-xxx-xunknown / 1.0.0git
-- No C++ unit tests... skipping
-- 
-- Checking for module SWIG
-- Found SWIG version 4.0.1.
-- Found PythonLibs: /usr/lib/x86_64-linux-gnu/libpython3.8.so (found version "3.8.10") 
-- Configuring done
-- Generating done
-- Build files have been written to: /home/wsx/temp/gr-mymod/build
[ 20%] Built target pygen_apps_9a6dd
[ 33%] Built target doxygen_target
[ 33%] Built target _mymod_swig_doc_tag
[ 33%] Built target pygen_python_6451a
Scanning dependencies of target gnuradio-mymod
[ 46%] Built target mymod_swig_swig_doc
Scanning dependencies of target mymod_swig_swig_compilation
[ 60%] Building CXX object lib/CMakeFiles/gnuradio-mymod.dir/square2_ff_impl.cc.o
[ 60%] Swig source mymod_swig.i
[ 60%] Built target mymod_swig_swig_compilation
[ 66%] Linking CXX shared library libgnuradio-mymod.so
[ 73%] Built target gnuradio-mymod
Scanning dependencies of target mymod_swig
[ 80%] Building CXX object swig/CMakeFiles/mymod_swig.dir/CMakeFiles/mymod_swig.dir/mymod_swigPYTHON_wrap.cxx.o
[ 86%] Linking CXX shared module _mymod_swig.so
[ 86%] Built target mymod_swig
[100%] Generating mymod_swig.pyo
[100%] Generating mymod_swig.pyc
[100%] Built target pygen_swig_1e481

之后又是 make test 。。。emmmmm,你可以先 make test 一下试试,如果能通过,当我下面的 BUG 部分啥也没说哈——如果没通过,而且运行 ctest -V -R square 报错的话,那就继续看下面这部分:

============================== BUG ===============================

报错大概是这样的:ImportError: ×××: undefined symbol ×××

ImportError: /path/to/build/swig/_mymod_swig.so: undefined symbol: _ZN2gr5mymod10square2_ff4makeEv

这就遇到一个很神奇的现象,但是并不影响最终的使用,情况是这样的:

情况1:在本例中,我们是继续 这篇文章 的步骤,在 mymod 模块中添加了第二个 block:square2_ff,这时的情况就是之前那个 block:square1_ff 已经编译过一次,我们是在这样一个基础上再对又添加一个 block 后的两个 block 进行编译。这种情况下,在我进行编译测试的过程中,如果 make 之后紧接着就是 make test 的话,就会出现上面提到的这个问题,这时我找遍了 google 的资源,找到了几个遇到过相似问题的解决方法:

python - gnuradio `ImportError undefined symbol` - Stack Overflow

FAQ - GNU Radio

但是,这种解决方式大致的意思就是说cmakelist文件中没有加入跟 square2_ff 有关的库并需要我们手动加入,emmmmm我照做了,但是没啥用(好吧,我承认是我没太看懂这上面大佬的解决方法说的是个啥。。。),但是直觉告诉我 test 没通过可能也不影响后面的使用,之后我就没管这个这个 test 的问题直接进行 gr_modtool makeyaml square2_ff,然后 sudo make install,然后!我发现 test 没通过确实对结果没影响,square1_ff 和 square2_ff 都能在GRC中使用了!后来在回到 build 文件中运行 make test ,它通过了。。。OK,完成,总结就是:

最好在 sudo make install 之后在运行 make test 。

 情况2:在情况1的基础上,我猜测可能是先对 square1_ff 进行编译 的结果影响了后面再加入 的 square2_ff ,因此就尝试删了之前安装好的 block 及 mymod 工程,重新建一个一模一样的,依次完成加入square1_ff / square2_ff 和 相应的 python test 文件等步骤,然后一起一次性完成编译,这时我在 make 命令之后紧接着运行 make test 指令,他真的通过了!

wsx@wsx:~/temp/gr-mymod/build$ make -j10
Scanning dependencies of target pygen_python_6451a
Scanning dependencies of target pygen_apps_9a6dd
Scanning dependencies of target doxygen_target
Scanning dependencies of target _mymod_swig_doc_tag
Scanning dependencies of target gnuradio-mymod
[ 13%] Built target pygen_apps_9a6dd
[ 20%] Generating documentation with doxygen
[ 20%] Generating __init__.pyc
[ 20%] Generating __init__.pyo
[ 26%] Building CXX object swig/CMakeFiles/_mymod_swig_doc_tag.dir/_mymod_swig_doc_tag.cpp.o
[ 33%] Building CXX object lib/CMakeFiles/gnuradio-mymod.dir/square2_ff_impl.cc.o
[ 40%] Building CXX object lib/CMakeFiles/gnuradio-mymod.dir/square1_ff_impl.cc.o
warning: Tag 'PERL_PATH' at line 1686 of file '/home/wsx/temp/gr-mymod/build/docs/doxygen/Doxyfile' has become obsolete.
         To avoid this warning please remove this line from your configuration file or upgrade it using "doxygen -u"
warning: Tag 'MSCGEN_PATH' at line 1707 of file '/home/wsx/temp/gr-mymod/build/docs/doxygen/Doxyfile' has become obsolete.
         To avoid this warning please remove this line from your configuration file or upgrade it using "doxygen -u"
[ 40%] Built target pygen_python_6451a
[ 40%] Built target doxygen_target
[ 46%] Linking CXX executable _mymod_swig_doc_tag
[ 46%] Built target _mymod_swig_doc_tag
Scanning dependencies of target mymod_swig_swig_doc
[ 53%] Generating doxygen xml for mymod_swig_doc docs
warning: Tag 'PERL_PATH' at line 1654 of file '/home/wsx/temp/gr-mymod/build/swig/mymod_swig_doc_swig_docs/Doxyfile' has become obsolete.
         To avoid this warning please remove this line from your configuration file or upgrade it using "doxygen -u"
warning: Tag 'MSCGEN_PATH' at line 1675 of file '/home/wsx/temp/gr-mymod/build/swig/mymod_swig_doc_swig_docs/Doxyfile' has become obsolete.
         To avoid this warning please remove this line from your configuration file or upgrade it using "doxygen -u"
[ 60%] Generating python docstrings for mymod_swig_doc
[ 60%] Built target mymod_swig_swig_doc
Scanning dependencies of target mymod_swig_swig_compilation
[ 66%] Swig source mymod_swig.i
[ 66%] Built target mymod_swig_swig_compilation
[ 73%] Linking CXX shared library libgnuradio-mymod.so
[ 73%] Built target gnuradio-mymod
Scanning dependencies of target mymod_swig
[ 80%] Building CXX object swig/CMakeFiles/mymod_swig.dir/CMakeFiles/mymod_swig.dir/mymod_swigPYTHON_wrap.cxx.o
[ 86%] Linking CXX shared module _mymod_swig.so
[ 86%] Built target mymod_swig
Scanning dependencies of target pygen_swig_1e481
[100%] Generating mymod_swig.pyo
[100%] Generating mymod_swig.pyc
[100%] Built target pygen_swig_1e481
wsx@wsx:~/temp/gr-mymod/build$ make test
Running tests...
Test project /home/wsx/temp/gr-mymod/build
    Start 1: qa_square1_ff
1/2 Test #1: qa_square1_ff ....................   Passed   17.04 sec
    Start 2: qa_square2_ff
2/2 Test #2: qa_square2_ff ....................   Passed    0.73 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) =  18.10 sec

情况就是这么个情况,玄乎。。好了,问题解决了,我们继续讲后面的

============================== END ===============================

下面是安装完成之后的效果:

 运行的结果如下:

二、一些其他类型的块

1、Sources 和 Sinks

Sources 和 Sinks 都是 gr:sync_block 的派生类。唯一不同的是 sources 没有输入端口。sinks没有输出端口,这些由 gr::io_signature::make 控制。可以在源码文件中查看一些例子:

gr-blocks / lib / file_source_impl.cc、file_source.{h,cc}、file_sink_impl.{h,cc} 

2、Hierarchical blocks

Hierarchical(分层) blocks 是由其他 blocks 组成的一种 block,它可以实例化其他 blocks 或者 hierarchical blocks 并将他们连接起来,为了达到这个目的,hierarchical block 内部有一个“connect” 函数可供调用。hierarchical block 可以像普通 block 一样定义输入输出流。

把一个输入 i 连接到一个 hierarchical block 的python 代码:

self.connect((self, <i>), <block>)

类似地,要将信号从输出流 o 上的块发送出去的代码:

self.connect(<block>, (self, <o>))

与创建 sync 及 general 的方法一样,使用 gr_modtool 创建 hierarchical block 的命令如下:

gr_modtool.py add -t hier -l cpp hierblockcpp_ff

3、Decimation Block

decimation(抽取) block 是另一种类型的固定速率块(N : 1),其中输入项的数量是输出项数量的固定倍数。一个  decimation block 的 C++ 例子如下:

#include <gr_sync_decimator.h>

class my_decim_block : public gr_sync_decimator
{
public:
  my_decim_block(...):
    gr_sync_decimator("my decim block", 
                      in_sig,
                      out_sig,
                      decimation)
  {
    //constructor stuff
  }

  //work function here...
};

gr_sync_decimator 构造函数的第四个参数 decimation 为抽取因子。另外,不难理解,输入项目的数量 = noutput_items * decimation

4、Interpolation Block

与decimation block 作用相反,interpolation(插值) block 是另一种固定速率块(1 : N),其中输出项的数量是输入项数量的固定倍数。C++例子如下。

#include <gr_sync_interpolator.h>

class my_interp_block : public gr_sync_interpolator
{
public:
  my_interp_block(...):
    gr_sync_interpolator("my interp block", 
                         in_sig,
                         out_sig,
                         interpolation)
  {
    //constructor stuff
  }

  //work function here...
};

参考网站:

OutOfTreeModules - GNU Radio

BlocksCodingGuide - GNU Radio

GNU Radio Manual and C++ API Reference: gr::block Class Reference

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GNU Radio3.8创建OOT的详细过程(进阶/C++) 的相关文章

  • 英特尔编译器 (C++) 在 std::vector 上减少 OpenMP 问题

    从OpenMP 4 0开始 支持用户定义的缩减 所以我在 C 中准确地定义了 std vector 的减少here 它在 GNU 5 4 0 和 GNU 6 4 0 上运行良好 但在 intel 2018 1 163 上它会返回随机值以进行
  • 在使用 GNU 编译器进行编译期间更改 Linux 中 C++ 应用程序的堆栈大小

    在 OSX 中 C 程序编译期间g I use LD FLAGS Wl stack size 0x100000000 但在 SUSE Linux 中我经常遇到如下错误 x86 64 suse linux bin ld unrecognize
  • 如何使用 Unix join 获取外连接中的所有字段?

    假设我有两个文件 en csv and sp csv 每个包含恰好两个逗号分隔的记录 en csv 1 dog red car 3 cat white boat sp csv 2 conejo gris tren 3 gato blanco
  • 在 GNU 汇编器中处理或记住 cmp 的向后参数的好方法是什么?

    以下是一些采用 Intel 语法的汇编代码 Jump to done if rsi gt rax cmp rsi rax jae done 这对我的大脑来说是有道理的 如果 rsi 高于或等于 rax 你就会跳 匹配中参数的顺序cmp操作说
  • “-ftrapv”和“-fwrapv”:哪个效率更高?

    来自 GNU 网站 ftrapv 此选项针对加法 减法 乘法运算的有符号溢出生成陷阱 fwrapv 此选项指示编译器假设加法 减法和乘法的有符号算术溢出使用二进制补码表示进行回绕 该标志启用一些优化并禁用其他优化 https gcc gnu
  • 在linux中,如何通过GNU ARM汇编进行系统调用

    到目前为止 我只知道如何通过 gnu arm 汇编退出程序 exit 0 mov r0 0 return code mov r7 1 supervisor service number svc call supervisor service
  • GNU sed - 查找或替换空格或新行。为什么这不起作用? v3.02 与 v4.2

    C crp cnp gt sed V GNU sed version 3 02 Copyright C 1998 Free Software Foundation Inc C crp cnp gt type f f a a a a a a
  • GNU Arm 汇编器将 ORR 更改为 MOVW

    我正在组装以下汇编器 syntax unified cpu cortex m4 thumb section text orr r1 12800 orr r1 12801 本质上 只有两个 OR 指令 如果我查看结果objdump I get
  • 使用 gdb 中的函数调用堆栈进行导航

    在 Visual Studio 中 如果单击调用堆栈中的某个条目 则会打开编辑器并显示该函数的源代码 gdb 中可能有类似的东西吗 我在 gdb 中使用 tui 文本用户界面 是否可以让 tui 显示回溯中给定条目的源代码 如果没有 那么如
  • GNU 制作一种双冒号

    我在理解以下 gmake 语法时遇到了一些问题 OBJ foo o bar o OBJ o cpp CC c MMD MP INCLUDES CFLAGS lt o sed create empty targets in file 我不确定
  • 为什么 Nettle 2.4 的 `configure` 找不到 GMP 5.0.2?

    我正在尝试建立GnuTLS http www gnu org software gnutls 在 Mac OS X 10 5 Leopard 服务器上 是的 我知道 它有点过时 但这就是该服务器目前正在运行的 并且遇到了构建问题Nettle
  • GNU Smalltalk 80 调试器。如何调试smallcode代码?启动调试器?

    在 GNU Smalltalk 80 中 可以用您自己的普通代码编写 Smalltalk 代码 个人选择的文本编辑器 因此 调试代码非常重要 首先 将文件另存为 txt 文件 然后 您可以使用 工具 从程序员文本编辑器中打开该文件 这里的工
  • 将 gcc libs .data 放在特定部分?

    我正在尝试为我们的嵌入式系统切换到 GNU GCC 编译器 但由于我们芯片的内存布局被分割 我在链接该项目时遇到了问题 RAM section 1 0x10000 0x12FFF RAM section 2 0x18000 0x1BFFF
  • GNU 日期和自定义格式

    我有一些特定日期格式的字符串 我想使用 GNU date 命令 coreutils 8 20 来处理它们 我可以使用 FORMAT 字符串获取要输出的日期 但不能理解使用相同字符串输入的字符串 我很确定我错过了一些明显的东西 是什么赋予了
  • 对于 Makefile 变量的每个目标

    我的 makefile 如下所示 apps app1 app2 app3 all dir app1 app2 app3 zip cleanup 现在我想在列表上做一些循环apps多变的 就像是 loop on apps endloop 是否
  • GNU gdb 如何显示源文件名和符号行

    当使用 GNU gdb 调试 c 进程时 list 命令将打印行但不告诉我文件名 设置断点可以显示我想要的所有行和文件信息 但我不想设置断点并且必须禁用或删除它 gdb b oyss funtion Breakpoint 13 at 0x8
  • 在 GDB 中显示结构体值

    在 GDB 中 给定一个指向结构体的变量 print将显示原始指针值并x将显示指向的原始字节 有什么方法可以显示指向该结构的数据 即字段及其值的列表 print variable 如果这样做 它将在 GDB 中显示该变量的值 您还可以选择显
  • Makefile 和通配符

    好吧 这是我当前的 makefile 设置 有一些文件名为public01 c public02 c等等 我正在尝试使用以下方法为每个人制作目标文件public o带有通配符的标签 public o public c hashtable h
  • “grep -q”的意义是什么

    我正在阅读 grep 手册页 并遇到了 q 选项 它告诉 grep 不向标准输出写入任何内容 如果发现任何匹配 即使检测到错误 也立即以零状态退出 我不明白为什么这可能是理想或有用的行为 在一个程序中 其原因似乎是从标准输入读取 处理 写入
  • 如何在 Windows 上应用差异补丁?

    有很多程序可以创建差异补丁 但我在尝试应用一个程序时遇到了很大的困难 我正在尝试分发补丁 但用户向我询问了如何应用该补丁 于是我尝试自己弄清楚 结果发现我毫无头绪 而且我能找到的大多数工具都是命令行的 我可以处理命令行 但是如果没有一个漂亮

随机推荐

  • ubuntu安装kvm

    kvm是linux下的虚拟机 文章目录 一 电脑硬件支持二 安装ubuntu三 安装kvm 一 电脑硬件支持 首先不用多说啦 xff0c 既然是虚拟机 xff0c 当然要自己的机器支持虚拟技术 xff0c 重启机器进入biso xff0c
  • 类的静态(static)成员

    有时候类需要它的一些成员与类本身直接相关 xff0c 而不是与类的各个对象保持关联 xff08 这意味着无论创建多少个类的对象 xff0c 静态成员都只有一个副本 xff09 我们通过在成员的声明前加上关键字static使得其与类关联在一起
  • Keil uvision5 介绍

    keil 5 Keil uvision5 安装过程Keil uvision5安装包1 Keil uvision5 介绍2 Keil uVision5 特点3 Keil uVision5 功能4 Keil uVision5 快捷键 Keil
  • px4仿真时,/mavros/state现实连接不上

    仿真时 xff0c 使用px4 xff0c 启动 PX4 Firmware launch文件中的launch文件 进入gazebo世界中 xff0c 通过 xff1a rostopic list 查看发布的话题 xff0c 并且打印 mav
  • 插值方法(一维插值、三次样条插值、二维插值的matlab自带函数,python实现/作图)

    数模比赛中 xff0c 常常需要根据已知的函数点进行数据 模型的处理和分析 xff0c 而有时候现有的数据是极少的 xff0c 不足以支撑分析的进行 xff0c 这时就需要使用一些数学的方法 xff0c 模拟产生 一些新的单又比较靠谱的值来
  • ROS中常用命令

    1 xff09 工作空间初始化 xff1a catkin init workspace 2 xff09 创建功能包 xff1a catkin create pkg pkg name reply 3 xff09 编译工作空间中的功能包 xff
  • 【DL】CNN的前向传播和反向传播(python手动实现)

    卷积层的前向传播和反向传播 说明 本文中 xff0c 只实现一层卷积层的正反向传播 xff08 带激活函数Relu xff09 xff0c 实现的是多通道输入 xff0c 多通道输出的 之前对深度学习的理解大多止于pytorch里面现成的A
  • Postman使用教程详解

    目录 1 Postman安装与接口请求基本操作1 1Postman安装1 2发起一个接口请求的小测试 2 接口测试实战2 1百度IP查询接口从抓包到测试实战2 2需要设置头域的请求实战2 3文件上传与json请求实战 3 Newman命令行
  • GNU Radio3.8创建OOT的详细过程(基础/C++)

    GNU Radio 学习使用 OOT 系列教程 xff1a GNU Radio3 8创建OOT的详细过程 基础 C 43 43 GNU Radio3 8创建OOT的详细过程 进阶 C 43 43 GNU Radio3 8创建OOT的详细过程
  • Johnson-Trotter(JT)算法生成排列

    对于生成 xff5b 1 xff0c xff0c n xff5d 的所有n xff01 个排列的问题 xff0c 我们可以利用减治法 xff0c 该问题的规模减一就是要生成所有 xff08 n 1 xff09 xff01 个排列 假设这个小
  • OSMWebWizard无法使用(Address family not supported by protocol)

    根据报错信息依次打开osmWebWizard py SimpleWebSocketServer py 查看对应行号的内容 xff0c 发现Simple py中有一个socket net6 可能是网络协议的问题 xff0c 查了一下 xff0
  • 粤嵌实训笔记二

    目录 20230227 20230303 xff08 第二周 xff09 main clcd clcd hbmp cbmp hgame cgame h 20230227 20230303 xff08 第二周 xff09 1 在Linux下
  • Arduino学习笔记:FreeRTOS——ESP32多任务处理

    Arduino学习笔记 xff1a FreeRTOS ESP32多任务处理 Demo span class token comment 创建任务一和任务二的句柄 xff0c 并初始化 span TaskHandle t TASK Handl
  • JAVA-信号量

    信号量 xff1a 信号量一般都有以下几个变量 xff1a count xff1a 记录可以使用的资源数wait list xff1a 等待信号量的队列 获取信号量需要判断count是否大于零 xff0c 即if count gt 0 若c
  • (程序猿专属)1024-我用代码写成浪漫情话表白你

    今天1024 xff0c 程序员节 xff01 不祝你们节日快乐了 xff0c 祝你们穿着拖鞋和裤衩去相亲吧 xff01 祝你们和甜蜜的爱情撞个满怀 xff01 一 我是你的什么啊 xff1f 你是我的bug啊 因为 xff0c 我每时每刻
  • C++中构造函数后的冒号

    C 43 43 中构造函数后的冒号 在C 43 43 中离不开类的定义 xff0c 而构造函数则是类的定义中很重要的一环 我们在构造函数中常常见到如下定义 xff1a span class token keyword class span
  • 论C语言没有输出的可能问题

    论C语言没有输出的可能问题 1 今天帮别人找bug xff0c 说是程序没有输出 题目如下 xff1a 错误代码如下 xff1a span class token macro property span class token direct
  • 【VS2019】报错:E0349没有与这些操作数匹配的运算符

    报错 xff1a E0349没有与这些操作数匹配的运算符 调试程序遇到该错误 xff0c 特此记录 span class token macro property span class token directive keyword inc
  • 基于docker技术搭建hadoop与mapreduce分布式环境

    基于docker技术搭建hadoop与mapreduce分布式环境 一 安装doker 1 宿主环境确认 如果没有的话 安装lsb relaease工具 apt install lsb release 检查版本 lsb release a
  • GNU Radio3.8创建OOT的详细过程(进阶/C++)

    GNU Radio 学习使用 OOT 系列教程 xff1a GNU Radio3 8创建OOT的详细过程 基础 C 43 43 GNU Radio3 8创建OOT的详细过程 进阶 C 43 43 GNU Radio3 8创建OOT的详细过程