2013-12-09 48 views
1

我正在使用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異常: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; 
      } 
     } 
    } 

回答

2

儘管您的設備能夠滿足使用設備分配,但沒有GPP或其他可執行設備,沒有地方可以運行組件。有跡象表明,啓動組件時進行分配方式有兩種:

  • 通過滿足usesdevice關係
  • 決定在哪個設備上部署可執行

在組件的SPD每種實現都有依賴關係的列表必須滿足才能運行入口點。通常,對於C++組件,這將包括操作系統和處理器類型。可以根據組件的處理要求(如內存或平均負載)定義附加要求;這些必須是目標設備已知的分配屬性,就像使用devicesdevice一樣。還有一個隱含的要求,即選擇部署的設備應該支持ExecutableDevice接口(它稍微有些細微差別,但這是最常見的情況)。

啓動波形時,ApplicationFactory會嘗試分配所有必需的設備,並按順序爲每個組件選擇一個實現。針對域中的所有設備檢查每個可能的實現,以查看是否存在滿足其依賴關係的設備。如果是這樣,該實現的入口點將被加載到設備上並執行,並且ApplicationFactory將轉到下一個組件。如果沒有找到合適的設備,它會拋出一個CreateApplicationError,正如你所看到的。

對於大多數情況,您可以使用REDHAWK附帶的GPP設備來支持組件的執行。如果您有特定類型的硬件不能用於GPP,那麼通常只會編寫自己的ExecutableDevice,例如FPGA。如果您是從RPM安裝的,則應在您的$ SDRROOT/dev/nodes目錄中爲您的本地系統量身定製節點(例如,處理器類型,Java和Python版本)。否則,您可以使用GPP項目附帶的'nodeconfig.py'腳本自己創建它;請參閱Ubuntu安裝指南中的示例(不可否認,這些內容已隱藏在REDHAWK手冊的附錄E第5節中)。

+0

這寫得很好,它清除了我的誤解。因此,如果我有一個與調諧器一起工作的組件,那麼它將需要兩個設備:1.)GPP 2.)調諧器 –

0

我相信問題是您的虛擬設備在節點中沒有GPP。由於您的原始設備不可執行,因此無法執行組件的代碼,這是GPP爲您做的。

要在IDE中添加GPP,只需打開Node的DeviceManager.dcd.xml文件,導航到設備選項卡,然後單擊添加按鈕。如果一切安裝正確,您應該能夠選擇GPP,然後單擊完成。最後,保存Node並將其拖到Target SDR,然後再次嘗試使用nodeBooter啓動它。

另外,* .spd.xml文件中的「可執行文件」類型並非特定於設備。如果您查看組件的實現部分,您會注意到代碼部分下面還有一個類型下拉列表。原因在於它沒有描述設備/組件的類型,而是如何解釋構建過程的輸出。