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

Я смотрю на исходный код для GrOsmoSdr rtl_tcp_source_f.cc, который является источником радио 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, который наследуется от блока.

3

Другие решения


По вопросам рекламы [email protected]