我制作了一个自定义源块,用于读取zedboard上的开关值。它是通过我写的proc驱动程序访问它们的。 /var/log/kern.log报告正确的输出。源块中的调试printf报告正确的输出。
然而,将数据推送到filesink以及GUI数字接收器只是读取零。我没有正确设置块吗?
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gnuradio/io_signature.h>
#include "switches_impl.h"
#include <stdio.h>
#include <stdlib.h>
#include <uinstd.h>
namespace gr {
namespace zedboard {
switches::sptr
switches::make()
{
return gnuradio::get_initial_sptr
(new switches_impl());
}
/*
* The private constructor
*/
switches_impl::switches_impl()
: gr::block("switches",
gr::io_signature::make(0,0,0),
gr::io_signature::make(1, 1, sizeof(unsigned int *)))
{}
/*
* Our virtual destructor.
*/
switches_impl::~switches_impl()
{
}
void
switches_impl::forecast (int noutput_items, gr_vector_int &ninput_items_required)
{
/* <+forecast+> e.g. ninput_items_required[0] = noutput_items */
}
int
switches_impl::general_work (int noutput_items,
gr_vector_int &ninput_items,
gr_vector_const_void_star &input_items,
gr_vector_void_star &output_items)
{
//const <+ITYPE+> *in = (const <+ITYPE+> *) input_items[0];
unsigned int *out = (unsigned int *) output_items[0];
// Do <+signal processing+>
// Tell runtime system how many input items we consumed on
// each input stream.
char buffer[5];
size_t size = 1;
size_t nitems = 5;
FILE* fp;
fp = fopen("/proc/zedSwitches","r");
if (fp == NULL)
{
printf("Cannot open for read\n");
return -1;
}
/*
Expect return format:
0x00
*/
fread(buffer, size, nitems, fp);
fclose(fp);
out=(unsigned int *)strtoul(buffer,NULL,0);
printf("read: 0x%02x",out);
consume_each (noutput_items);
// Tell runtime system how many output items we produced.
return noutput_items;
}
} /* namespace zedboard */
} /* namespace gr */
答案 0 :(得分:0)
指针是指向数据的指针,通常是:
unsigned int *out = (unsigned int *) output_items[0];
out
指的是输出的缓冲区。
但是你用另一个指针覆盖那个指针:
out=(unsigned int *)strtoul(buffer,NULL,0);
它只是围绕你指针的副本弯曲,并且根本不会影响该缓冲区的内容。基本C!
你可能会说:
out[0]= strtoul(buffer,NULL,0);
这会将您的值放入缓冲区的第一个元素中。
但是,您告诉GNU Radio您不仅生成了一个项目(上面一行),而且noutput_items
:
return noutput_items;
必须阅读
return 1;
当您只生产单个商品时,或者您实际上必须生成与return
一样多的商品。
您的consume_each
电话无意义 - GNU广播资源通常是gr::sync_block
的实例,这意味着您要编写work()
而不是general_work()
方法就像你一样。
仅从事实来看,这是general_work
而不是work
我说你还没有使用gr_modtool
(块类型设置为{{} 1}}!)为这个块生成存根 - 你真的应该。同样,我想指出Guided Tutorials,它应该真正快速地解释source
的使用以及基础GNU Radio概念。