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