【问题标题】:redhawk module service function usage example crashesredhawk 模块服务功能使用示例崩溃
【发布时间】:2016-01-14 22:22:08
【问题描述】:

所以我正在构建一个 redhawk 模块,并试图通过它传递数据作为测试。在将他们关于如何使用输入和输出端口的示例放入 serviceFunction() 之后,我能够毫无错误地构建模块(我更改了变量名称以匹配我的端口)。当我将模块放在白板上并将其链接起来时,它很好,但是一旦我启动模块,它就会崩溃。我添加了一行将传入的流 id 写入控制台,这将在崩溃前击中控制台 10 到 20 次(它正确地写入了提供信号的信号发生器的 id)。如果我绘制输出端口,则在崩溃之前没有绘制任何内容(当我说崩溃时,我的意思是模块刚刚从白板上消失,ide 仍然启动并运行)。

服务功能是:

int freqModFrTest_i::serviceFunction()
{

    bulkio::InFloatPort::dataTransfer *tmp = dataFloatIn->getPacket(bulkio::Const::BLOCKING);
    if (not tmp) { // No data is available
        return NOOP;
    }
    else
    {
        std::cout<<tmp->streamID<<std::endl;
        std::vector<float> outputData;
        outputData.resize(tmp->dataBuffer.size());
        for (unsigned int i=0; i<tmp->dataBuffer.size(); i++) {
            outputData[i] = (float)tmp->dataBuffer[i];
        }

        // NOTE: You must make at least one valid pushSRI call
        if (tmp->sriChanged) {
            ComplexOut->pushSRI(tmp->SRI);
        }
        ComplexOut->pushPacket(outputData, tmp->T, tmp->EOS, tmp->streamID);

        delete tmp; // IMPORTANT: MUST RELEASE THE RECEIVED DATA BLOCK
        return NORMAL;
    }
}

有没有人遇到过类似的问题或对导致此问题的原因有任何想法?

附加信息:

按照 pwolfram 的建议,我构建了一个 sig 生成器,并将这个组件构建成一个波形。从域启动它时出现错误:

2016-01-14 07:41:50,430 ERROR DCE:aa1a189e-0b5b-4968-9150-5fc3d501dadc{1}:1030 - 
Child process 3772 terminated with signal 11

当试图重新启动组件时(因为它只是停止而不是消失)我收到以下错误:

Error while executing callable. Caused by org.omg.CORBA.TRANSIENT:
Retries exceeded, couldn't reconnect to 10.62.7.21:56857
Retries exceeded, couldn't reconnect to 10.62.7.21:56857

【问题讨论】:

  • 您是否尝试过进行相同的设置,但使用波形而不是黑板?
  • 另外,您使用的是哪个版本的 REDHAWK?
  • 不,我没有尝试过使用波形,但我会看看这是否会有所不同(如果确实如此,虽然它不是一个好的解决方案,因为它会增加模块开发的大量时间),目前我们只是在尝试构建我们需要的所有模块。 REDHAWK 的版本是 1.10 on cent os 6.7

标签: c++ redhawksdr


【解决方案1】:

在 REDHAWK 2.0.0 中,我创建了一个具有相同名称 (freqModFrTest) 和端口名称 (dataFloatIn 和 ComplexOut) 的组件,并逐字使用了您的服务函数。但是,我没有遇到任何问题。

这里有一些可以尝试的方法:

  • 清理并重建组件。沙盒(您称为白板)将运行已构建的二进制文件。您可能已经修改了代码并在磁盘上有旧版本的二进制文件。右键单击项目并选择“清理项目”。然后右键单击并选择“构建项目”,这将确保二进制文件与您的源代码匹配。

  • 在调试模式下运行组件。如果双击 SPD 文件,在“概述”选项卡下有“在沙箱中调试组件”。这将在调试上下文中启动黑板中的组件。您可以设置断点并逐行遍历代码。如果您没有设置断点,IDE 将在发生致命错误时停止执行。如果出现问题(例如无效的内存访问),IDE 会提示您进入调试模式,并且应该指出代码中问题所在的行。

  • 如果这些选项失败,您可以启用核心转储并使用 GDB 查看代码中出现问题的位置。网上有很多 GDB 教程,但要点是在启动 IDE 之前,您需要输入“ulimit -c unlimited”,然后从同一个终端启动 IDE。现在当你的组件死掉时,它会生成一个核心文件。

希望其中之一能让你走上正确的道路。

【讨论】:

  • 感谢您提出的修复建议,我刚刚在另一台计算机上运行了该示例,该计算机在 VM 上运行相同的设置,并且它也没有任何问题。由于存在所有问题,我们决定重新格式化并进行全新安装。
猜你喜欢
  • 1970-01-01
  • 2017-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-13
  • 1970-01-01
  • 1970-01-01
  • 2021-06-17
相关资源
最近更新 更多