C++ GNU无线电中的监视器缓冲区

C++ GNU无线电中的监视器缓冲区,c++,fpga,xilinx,gnuradio,gnuradio-companion,C++,Fpga,Xilinx,Gnuradio,Gnuradio Companion,我有一个关于GNU无线电中块间缓冲的问题。我知道GNU中的每个块(包括自定义块)都有缓冲区来存储将要发送或接收的项目。在我的项目中,我必须维护一个特定的序列来同步块之间的事件。我在Xilinx ZC706 FPGA平台上使用GNU无线电和FMCOMMS5 在GNU radio companion中,我创建了一个自定义块,用于控制板上的GPIO输出端口。此外,我还有一个独立的源代码块,它将信息馈送到FMCOMMS GNU块。我试图维护的顺序是,在GNU无线电中,我首先将数据发送到FMCOMMS块,

我有一个关于GNU无线电中块间缓冲的问题。我知道GNU中的每个块(包括自定义块)都有缓冲区来存储将要发送或接收的项目。在我的项目中,我必须维护一个特定的序列来同步块之间的事件。我在Xilinx ZC706 FPGA平台上使用GNU无线电和FMCOMMS5

在GNU radio companion中,我创建了一个自定义块,用于控制板上的GPIO输出端口。此外,我还有一个独立的源代码块,它将信息馈送到FMCOMMS GNU块。我试图维护的顺序是,在GNU无线电中,我首先将数据发送到FMCOMMS块,然后我想确保FMCOMMS块使用了数据(基本上是通过检查缓冲区),最后我想控制GPIO输出

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

我试图在自定义源的“work”函数中使用pc_output_buffers_full()来监视缓冲区,但我总是得到0.00。我不确定是否应该在自定义块中使用它,或者本例中的“缓冲区”是否与存储输出项的位置不同。下面是一个小代码片段,它显示了问题:

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";
}
charlevel\u count=0,level\u val=1;
矢量增益(1,0.0000);
对于(int i=0;i
不,GNU无线电不是这样工作的(根本不是!)

不久前,我写了一篇文章,解释了GNU Radio是如何处理缓冲区的,以及缓冲区实际上是什么。虽然GNU Radio缓冲区的内存体系结构可能对您不太感兴趣,但让我快速总结一下它的动态:

  • 调用(
    常规
    函数的缓冲区的所有实际功能都类似于线性可寻址环形缓冲区。一次可获得随机数的样本(可限制为最小数、数的倍数),下次调用
    work
    时,您不消费的所有内容都将被交给您
  • 因此,这些缓冲区跟踪您消耗了多少,以及缓冲区中有多少可用空间
  • 块看到的输入缓冲区实际上是流图中“上游”块的输出缓冲区
  • GNU无线电的计算是背压控制的:任何块的
    方法都将立即在一个无限循环中被调用,假设:
  • 块有足够的输入来做功
  • 有足够的输出缓冲区空间进行写入
  • 因此,一旦一个块完成其
    工作
    调用,上游块就会被告知有新的空闲输出空间,因此通常会导致它运行
  • 这导致了高并行性,因为即使是相邻的块也可以同时运行,而不会产生冲突
  • 这种体系结构支持大块的输入项,特别是对于需要相对较长时间才能进入计算机的块:当块仍在工作时,其输入缓冲区已经被样本块填满;当它完成时,很可能会立即再次调用它,而所有可用的输入缓冲区都已经被ne填满w样品
  • 这种架构是异步的:即使两个块在流图中是“并行的”,它们产生的项目数量之间也没有定义的时间关系
我甚至不认为在这个完全不确定的定时数据流图模型中,基于速度计算有时切换gpio是一个好主意。也许你更愿意计算gpio切换的“时间戳”,然后发送(时间戳,gpio状态)FPGA中保持绝对时间的某个实体的命令元组?在无线电传播和高速信号处理的规模上,CPU定时确实是不准确的,您应该利用这样一个事实,即您有一个FPGA来实际实现确定性定时,并使用在CPU上运行的软件(即GNU无线电)决定什么时候应该发生

是否有一种方法可以监控缓冲区,以便我可以确定何时发送了第一部分数据位


除此之外,异步告诉另一个块,是的,您已经处理了N个样本的方法是,要么使用一个块来观察两个块的输出,您希望同步并使用两个输入相同数量的样本,要么使用消息传递实现我们怀疑这不是解决您实际问题的方法。

GNU Radio版本非常旧。请使用较新的版本,从那时起,已经有很多错误修复了。(但这些都没有触及您最初的问题)