Python 如何在gnuradio中测试源代码块

Python 如何在gnuradio中测试源代码块,python,gnuradio,Python,Gnuradio,我试图在gnuradio中创建一个简单的源代码块。我使用gr_modtool创建了裸体模块和块,但每当我尝试运行测试时,它会很快占用我所有的内存,我的计算机开始落后。更糟糕的是,线程[thread per block[1]:]:std::bad_alloc的测试失败 这是我的名为csv的块: import numpy from gnuradio import gr class csv(gr.sync_block): """ docstring for block csv

我试图在gnuradio中创建一个简单的源代码块。我使用gr_modtool创建了裸体模块和块,但每当我尝试运行测试时,它会很快占用我所有的内存,我的计算机开始落后。更糟糕的是,线程[thread per block[1]:]:std::bad_alloc的测试失败

这是我的名为csv的块:

import numpy
from gnuradio import gr

class csv(gr.sync_block):
    """
    docstring for block csv
    """
    def __init__(self, filename):
        gr.sync_block.__init__(self, name="csv",
                               in_sig=None,
                               out_sig=[numpy.float32])


    def work(self, input_items, output_items):
        out = output_items[0]
        out[:] = 0
        return len(output_items[0])
下面是我用来测试的代码:

from gnuradio import gr, gr_unittest
from gnuradio import blocks
from csv import csv

import time

class qa_csv (gr_unittest.TestCase):

    def setUp (self):
        self.tb = gr.top_block ()

    def tearDown (self):
        self.tb = None

    def test_001_t (self):
        expected = [0.0]

        # set up fg
        c = csv(None)
        sink = blocks.vector_sink_f()
        self.tb.connect(c, sink)

        self.tb.run()

        # check data
        results = sink.data()
        self.assertFloatTuplesAlmostEqual(expected, results)

if __name__ == '__main__':
    gr_unittest.run(qa_csv, "qa_csv.xml")
有人能帮我找出哪里出了问题,或者给我指出了正确的方向吗?

有几件事:

默认情况下,流程图将一直运行,直到被告知停止为止。所以这就是为什么你的记忆被吞噬了。GNU电台正在抛出std::bad_alloc,因为你一直在向量_接收器中填充东西,最终它的内存用完了

你需要停止流程图。有几种方法可以做到这一点:

从块的功函数返回功_DONE-1。这适用于当块有有限数量的数据要提供服务,然后发出完成的信号时。以vector_source为例

使用,它将复制N个样本,然后返回为您完成的工作。这对于单元测试很有用

最后一点注意:一旦你开始工作,你的测试仍然会失败,除非你请求head只复制一个样本,因为在你写它的时候,你的源块每次调用时都会用零填充它的整个输出缓冲区:

>>> import numpy as np
>>> out = np.empty(10, dtype=float)
>>> out[:] = 0
>>> out
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
因此,只需确保预期阵列的样本数与您向head请求的样本数相同:

有几件事:

默认情况下,流程图将一直运行,直到被告知停止为止。所以这就是为什么你的记忆被吞噬了。GNU电台正在抛出std::bad_alloc,因为你一直在向量_接收器中填充东西,最终它的内存用完了

你需要停止流程图。有几种方法可以做到这一点:

从块的功函数返回功_DONE-1。这适用于当块有有限数量的数据要提供服务,然后发出完成的信号时。以vector_source为例

使用,它将复制N个样本,然后返回为您完成的工作。这对于单元测试很有用

最后一点注意:一旦你开始工作,你的测试仍然会失败,除非你请求head只复制一个样本,因为在你写它的时候,你的源块每次调用时都会用零填充它的整个输出缓冲区:

>>> import numpy as np
>>> out = np.empty(10, dtype=float)
>>> out[:] = 0
>>> out
array([ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.])
因此,只需确保预期阵列的样本数与您向head请求的样本数相同: