Hi Mike, you might actually be doing something redundant here: GNU Radio actually keeps tabs on how many items you produced; just call nitems_written(0) to get that number.
I don't really understand where your string comes from or where it ends up, but do make sure your string isn't going to be longer than your noutput_items. Generally, this is something that can most probably best be analyzed using appropriate debugging methods -- I'd like to point you to [1]. As soon as you find out where your segfault happens, it will be easier to understand under which conditions it happens. Also, GDB allows you to `print` the value of local variables, so that might actually shine quite a light on what goes wrong :) On a more general note: what your block seems to do looks very much like what tagged stream blocks (probably after gr-ax25) were designed to do. Have a look at [2]; maybe I'm misjudging the situation, maybe you're already using the TSB facilities. Greetings, Marcus [1] http://gnuradio.org/redmine/projects/gnuradio/wiki/TutorialsGDB [2] http://gnuradio.org/doc/doxygen/page_tagged_stream_blocks.html On 04/18/2015 03:36 PM, Mike Willis wrote: > I should have added, the packet decoding is based on Volkers rather nifty > gr-ax25, which I think is based on earlier implementations so I don't think > that is where the bug is. I have heavily modified that code as I am using > BPSK demodulator but the hdlc parts are the same. > > Mike > > -----Original Message----- > From: Mike Willis [mailto:[email protected]] > Sent: 18 April 2015 13:58 > To: GNURadio Discussion List > Subject: Input items vs Output items > > I am slightly confused with the way you implement a general work function - > here is my AX25 decoder which takes in bits and outputs decoded packets in > text format as a stream of 8 bit integers. This was based on the general work > example in the GR tutorial. > > int ax25_impl::general_work (int noutput_items, > gr_vector_int &ninput_items, > gr_vector_const_void_star &input_items, > gr_vector_void_star &output_items) { int i; const char *bit > = (const char *) input_items[0]; out = (char *) output_items[0]; > > d_numchars=0; > for (i=0;i <noutput_items; i++) > { > hdlc_rxbit( bit[i] ); > } > > // Tell runtime system how many output items we produced. > consume_each (noutput_items); > return d_numchars; > } > > I keep a tally of how many characters I output in the class member variable > d_numchars. I do this by initially printing to the "out" > buffer (see above code) with the vsprintf() function and then using the > strlen() function to find out how long the out string is. > > It works for a while, perhaps 200-300 packets and then crashes with a > segfault and error 7. I know the crash is related to the number of output > items because if I reduce the number of characters I output it will run for > longer. If I don't output anything its fine, but not very useful. > > It gets complicated because the block outputs nothing at all until it decodes > a packet, then it outputs that entire packet, which might be up to 1000 > characters or so. > > I think I have made a fundamental error somewhere. Finding it is proving > problematic. I am also confused by ninput_items and noutput_items variables > as to me they appear reversed but that is how they are in the tutorial. > > > Mike > > > _______________________________________________ > Discuss-gnuradio mailing list > [email protected] > https://lists.gnu.org/mailman/listinfo/discuss-gnuradio _______________________________________________ Discuss-gnuradio mailing list [email protected] https://lists.gnu.org/mailman/listinfo/discuss-gnuradio
