【发布时间】: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