Компонент не может выделить устройство, которое не является исполняемым устройством

Я использую Редхок 1.9. Я создаю Redhawk Device, Component, Node и Waveform с настройками по умолчанию. Я использую реализацию 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 появляется код, показывающий, что выделение не выполняется, поскольку устройство не является производным от исполняемого устройства. Раздел кода имеет «тип» для исполняемого файла (настройка по умолчанию). Если это не правильно, то что должно быть?

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

person JONATHAN LUELLEN    schedule 09.12.2013    source источник


Ответы (2)


Несмотря на то, что ваше устройство способно удовлетворить распределение использования устройства, без GPP или другого исполняемого устройства нет места для запуска вашего компонента. Существует два способа выполнения выделения при запуске компонентов:

  • Удовлетворение отношений использования и устройства
  • Выбор устройства для развертывания исполняемого файла

Каждая реализация в SPD компонента имеет список зависимостей, которые должны быть выполнены для запуска точки входа. Как правило, для компонента C++ это будет включать тип ОС и процессора. Дополнительные требования могут быть определены на основе требований обработки компонента, таких как память или средняя загрузка; это должны быть свойства распределения, известные целевому устройству, как и в случае с usesdevice. Существует также неявное требование, чтобы устройство, выбранное для развертывания, поддерживало интерфейс ExecutableDevice (в нем немного больше нюансов, но это наиболее распространенный случай).

При запуске формы сигнала ApplicationFactory пытается выделить все необходимые устройства и последовательно выбрать реализацию для каждого компонента. Каждая возможная реализация проверяется на всех устройствах в домене, чтобы увидеть, есть ли устройство, которое соответствует его зависимостям. Если это так, точка входа для этой реализации будет загружена на устройство и выполнена, а ApplicationFactory перейдет к следующему компоненту. Если подходящее устройство не может быть найдено, он выдает ошибку CreateApplicationError, как вы видите.

В большинстве случаев вы можете использовать устройство GPP, входящее в состав REDHAWK, для поддержки выполнения ваших компонентов. Обычно вы пишете свой собственный ExecutableDevice только в том случае, если у вас есть определенный тип оборудования, которое не работает с GPP, например FPGA. Если вы установили из RPM, в вашем каталоге $SDROOT/dev/nodes должен быть узел, адаптированный к вашей локальной системе (например, тип процессора, версии Java и Python). В противном случае вы можете создать его самостоятельно с помощью сценария 'nodeconfig.py', включенного в проект GPP; см. пример в руководстве по установке Ubuntu (по общему признанию, он несколько спрятан в Руководстве REDHAWK, Приложение E, Раздел 5).

person Justin Irwin    schedule 11.12.2013
comment
Это хорошо написано, и это прояснило мое заблуждение. Итак, если у меня есть компонент, который работает с тюнером, то ему понадобятся два устройства: 1.) GPP 2.) Тюнер - person JONATHAN LUELLEN; 11.12.2013

Я считаю, что проблема в том, что у вас нет GPP в узле с вашим фиктивным устройством. Поскольку ваше исходное Устройство не было исполняемым, оно не могло выполнить код Компонента, что и сделал бы для вас GPP.

Чтобы добавить GPP в IDE, просто откройте файл DeviceManager.dcd.xml вашего узла, перейдите на вкладку «Устройства» и нажмите кнопку «Добавить». Если все установлено правильно, вы сможете выбрать GPP, а затем нажать «Готово». Наконец, сохраните узел и перетащите его в Target SDR и попробуйте снова запустить его с помощью nodeBooter.

Кроме того, тип «Исполняемый» в файле *.spd.xml не относится к устройствам. Если вы посмотрите на раздел реализации для компонента, вы заметите, что в разделе «Код» также есть раскрывающийся список «Тип». Причина этого в том, что он описывает не тип устройства/компонента, а то, как следует интерпретировать вывод процесса сборки.

person pwolfram    schedule 10.12.2013