GNURADIO C++ OOT同步块开发问题:512字节块处理失效
GNURADIO C++ OOT同步块work函数缺陷分析与修复
核心缺陷点
- 错误判断可用输入量:原代码用
nitems_read(0)作为输入可用量的判断依据,这个函数返回的是从输入端口累计读取的总项目数,而非当前work调用中可访问的可用输入项目数。这直接导致循环条件永远无法满足,循环完全不执行。 - 冗余无效代码:
std::vector<uint8_t> burst(512)定义后未被使用,属于无意义的内存开销。 - 循环逻辑混乱:原循环同时依赖累计读取数和输出可用数,逻辑完全错误,应该基于当前可用输入数和当前可输出数计算可处理的块数。
修复后的work函数实现
// 注意:将cycle改为test_sync_impl类的成员变量(如d_cycle),避免全局变量线程安全问题 // 类头文件中添加:int d_cycle; // 构造函数中初始化:d_cycle = 0; int test_sync_impl::work(int noutput_items, gr_vector_const_void_star &input_items, gr_vector_void_star &output_items) { auto in = static_cast<const input_type*>(input_items[0]); auto out = static_cast<output_type*>(output_items[0]); int in_index = 0; int out_index = 0; const int block_size = 512; // 获取当前work调用中可用的输入项目数 int available_in = nitems_available(0); std::cout <<"当前可用输入项目数: "<< available_in << "\n"; std::cout <<"已累计读取输入项目数: "<< nitems_read(0) << "\n"; // 计算可处理的完整块数:取输入能提供的块数和输出能容纳的块数的最小值 int num_blocks = std::min(available_in / block_size, noutput_items / block_size); for(int i=0; i<num_blocks; i++){ std::copy(in + in_index, in + in_index + block_size, out + out_index); in_index += block_size; out_index += block_size; d_cycle++; std::cout<<"处理周期: "<< d_cycle << "\n"; } // 告知调度器已消耗的输入项目数 consume(0, in_index); std::cout <<"本次输出项目数: "<< out_index << "\n"; return out_index; }
额外注意事项
- 线程安全:GNURADIO调度器可能在多线程环境下调用work函数,全局变量
cycle会导致计数混乱,必须改为类成员变量。 - 后续扩展到480字节输出:当需要将512输入块转为480输出块时,只需修改输出块大小,调整输出可容纳块数的计算逻辑(
noutput_items / 480)即可。
内容的提问来源于stack exchange,提问作者KIEN CHI NGUYEN
相关产品推荐
相关产品推荐

