2016-05-03 1 views
0

J'ai créé un bloc source personnalisé qui lit les valeurs de commutation sur un zedboard. Il y accède via un pilote proc que j'ai écrit. Le fichier /var/log/kern.log signale une sortie correcte. Le débogage printf dans le bloc source signale une sortie correcte. Toutefois, en poussant les données vers un lien de fichier ainsi que vers un récepteur de numéro d'interface utilisateur graphique, seuls les zéros sont lus.source gnuradio ne produisant que des zéros

N'ai-je pas configuré le bloc correctement?

#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 */ 

Répondre

0

Un pointeur est un pointeur vers les données, généralement:

unsigned int *out = (unsigned int *) output_items[0]; 

out fait référence à la mémoire tampon pour votre sortie.

Mais vous écrasez ce pointeur avec un autre pointeur:

out=(unsigned int *)strtoul(buffer,NULL,0); 

qui plie juste votre copie de ce pointeur, et ne touche pas le contenu de ce tampon à tous. Basic C!

Vous avez probablement voulu dire quelque chose comme:

out[0]= strtoul(buffer,NULL,0); 

qui mettra votre valeur dans le premier élément du tampon.

Cependant, vous dites GNU Radio que vous non seulement produit un seul élément (la ligne ci-dessus), mais noutput_items:

return noutput_items; 

Ce doit lire

return 1; 

lorsque vous êtes ne produisant qu'un seul article, ou vous devez réellement produire autant d'articles que vous return.

Votre consume_each appel est absurde - Sources GNU Radio sont généralement des cas de gr::sync_block, ce qui signifie que vous écririez un work() au lieu d'une méthode general_work() que vous avez fait. (! Avec le type de bloc mis à source)

Du seul fait que c'est un general_work et non un work je dirais que vous ne l'avez pas utilisé gr_modtool pour générer le talon pour ce bloc - vous devriez vraiment. Encore une fois, je voudrais vous signaler le Guided Tutorials qui devrait vraiment expliquer rapidement l'utilisation de gr_modtool ainsi que les concepts sous-jacents de la radio GNU.

+0

Merci beaucoup, je vais passer par là. J'ai fait un bloc général de gr_modtool au lieu de spécifier la source ... J'ai suivi le guide sur la création du bloc ff_square mais cela ne m'a pas vraiment préparé à en créer trop. J'ai lutté avec cette source et un autre puits pendant un moment. Merci pour la contribution! – gutelfuldead

+0

ouais, l'exemple 'square_ff' pourrait être une des choses que je n'aime pas vraiment sur le wiki de GNU Radio. Vraiment, les tutoriels guidés sont mieux adaptés pour vous donner une bonne introduction! :) –