【问题标题】:Component unable to allocate device that is not Executable Device组件无法分配不是可执行设备的设备
【发布时间】:2013-12-09 17:15:02
【问题描述】:

我使用的是 Redhawk 1.9。我使用默认设置创建了一个 Redhawk 设备、组件、节点和波形。我对以上所有内容都使用 C++ 实现。问题是无法分配设备,因为它不是可执行设备。在代码部分的实现选项卡中,“类型”变量设置为“可执行”(默认值)。如果这是不正确的,那应该是什么?

注意:当我从可执行设备派生设备时,问题就消失了。

我能够重现虚拟设备和组件的问题,如下所示: 我更新了组件,以便它可以使用该设备。

<usesdevice id="dummy_device_2" type="usesdevice">
  <propertyref refid="DCE:cdc5ee18-7ceb-4ae6-bf4c-31f983179b4d" value="dummy_device_kind_1"/>
</usesdevice>

我更新设备属性:

<simple id="DCE:cdc5ee18-7ceb-4ae6-bf4c-31f983179b4d" mode="readonly" name="device_kind" type="string">
  <description>This specifies the device kind</description>
  <value>dummy_device_kind_1</value>
  <kind kindtype="configure"/>
  <kind kindtype="allocation"/>
  <action type="eq"/>
</simple>

我将此处创建的虚拟设备添加到此处创建的虚拟节点中。 我将虚拟组件添加到虚拟波形中。 我启动了仅包含虚拟设备的虚拟节点 我启动了仅包含上述虚拟设备的虚拟波形。 我收到以下错误消息:

  • 无法创建应用程序: DeviceOnlyTestWaveform_343_114533234 发生以下 CORBA 异常:创建 应用程序 IDL:CF/ApplicationFactory/CreateApplicationError:1.0*

域管理器(使用跟踪日志记录运行)显示以下内容:

 DEBUG:ApplicationFactory_impl - Trying to find the device
 TRACE:ApplicationFactory_impl - Searching for a place to deploy component amongst 1 devices
 TRACE:ApplicationFactory_impl - Checking Device DummyNode:DeviceOnlyTesTDevice_1
 TRACE:ApplicationFactory_impl - Device DummyNode:DeviceOnlyTesTDevice_1 is loadable
 TRACE:ApplicationFactory_impl - Device DummyNode:DeviceOnlyTesTDevice_1 is not loadable
 TRACE:ApplicationFactory_impl - Done checking all the devices
 DEBUG:ApplicationFactory_impl - Device Allocation Failed.. need to clean up

在 ApplicationFactory_impl 中,代码似乎显示分配失败,因为设备不是从 Executable Device 派生的。代码部分的“类型”为 Executable(默认设置)。如果这不正确,那应该是什么?

    // Check that the device meet's the needs of this component
    //  - Validate the type of device meets the requirements in the 'code' section of the implementation
    //
    LOG_TRACE(ApplicationFactory_impl, "Checking Device " << deviceNodeIter->identifier);
    if (deviceNodeIter->device->usageState() == CF::Device::BUSY)
    {
        LOG_TRACE(ApplicationFactory_impl, "Ignoring Device " <<deviceNodeIter->label << " is BUSY");
        continue;
    }

    if ((implementation->getCodeType() == CF::LoadableDevice::EXECUTABLE) ||
            (implementation->getCodeType() == CF::LoadableDevice::SHARED_LIBRARY)) {
        // Does this device provide LoadableDevice?
        LOG_TRACE(ApplicationFactory_impl, "Device " << deviceNodeIter->identifier << " is loadable");
        CF::LoadableDevice_var loaddev;
        loaddev = ossie::corba::_narrowSafe<CF::LoadableDevice> (deviceNodeIter->device);
        if(CORBA::is_nil(loaddev)) {
            LOG_TRACE(ApplicationFactory_impl, "Device " << deviceNodeIter->identifier << " is not loadable");
            continue;
        }

        if (implementation->getEntryPoint().size() != 0) {
            // Does this device provide ExecutableDevice?
            LOG_TRACE(ApplicationFactory_impl, "Device " << deviceNodeIter->identifier << " is executable");

            CF::ExecutableDevice_var execdev;
            execdev = ossie::corba::_narrowSafe<CF::ExecutableDevice> (deviceNodeIter->device);
            if(CORBA::is_nil(execdev)) {
                LOG_INFO(ApplicationFactory_impl, "Device " << deviceNodeIter->identifier << " is not executable");
                continue;
            }
        }
    }

【问题讨论】:

    标签: redhawksdr


    【解决方案1】:

    尽管您的设备能够满足 usesdevice 分配,但如果没有 GPP 或其他 ExecutableDevice,则没有地方可以运行您的组件。启动组件时有两种分配方式:

    • 满足使用设备关系
    • 决定在哪个设备上部署可执行文件

    组件的 SPD 中的每个实现都有一个依赖项列表,必须满足这些依赖项才能运行入口点。通常,对于 C++ 组件,这将包括操作系统和处理器类型。可以根据组件的处理要求定义附加要求,例如内存或平均负载;这些必须是目标设备已知的分配属性,就像使用设备一样。还有一个隐含的要求,即选择用于部署的设备应该支持 ExecutableDevice 接口(它的细微差别稍大一些,但这是迄今为止最常见的情况)。

    当启动一个波形时,ApplicationFactory 会尝试分配所有需要的设备并按顺序为每个组件选择一个实现。针对域中的所有设备检查每个可能的实现,以查看是否有满足其依赖关系的设备。如果是这样,该实现的入口点将被加载到设备上并执行,而 ApplicationFactory 将继续执行下一个组件。如您所见,如果找不到合适的设备,则会引发 CreateApplicationError。

    在大多数情况下,您可以使用 REDHAWK 随附的 GPP 设备来支持您的组件的执行。如果您有特定类型的硬件不能与 GPP 一起使用,例如 FPGA,您通常只会编写自己的 ExecutableDevice。如果您是从 RPM 安装的,那么在 $SDRROOT/dev/nodes 目录中应该有一个适合您本地系统的节点(例如,处理器类型、Java 和 Python 版本)。否则,您可以使用 GPP 项目中包含的“nodeconfig.py”脚本自己创建它;有关示例,请参阅 Ubuntu 安装指南(诚然,在 REDHAWK 手册的附录 E,第 5 节中有些隐藏)。

    【讨论】:

    • 这篇文章写得很好,它消除了我的误解。因此,如果我有一个与调谐器配合使用的组件,那么它将需要两个设备:1.) GPP 2.) 调谐器
    【解决方案2】:

    我认为问题在于您的虚拟设备节点中没有 GPP。因为您的原始设备不是可执行的,所以它无法执行组件的代码,而这正是 GPP 将为您做的。

    要在 IDE 中添加 GPP,只需打开节点的 DeviceManager.dcd.xml 文件,导航到“设备”选项卡,然后单击“添加”按钮。如果一切安装正确,您应该能够选择 GPP,然后单击完成。最后,保存节点并将其拖到 Target SDR 并尝试再次使用 nodeBooter 启动它。

    此外,*.spd.xml 文件中的“可执行文件”类型并非特定于设备。如果您查看组件的实现部分,您会注意到代码部分下也有一个类型下拉菜单。这是因为它不是描述设备/组件的类型,而是应该如何解释构建过程的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-22
      相关资源
      最近更新 更多