首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU无线电general_work()函数

GNU无线电general_work()函数
EN

Stack Overflow用户
提问于 2015-10-23 15:06:33
回答 2查看 2.1K关注 0票数 2

对于一个以向量作为输入并输出消息的块,我很难使用general_work函数。

该模块是一种解调器。事实上,如果我在(定期)之后和之后发送一些数据,这是很好的工作。

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

据我所知,这是关于GNU无线电的缓冲和调度器结构,但是,我想不出如何为这个块提供一种能力来处理我发送的帧的所有符号,而无需等待另一个帧。

例如,假设我的帧有150个符号。调度程序调用我的general_work函数2次、3次或4次(我不知道它如何决定对general_work的调用次数)。

然而,它停止让我们说在符号#141,或143。每次我运行它,它都会停在不同的符号号上。如果我发送另一个帧,它将完成处理缓冲区中剩余的项(符号)。

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

首先,谢谢你的建议。事实上,我正在研究一种链路层协议及其在研究生论文中使用SDR实现的方法。因为我不是DSP专家,我需要一个无线传输层(收发信机)。因此,我决定使用一个OOT模块,"802.11 a/g/p收发信机“项目,由Bloessl开发,可在https://github.com/bastibl/gr-ieee802-11.git上使用。他提供了一个示例流程图(wifi_loopback.crc)来模拟收发器.顺便说一下,除了收发信机(DSP )本身,他还为802.11开发了一些数据链路层问题,如帧和差错控制。在示例流程图中,"Message“块被用作周期性生成数据的应用层,并将其发送到一个称为"OFDM”的块,该块有4个消息端口(app_in、app_out、phy_in和phy_out)。在这个块中,通过添加报头和FCS信息来封装来自"Message“的原始数据。然后,将封装的数据(phy_out)发送到一个称为"Wifi“的分层块中,以解决一些数字信号处理问题,如置乱、编码、交织、符号映射和调制等,在某种程度上将数据转换为信号并由同一块("Wifi”)接收,并进行解扰、解码等相反的处理,并将解码帧提供给"OFDM MAC“块(phy_in)。如果你运行这个流程图,一切都是正常的。我的意思是,"Message“发送的数据是正确的。

但是,由于我试图实现一种链路层协议,我需要从目的地到源的一些反馈,比如ACK消息。因此,我决定从实现一个简单的停止&等待协议开始,该协议由源发送消息并等待来自目的地的ACK,数据-> .诸若此类。为此,我创建了一个简单的源块,它只发送一个数据并等待ACK消息发送另一个数据。我用源块生成的数据与"Message“生成的数据相同。当我将"Message“块替换为我的源块时,我意识到有些地方出了问题,因为我无法接收数据。因此,我跟踪了我的数据,以便找出造成这种情况的原因是哪个步骤。传输过程没有问题。在接收过程中,我发现了问题块,它位于"Wifi PHY Hier“块中,是该分层块将其数据提供给"OFDM MAC”块之前的最后一个块。这个有问题的块称为"OFDM解码MAC“,有两个端口。输出端口是消息端口,输入端口是复杂向量。因此,我回顾了这个块的代码,特别是它的general_work()函数。对于我特定的测试数据,为了正确地完成它的工作,它应该消耗177项来产生输出到"OFDM MAC“。然而,它停止消费项目后,172项被消费。我重写了预测()方法,并设置ninput_items_required =177个。但是在这种情况下,什么都没有发生,因为,据我所知,调度程序从未在输入缓冲区中看到177个项。正如您所说,这是因为写入该块的输入缓冲区的块("OFDM解码信号“)生成172项。

我还没有进一步深入,但有趣的是,当我在运行时发送第二个数据时,无需等待ACK,我发送的第一个数据的其余5项将以某种方式被"OFDM MAC“块正确地接收。现在,第二个数据处于与先前数据相同的有问题的情况下。如果我发送第三个数据,第二个数据也会被正确接收。我真的很困惑。这怎么可能呢?

EN

回答 2

Stack Overflow用户

发布于 2015-10-23 16:05:20

我会迅速评论你的文字,然后建议如下:

对于一个以向量作为输入并输出消息的块,我很难使用general_work函数。

从样本流的角度来看,该块是一个接收器。您会发现,当将sink作为gr_modtool中的块类型使用时,您将得到一个sync_block,这意味着您只需要实现work,而不是general_workforecast

该模块是一种解调器。事实上,如果我在(定期)之后和之后发送一些数据,这是很好的工作。

那就太好了!

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

这听起来好像你的区块没有实际的样本流,而是块。这要么是一份工作

  • 消息传递(因此您的块将没有输入流,只有消息端口)或
  • 有标记的溪流块。

对我来说是第二个。

据我所知,这是关于GNU无线电的缓冲和调度器结构,但是,我想不出如何为这个块提供一种能力来处理我发送的帧的所有符号,而无需等待另一个帧。

框架就是你对此的理解--对于GNU电台来说,你的示例只是从缓冲区中写入和读取的项目。

例如,假设我的帧有150个符号。调度程序调用我的general_work函数2次、3次或4次(我不知道它如何决定对general_work的调用次数)。

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

然而,它停止让我们说在符号#141,或143。每次我运行它,它都会停在不同的符号号上。如果我发送另一个帧,它将完成处理缓冲区中剩余的项(符号)。

这听起来像是算法中的错误,而不是GNU无线电中的错误。也许您的输入缓冲区已经满了,或者写入它的块没有提供更多的数据?

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

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

票数 2
EN

Stack Overflow用户

发布于 2015-10-24 15:38:01

我已经联系到巴斯蒂安,开发这个OOT模块的人。他说,问题的原因是一种填充问题。如果在"Wifi“之后使用一个名为"Packet Padding2”的块,并将该块的Pad尾参数设置为适当的值,则问题得到了解决。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33305656

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档