【问题标题】:Monitor buffers in GNU Radio监视 GNU Radio 中的缓冲区
【发布时间】:2018-12-20 09:57:45
【问题描述】:

我有一个关于在 GNU Radio 中的块之间进行缓冲的问题。我知道 GNU 中的每个块(包括自定义块)都有缓冲区来存储将要发送或接收的项目。在我的项目中,我必须保持一定的顺序来同步块之间的事件。我正在使用带有 FMCOMMS5 的 Xilinx ZC706 FPGA 平台上的 GNU 收音机。

在 GNU 无线电伴侣中,我创建了一个自定义块来控制板上的 GPIO 输出端口。此外,我有一个独立的源代码块,它将信息输入 FMCOMMS GNU 块。我试图保持的顺序是,在 GNU 无线电中,我首先将数据发送到 FMCOMMS 块,其次我想确保数据被 FMCOMMS 块消耗(主要是通过检查缓冲区),最后我想控制 GPIO 输出。

根据我的观察,源块缓冲区似乎直到满了才发送项目。这将在我的项目中造成一个重大问题,因为这意味着 GPIO 数据将在将项目发送到其他 GNU 块之前或同时发送。那是因为我通过在自定义块的“工作”函数中直接访问其地址来设置 GPIO 值。

我尝试在自定义源的“工作”函数中使用 pc_output_buffers_full() 来监控缓冲区,但我总是得到 0.00。我不确定它是否应该在自定义块中使用,或者这种情况下的“缓冲区”是否与存储输出项的位置不同。这是一个显示问题的小代码sn-p:

char level_count = 0, level_val = 1;
vector<float> buff (1, 0.0000);
for(int i=0; i< noutput_items; i++)
{
    if(level_count < 20 && i< noutput_items)
    {
        out[i] = gr_complex((float)level_val,0);
        level_count++;
    }
    else if(i<noutput_items)
    {
        level_count = 0;
        level_val ^=1;
        out[i] = gr_complex((float)level_val,0);
    }
    buff = pc_output_buffers_full();
    for (int n = 0; n < buff.size(); n++)
        cout << fixed << setw(5) << setprecision(2) << setfill('0') << buff[n] << " ";
    cout << "\n";
}

有没有办法监控缓冲区,以便我可以确定我的第一部分数据位何时发送?或者有没有办法确保每个输出项都像连续流一样发送到下一个块?

GNU Radio Companion 版本:3.7.8

操作系统:在 FPGA 上运行的 Linaro 14.04 映像

【问题讨论】:

  • 那个 GNU Radio 版本已经很老了。请使用较新的,从那以后发生了很多错误修复。 (不过,这些都没有触及你原来的问题)

标签: c++ fpga xilinx gnuradio gnuradio-companion


【解决方案1】:

或者有没有办法确保每个输出项都像连续流一样被发送到下一个块?

不,这不是 GNU Radio 的工作方式(根本!):

不久前,我写了一个article,解释了 GNU Radio 如何处理缓冲区,以及这些缓冲区到底是什么。虽然您可能对 GNU Radio 缓冲区的内存架构不太感兴趣,但让我快速总结一下它的动态:

  • 调用 (general_)work 函数的缓冲区的行为类似于线性可寻址环形缓冲区。您一次获得随机数量的样本(限制为最小数量,数字的倍数),并且您未消耗的所有样本都将在下次调用 work 时交给您。
  • 因此,这些缓冲区会跟踪您消耗了多少,从而跟踪缓冲区中有多少可用空间。
  • 块看到的输入缓冲区实际上是流程图中“上游”块的输出缓冲区。
  • GNU Radio 的计算是背压控制的:任何块的work 方法将立即在无限循环中被调用,因为:
    1. 有足够的输入供模块工作,
    2. 有足够的输出缓冲区空间可以写入。
  • 因此,一旦一个块完成其work 调用,就会通知上游块有新的可用输出空间,因此通常会导致它运行
  • 这会导致高并行性,因为即使是相邻的块也可以同时运行而不会发生冲突
  • 这种架构有利于大块输入项,尤其是对于需要相对较长时间进入计算机的块:当块仍在工作时,其输入缓冲区已经被大量样本填充;完成后,很可能会立即再次调用它,所有可用的输入缓冲区都已被新样本填充。
  • 此架构是异步的:即使两个块在您的流程图中“平行”,它们产生的项目数量之间也没有明确的时间关系。

我什至不相信在这个完全非确定性的时序数据流图模型中基于速度计算有时切换 GPIO 是一个好主意。也许您更愿意计算应该切换 GPIO 的“时间戳”,并将(时间戳、gpio 状态)命令元组发送到 FPGA 中保持绝对时间的某个实体?在无线电传播和高速信号处理的规模上,CPU 时序真的不准确,你应该利用你有一个 FPGA 来实际实现确定性时序,并使用运行在CPU(即 GNU Radio)来确定应该发生的时间

有没有办法监控缓冲区,以便我可以确定我的第一部分数据位何时发送?

除此之外,一种异步告诉另一个块的方法是,是的,你已经处理了 N 个样本,要么有一个块,它只观察你想要同步的两个块的输出并消耗一个来自两个输入的相同数量的样本,或者使用消息传递来实现某些东西。同样,我怀疑这不是您实际问题的解决方案。

【讨论】:

    猜你喜欢
    • 2021-09-18
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-14
    • 1970-01-01
    • 2015-07-08
    • 1970-01-01
    相关资源
    最近更新 更多