Я новичок в RTOS в целом и в VxWorks от WindRiver, в частности.

Я вырос в Java и делаю первые шаги во встраиваемых корпоративных ОСРВ. В настоящее время я работаю над VxWorks 653 2.5.0.2.

Моя первая задача - настроить файл Module.xml (см. Прикрепленное изображение) с соответствующими таблицами мониторинга работоспособности (система, раздел и модуль - см. Раздел 5 в этот документ). После настройки я заметил, что на самом деле не знаю, как протестировать его.

Конечно, я, вероятно, смогу "смоделировать" HME_NUMERIC_ERROR, ныряя на ноль, но я пытаюсь найти лучший способ смоделировать эти тесты.

Наилучшим подходом, на мой взгляд, будет наличие некоторой команды оболочки в оболочке VxWorks, которая вводит события монитора работоспособности по запросу. Что-то вроде этих команд.

Любые мысли о командах оболочки или передовых методах подхода к этому были бы замечательными.

Надеюсь, вы, ребята, можете помочь мне, спасибо!

Пример файла Module.xml (взят из здесь ):

module.xml

Пример таблицы монитора работоспособности (получено из здесь < / a> - что это за язык ?!):

<PartitionHMTable Name="partition1Hm">
 <SystemState>
  <ErrorIDAction Error Identifier="HME_UNKNOWN" ErrorAction="hmDefaultHandler"/>
  <ErrorIDAction Error Identifier="HME_NUMERIC_ERROR" ErrorAction=""/>
  <ErrorIDAction Error Identifier="HME_POWER_FAIL" ErrorAction="hmDH_HME_POWER_FAIL"/>
  <ErrorIDAction Error Identifier="HME_KERNEL" ErrorAction="hmDH_HME_KERNEL"/>
  <ErrorIDAction Error Identifier="HME_CONFIG_ERROR" ErrorAction="hmDH_EventLog"/>
  <ErrorIDAction Error Identifier="HME_INIT_ERROR" ErrorAction="hmDH_HME_INIT_ERROR"/>
  <ErrorIDAction Error Identifier="HME_PARTITION_OVERFLOW" ErrorAction="hmDefaultHandler"/>
  <ErrorIDAction Error Identifier="HME_PARTITION_MODE_SET" ErrorAction="hmDH_HME_PARTITION_MODE_SET"/>
  <ErrorIDAction Error Identifier="HME_APEX_INTERNAL_ERROR" ErrorAction="hmDefaultHandler"/>
  <ErrorIDAction Error Identifier="HME_HM_INTERNAL_ERROR" ErrorAction="hmDefaultHandler"/>
  <ErrorIDAction Error Identifier="HME_PORT_INTERNAL_ERROR" ErrorAction="hmDefaultHandler"/>
  <ErrorIDAction Error Identifier="HME_LOST_TICKS" ErrorAction="hmDM_LOST_TICKS"/>
  <ErrorIDAction Error Identifier="HME_HM_ERROR" ErrorAction="hmDefaultHandler"/>
  <ErrorIDAction Error Identifier="HME_HMQ_OVERFLOW" ErrorAction="hmDefaultHandler"/>
  <ErrorIDAction Error Identifier="HME_DATA_LOSS" ErrorAction=""/>
   <ErrorIDAction Error Identifier="HME_HM_DEADLINE_MISSED" ErrorAction="hmDefaultHandler"/>
  <ErrorIDAction Error Identifier="HM_MSG" ErrorAction="hmDH_EventLog"/>
  <ErrorIDAction Error Identifier="HME_DEFAULT" ErrorAction=""/>
 <Settings maxQueueDepth="34" queueThresHold="32" stackSize="16384" maxLogEntries="100" logEntriesThreshold="98" attributesMask="0x00000001" notificationHandler ="" notificationMaxQueueDepth="0" eventFilterMask="0xFFFFFFFF" maxErrorHandlerQueueDepth="128" errorHandlerQueueThreshold="126"
  </Settings>
  </SystemState>
</PartitionHMTable>
0
MordechayS 31 Дек 2017 в 21:55

1 ответ

Лучший ответ

Оказывается, в VxWorks для этого есть специальная функция: HM_EVENT_INJECT, которую можно использовать, если вы включите файл hmLib.h в код вашего приложения.

Вот небольшой образец кода, который я написал, упрощенный для ясности:

void HMEInject(int strLength, char* errorString) {
    switch (choice) {
    case 1:
        //HME_DEADLINE_MISSED
        HM_EVENT_INJECT(HME_DEADLINE_MISSED, HM_SUB_CODE_STRING, 0, strLength,
                (char * ) errorString);
        break;
    case 2:
        //HME_APPLICATION_ERROR
        HM_EVENT_INJECT(HME_APPLICATION_ERROR, HM_SUB_CODE_STRING, 0, strLength,
                (char * ) errorString);
        break;
    case 3:
        //HME_NUMERIC_ERROR
        HM_EVENT_INJECT(HME_NUMERIC_ERROR, HM_SUB_CODE_STRING, 0, strLength,
                (char * ) errorString);
        break;
    case 4:
        //HME_ILLEGAL_REQUEST
        HM_EVENT_INJECT(HME_ILLEGAL_REQUEST, HM_SUB_CODE_STRING, 0, strLength,
                (char * ) errorString);
        break;

        ...
    }
 }

Обратите внимание, что все HM_CODE могут использоваться после включения файла hmTypes.h.

Фрагмент от hmTypes.h:

enum HM_CODE
    {  

    /* ARINC 653 defined codes */

    HME_DEADLINE_MISSED = 0,    /* first ARINC code must be 0 */
    HME_APPLICATION_ERROR,
    HME_NUMERIC_ERROR,
    HME_ILLEGAL_REQUEST,
    HME_STACK_OVERFLOW,
    HME_MEMORY_VIOLATION,
    HME_HARDWARE_FAULT,
    HME_POWER_FAIL,

    ...

    }

Уточнение:

  1. Пока не тестировал этот код на нашей целевой ОС.
  2. Эти инъекции будут работать на Process Level только через таблицу мониторинга состояния раздела . Для Kernel Level (через таблицу мониторинга состояния модуля ) используйте ту же команду в терминале VxWorks.
0
MordechayS 10 Янв 2018 в 17:04