Я смотрю на исходный код для 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
?
По умолчанию верхняя граница для максимального количества выходных элементов для потокового графа является большим числом, которое варьируется в зависимости от версии 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, который наследуется от блока.