1

我正在使用红鹰 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 异常:创建应用程序时 InvalidCapacity 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(默认设置)。如果这不正确,那应该是什么?

    // 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;
            }
        }
    }
4

2 回答 2

2

尽管您的设备能够满足 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 节中有些隐藏)。

于 2013-12-11T13:41:37.320 回答
0

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

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

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

于 2013-12-10T22:19:31.973 回答