如何在 VxWorks 653 2.5.0.2 中模拟 Health-Monitor 事件?

How can I simulate Health-Monitor Events in VxWorks 653 2.5.0.2?

我是 RTOS as a whole, and to WindRiver's VxWorks 新手。

我有 Java 背景,正在迈向企业 RTOS 嵌入式系统的第一步。 目前,我正在研究 VxWorks 653 2.5.0.2

我的第一个任务是使用相关的健康监控表(系统、分区和模块 - 请参阅 this document 中的第 5 节)配置 Module.xml 文件(见附图)。 配置后,我发现我真的不知道如何测试它。

当然,我可能可以 "simulate" 一个 HME_NUMERIC_ERROR 通过零潜水,但是 我正在尝试找到一些更好的方法来模拟这些测试。

在我的 POV 中,最好的方法是在 VxWorks shell 中使用一些 shell 命令 注入 Health Monitor Events by demand。类似于 these 命令。

任何关于 shell 命令的想法或解决此问题的最佳实践,都会很棒。

希望大家能帮帮我, 谢谢!

Module.xml 文件示例(取自 here):

Health Monitor Table 示例(来自 here - 那是什么语言?!):

<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>

事实证明,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. 尚未在我们的目标 OS 上测试此代码。
  2. 这些注入将仅通过 Partition Health-Monitoring table 在 Process Level 上起作用。对于 Kernel Level(通过 模块 健康监控 table),请在 VxWorks 终端上使用相同的命令。