c++ - GNU Radio general_work()函数

标签 c++ gnuradio

我在将general_work函数用于将 vector 作为输入并输出消息的块时遇到了麻烦。

该块是一种解调器。实际上,如果我定期(周期性地)发送一些数据,那会很好。

但是我只需要创建一个具有预定义大小的数据(帧)并将其发送到此块即可。我希望该块能够处理其缓冲区中的所有项目,而无需等待更多数据。

据我了解,它与GNU Radio的缓冲和调度程序结构有关,但是,我无法弄清楚如何为该块提供一种功能,以处理我已发送的所有帧符号,而无需等待另一个帧。

例如,假设我的框架有150个符号。调度程序会两次,三次或四次调用general_work函数(我不知道它如何决定general_work的调用次数)。

但是,它在符号141或143处停止说。每次运行它时,它都在不同的符号号处停止。如果我发送另一帧,则它完成了处理缓冲区中剩余项目(符号)的操作。

有人知道我如何告诉调度程序不要等待另一帧从先前发送的数据中完成其缓冲区中的剩余项。

首先,谢谢您的建议。实际上,我正在研究研究生论文的链路层协议(protocol)及其使用SDR的实现。因为我不是DSP专家,所以我需要wifi phy层(收发器)。因此,我决定使用由Bastian Bloessl开发的OOT模块“802.11 a / g / p收发器”项目,该项目可在https://github.com/bastibl/gr-ieee802-11.git上获得。他提供了一个示例流程图(wifi_loopback.crc)来模拟收发器。顺便说一下,除了收发器(DSP东西)本身,他还为802.11开发了数据链路层问题的某些部分,例如成帧和错误控制。在示例流程图中,“Message Strobe”块用作一种应用程序层,用于定期生成数据并将其发送到名为“OFDM MAC”的块,该块具有4个消息端口(app_in,app_out,phy_in和phy_out) )。在此块中,通过添加标题和FCS信息来封装来自“消息选通”的原始数据。然后,将封装的数据发送(phy_out)到称为“Wifi PHY Hier”的分层块,以处理一些DSP问题,例如加扰,编码,交织,符号映射和调制等。以某种方式,将数据转换为信号并由相同的块(“Wifi PHY Hier”)接收,并执行相反的处理,例如解扰,解码等。并将解码后的帧交给“OFDM MAC”块(phy_in)。如果运行此流程图,则一切正常。我的意思是,“Message Strobe”发送的数据已正确接收。

但是,由于我正在尝试实现一种链路层协议(protocol),因此需要从目标到源的一些反馈,例如ACK消息。因此,我决定从实现一个简单的停止等待协议(protocol)开始,即源发送一条消息并等待来自目标的ACK,即DATA-> ACK-> DATA-> ACK ...等等。为了做到这一点,我创建了一个简单的源块,该源块仅发送一个数据,然后等待ACK消息发送另一个数据。我在源代码块中生成的数据与“Message Strobe”生成的数据相同。当我用源块替换“Message Strobe”块时,我意识到出了点问题,因为我无法接收数据。因此,我遵循了自己的数据以查找导致这种情况的步骤。传输过程没有问题。在接收过程中,我发现有问题的块位于“Wifi PHY Hier”块中,并且是该分层块将其数据提供给“OFDM MAC”块之前的最后一块。这个有问题的块称为“OFDM解码MAC”,具有两个端口。输出端口是消息端口,输入端口是复数 vector 。因此,我回顾了此块的代码,特别是它的general_work()函数。对于我的特定测试数据,为了正确完成其工作,它应该消耗177项才能生成“OFDM MAC”的输出。但是,在消耗了172个物料之后,它将停止消耗物料。我重写了Forecast()方法并设置了ninput_items_required [0] =177。但是在这种情况下,什么都没有发生,因为据我了解,调度程序从未在输入缓冲区中看到177个项目。如您所说,这是因为写入此块的输入缓冲区的块(“OFDM解码信号”)会产生172项。

我还没有深入,但是有趣的一点是,当我在一段时间后(在运行时)发送第二个数据时,不等待ACK,我发送的第一个数据的其余5项以某种方式被消耗了并由“OFDM MAC”块正确接收。现在第二数据处于与先前数据相同的问题状态。如果我发送第三数据,第二数据也将正确接收。我真的很困惑怎么会这样 ?

最佳答案

我会迅速评论您的文字,然后在下面提出建议:

I have trouble with using general_work function for a block which takes a vector as an input and outputs a message.



从样本流的 Angular 来看,该块是一个接收器。您会发现,将sink用作gr_modtool中的块类型时,您将获得sync_block,这意味着您仅需实现work,而无需实现general_workforecast

The block is a kind of demodulator. In fact it is working great if I send some data after and after (periodically).



太好了!

But I need to create only one data (frame) which has a predefined size and sent it to this block. And I want this block to handle all of the items in its buffer without waiting for more data.



听起来您的区块实际上并没有采集样本流,而是区块。那是一项工作
  • 消息传递(因此您的块将没有输入流,只有消息端口)或
  • 标记的流块。

  • 听起来对我来说是第二个。

    As I understand, it is about the buffering and scheduler structure of GNU Radio, but, I couldn't figure it out how to provide an ability to this block to handle all the symbols of the frame that I've sent without waiting for another frame.



    框架就是您要做的–对于GNU Radio,您的样本只是要写入缓冲区或从缓冲区读取的项目。

    For example, lets say my frame has 150 symbols. The scheduler calls my general_work function two, three, or four times (I don't know how it decides the number of calls for my general_work).



    它并不确定-可能是将符号写入块的输入缓冲区的块。如果您的块无法在给定输入的情况下产生输出,则不必消耗所有这些(或任何这些)。只需让GNU Radio知道消耗了多少项目(在同步块(synchronized block)的情况下,它就隐式地用返回值完成了;在general_work的情况下,您可能必须手动调用consume –更改块类型的另一个原因!)。

    However, it stops lets say at symbol #141, or 143. Every time I run it, it stops at different symbol number. If I send another frame, it completes to handle remaining items (symbols) in its buffer.



    这听起来像是算法中的错误,而不是GNU Radio中的错误。也许您的输入缓冲区只是已满,或者写入其中的块根本无法提供更多数据?

    Does anybody know how can I tell the scheduler to not wait for another frame to complete the remaining items in its buffer from the previously sent data.



    调度程序不等待;一旦有要处理的数据,它将立即“唤醒”您的块,并要求其处理项目。

    关于c++ - GNU Radio general_work()函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33305656/

    相关文章:

    c++ - 如何根据 is_nothrow_move_constructible<T> 声明包装类型 X<T> noexcept 的移动构造函数?

    c++ - 如何解析 Arduino 串行监视器中的字符串?

    gnuradio - 如何增加 gnuradio-companion 3.7 中工作台的大小?

    c++ - 在 GNU Radio QT Time Sink 中显示过去的数据

    c++ - C++ 放置删除在内部如何工作(C++ 运行时)?如何克服它的局限性?

    c++ - 如何使用 GMock 模拟 OpenCV 相机,或者如何使用 GTest 测试使用相机的方法?

    c++ - 使用 C++ 库时如何避免包含相同的代码?

    cmake - fatal error : libusb/libusb. h:没有这样的文件或目录 librtlsdr 安装 GNU radio

    python - tuntap 的替代品

    python - 由于 GNU Radio block 的快速输入流而导致绘图卡住