Как определяется noutput_items в GNU Radio?

Я смотрю на исходный код для rtl_tcp_source_f.cc GrOsmoSdr, который является источником радио GNU, который читает чередующиеся данные I/Q из TCP.

Рабочая функция выглядит так:

int rtl_tcp_source_f::work (int noutput_items,
                            gr_vector_const_void_star &input_items,
                            gr_vector_void_star &output_items)
{
  float *out = (float *) output_items[0];
  ssize_t r = 0;

  int bytesleft = noutput_items;
  int index = 0;
  int receivedbytes = 0;
  while(bytesleft > 0) {
    receivedbytes = recv(d_socket, (char*)&d_temp_buff[index], bytesleft, 0);

    if(receivedbytes == -1 && !is_error(EAGAIN)){
      fprintf(stderr, "socket error\n");
      return -1;
    }
    bytesleft -= receivedbytes;
    index += receivedbytes;
  }
  r = noutput_items;

  for(int i=0; i<r; ++i)
    out[i]=d_LUT[*(d_temp_buff+d_temp_offset+i)];

  return r;
}

Буфер d_temp_buff устанавливается в конструкторе:

d_temp_buff = new unsigned char[d_payload_size]; 

где d_payload_size это параметр конструктора, который передается в конфигурации.

Рабочая функция читает точно noutput_items в d_temp_buff, Как noutput_items выбран Gnuradio в целом, и как эта функция работы может быть уверена, что noutput_items <= d_payload_size?

1 ответ

Решение

По умолчанию верхняя граница для максимального количества элементов вывода для потокового графа является большим числом, которое варьируется в зависимости от версии gnuradio, в настоящее время значение, установленное в главном репозитории, составляет 100000000.

Это устанавливается путем вызова start верхнего блока потокового графа без указания аргументов, и используется аргумент по умолчанию. Переопределение этого глобального значения может быть сделано путем передачи другого аргумента начальному вызову top_block или вызова set_max_noutput_items в верхнем блоке или в конкретном блоке путем вызова set_max_noutput_items.

После инициализации с таким высоким значением оно затем устанавливается планировщиком на более низкое значение на основе минимального доступного выходного пространства, которое использует значение noutput_items, установленное в конструкторе block_detail, наряду с output_multiple и min_noutput_items блока. Смотрите single_threaded_scheduler.cc и block_executor.cc

Подклассификация рабочей функции, которая происходит в вашем модуле, похоже, не имеет каких-либо ограничений на max_noutput_items на основе размера полезной нагрузки, который по умолчанию установлен в 16384, или длины MTU / пакета, передаваемой в качестве аргумента.

Код должен быть модифицирован для добавления такой проверки, или set_max_noutput_items должен быть установлен для данного блока на основе длины пакета, либо перед использованием, либо в конструкторе, который в настоящее время по умолчанию принимает унаследованное значение 0 и флаг значение установлено как ложное для блока rtl_tcp_source_f, который наследуется от sync_block, который наследуется от блока.

Другие вопросы по тегам