22 Haziran 2014 Pazar

VxWorks 653 Health Monitor

Health Monitor Nedir?

Health Monitor ARINC 653 standardından geliyor.Health Monitor herhangi bir hata durumunda ne yapılması gerektiğini belirten bir tablo gibi düşünülebilir. 


Hangi zamanda hangi seviye HM tablosunun kullanılacağı SystemState olarak anılan sistemin durumuna göre belirlenir. Örneğin partition normal mode'a gelmeden hata verirse module os seviyesindeki error handler çağırılır. Eğer bir hata, oluştuğu seviyede ele alınmaz ise, bir üst seviyeye çıkarılır ve bu seviyedeki error handler tarafından işlenir.

XML ile ayarlanabilen 3 seviyede mevcut. Bunlar "Process Seviyesi", "Partition Seviyesi", "Module Seviyesi". Process seviyesi haricindeki diğer tablolar XML ile giriliyor.

Aşağıda tüm XML'i kapatılmış olarak gösteren bir örnek var. ARINC 653 standardında olmayan SystemHMTable tablosunu da aşağıda açıkladım.
<HealthMonitor>
   <SystemHMTable/>

   <ModuleHMTable/>
   <PartitionHMTable>
</HealthMonitor>

Process Seviyesi Health Monitor Ayarları
Konuyu Process Seviyesi Health Monitor başlıklı yazıya taşıdım.

Partition Seviyesi Health Monitor Ayarları
Aşağıda bölümleme (partition) için XML örneği var.ErrorAction alanının karşısında yazan isim, hataya oluşunca çalıştırılması istenen kod parçasını belirtmek için kullanılıyor.

Her partition için ayrı bir HM tablosu bulunabilir. Eğer istenirse tüm partition'lar için aynı tablo da kullanılabilir.

Örnektede açıklandığı gibi, hmDefaultHandler partition'ı yeniden başlatır.hmDbgDefaultHandler ise partition'ı durdurur. Geliştirme aşamasında HME_HM_DEADLINE_MISSED hatası alınırsa partition'ın yeniden başlatılmasının sebebi budur.

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

HME_LOST_TICKS: Such an event is received when system clock interrupts were lost

HME_POWER_FAIL: Such an event is received when the power source of the module failed for an amount of time less than the RAM holding time. This means that when this event is received the power should be back on, and the RAM should not be affected bythis short power loss. However all of the devices on the module have been reset.

XML ve Kod Eşleşmesi
XML'de tanımlanan isimler ile çağrılacak metodlar vxworks653-x.y.z.\target\config\comps\src\usrHm.c dosyasındaki tabloda eşleştiriliyor.

extern STATUS myHandler (HM_EVENT_ID event);

HM_HANDLER_TBL_ENTRY hmHandlerTbl [] =
{
    .....//Original handlers
    {"myHandler" ,myHandler}
};

Kendi Metodumuz
Eğer kendimiz yeni bir handler yazmak istersek, ModuleOS projesine yeni bir metod yazmalıyız ve metodu yukarıdaki tabloya eklemeliyiz. Yeni metodun imzası şöyle:

STATUS myHandler (HM_EVENT_ID event){
 return OK;
}

Module Seviyesi Health Monitor Ayarları
Bu tabl PartitionHMTable ile hemen hemen aynı olduğu için tekrar etmek istemedim.

System Seviyesi Health Monitor Ayarları
Aşağıdaki cümleler önemli
 * Defines the level of an error (Module, Partition, Process) based on the error and the state of the system.
Yani bu tablo bir çeşit dispatcher gibi çalışıyor. Gelen hatayı uygun olan seviyeye yönlendiriyor.

Bu tablo oldukça kısa.
<SystemHMTable Name="systemHm">
    <SystemState SystemState="HM_PARTITION_MODE">
        <ErrorIDLevel ErrorIdentifier="HME_DEFAULT" ErrorLevel="HM_PARTITION_LVL"/>
    </SystemState>
    <SystemState SystemState="HM_MODULE_MODE">
        <ErrorIDLevel ErrorIdentifier="HME_DEFAULT" ErrorLevel="HM_MODULE_LVL"/>
    </SystemState>
    <SystemState SystemState="HM_PROCESS_MODE">
        <ErrorIDLevel ErrorIdentifier="HME_DEFAULT" ErrorLevel="HM_MODULE_LVL"/>
    </SystemState>
</SystemHMTable>

Hiç yorum yok:

Yorum Gönder