You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 08:37:22