30 Ocak 2015 Cuma

Aviyonik Mimariler

Giriş
Havacılıkta kullanılan mimariler tarihsel gelişim sırasıyla şöyle
1. Distributed Analogue Architecture

Bu mimaride ana bileşenler kablolar ile bağlanıyor. Veriyolu (bus) kullanılmıyor. Neticede tam bir kablo yumağı ortaya çıkıyor. Araca değişiklik yapmak son derece güç oluyor. 1950 ve 1960'larda üretilen bir çok hava aracı bu mimari ile yapılmış durumda. Bu yazdıklarım sistemin tasarımcılarına eleştiri mahiyetinde anlaşılmamalı. O zamanki çalışanlar ellerindeki teknoloji ile gayet başarılı işler çıkartmışlar. Bu mimariyi kullanan bazı araçlar şunlar: Boeing 707 , VC10, BAC 1-11, DC-9 ve ilk Boeing 737'ler.

Boeing 707'den türetilen E-3,E-4,E-6 gibi araçlar, VC-10, KC-135 halen kullanımdalar.
2. Distributed Digital Architecture
Bilgisayarların analog cihazların yerini almaya başlaması bu mimarinin kabul görmesine sebep oldu. Bu mimaride her ana bileşen kendi bilgisayarına sahiptir. Ana bileşenler birbirlerine bir veriyolu (bus) ile bağlanırlar. Sivil uçaklarda genellikle ARINC 429 kullanılır. Bu mimariyi kullanan bazı araçlar şunlar: Boeing 737 ve 767, Bombardier Global Express, Jaguar, Nimrod MR2, Tornado, Sea Harrier.
3. Federated Digital Architecture

Bu mimaride MIL-STD-1553B veriyolu kullanılır. Bu mimariyi kullanan bazı araçlar şunlar: F-16, SAAB Gripen, Boeing AH-64 C/D. Sivil araçlar bu mimariyi hemen hiç kullanmadılar. Onun yerine ARINC 629 standardını geliştirdiler. Askeri araçlar da ARINC 629'u kullanmazlar.

ARINC 629'u şu ana kadar kullan tek sivil araç Boeing 777 oldu.

4. Integrated Modular Architecture

Ve günümüze geldik.

Integrated Moduler Avionics (IMA) yeni gelişmekte olan bir kavram. Havacılıkta sıkça görülen "Federated" mimarinin yerine almaya başladı. Federated mimaride her üretici kendi Line Replaceable Unit (LRU) veya Line Replaceable Module (LRM) birimi ile geliyor ve bunlar hava aracından birleştiriliyor. Ancak bu yöntemde her birim kendi işlemcisi, kartı ve donanımı ile geldiği için, hem aracın ağırlığı hem de güç tüketimi artıyor. Yani kaynaklar verimsiz kullanılıyor. IMA yapısında donanım - yani bellek, işlemci gibi kaynaklar - bir nevi sanallaştırılarak, farklı emniyet seviyesindeki uygulamaların aynı donanım üzerinde koşabilmesi sağlanıyor. Tek bir uygulama tüm belleği, kaynakları ve işlemciyi (cpu starvation) tüketemiyor.

Aşağıdaki şekilde durum görülebilir.

IMA yapısının bir diğer artısı ise yazılımı donanımdan soyutlaması. Donanım eskise bile, kolaylıkla değiştirilebiliyor.

IMA ile ilgili ilk fikirler ARINC 650 ve ARINC 651 belgelerinde bulunabilir (General purpose hardware and software standards) . ARINC 653 ile yazılım arayüzleri standartlaştırıldı.

IMA Mimarisinden Önce İşletim Sistemleri Nasıldı ?
İşletim sistemi çekirdeği (kernel) ve uygulama aynı adres alanı (address space) içinde koşuyordu. Sağlamlık (Robustness) için farklı kutular koymaktan başka çare kalmıyordu. Kutuları koşturmak için bir çok firma ya kendi gerçek zamanlı işletim sistemini geliştirmiş ya da gerçek zamanlı bir işletim sistemini sertifikasyona uygun olacak hale getirmişti.

19 Ocak 2015 Pazartesi

Windows'ta ARINC 653 Gerçekleştirimi - Queuing Port

UDP Socket ile gerçekleştirimi
Tüm kodlarda kullanılan bir std::map veriyapımız olsun.

std::map<int,SOCKET> dataMap;

CREATE_QUEUING_PORT
Socket açılır ve bir map içinde saklanır.

CREATE_QUEUING_PORT (
    QUEUING_PORT_NAME_TYPE dummy1,
    MESSAGE_SIZE_TYPE dummy2,
    MESSAGE_RANGE_TYPE dummy3,
    PORT_DIRECTION_TYPE portDirection,
    QUEUING_DISCIPLINE_TYPE dummy4,
    QUEUING_PORT_ID_TYPE portID,
    RETURN_CODE_TYPE * result) {
        SOCKET s = socket (AF_INET,SOCK_DGRAM,IPPROTO_UDP);
        if (portDirection == DESTINATION){ 
            //Bind UDP server
            struct sockaddr_in sAddr = {};
            sAddr.sin_family = AF_INET;
            sAddr.sin_port = portID;
            sAddr.sin_addr.s_add = inet_addr ("127.0.0.1");
            bind (sock,(struct sockaddr *) &sAddr, sizeof(sAddr));
         }
         //Save socket handle portID as key
         map [portID] = s;
         result = SUCCESS;
    }

SEND_QUEUING_MESSAGE
Veri socket üzerinden gönderilir.

SEND_QUEUING_MESSAGE (
    QUEUING_PORT_ID_TYPE portID,
    SYSTEM_TIME_TYPE dummy1,
    MESSAGE_ADDR_TYPE data,
    MESSAGE_SIZE_TYPE dataLength,
    RETURN_CODE_TYPE * result) {
        SOCKET s = dateMap [ portID ];
        int bytesSent = sendto (s, (char*) data, dataLength , 0);
        result = bytesSent < 0 ? FAIL : SUCCESS;
}

RECEIVE_QUEUING_MESSAGE
Veri socket üzerinden alınır.

RECEIVE_QUEUING_MESSAGE (
    QUEUING_PORT_ID_TYPE portID,
    SYSTEM_TIME_TYPE dummy1,
    MESSAGE_ADDR_TYPE data,
    MESSAGE_SIZE_TYPE dataLength,
    RETURN_CODE_TYPE * result) {
        SOCKET s = dateMap [ portID ];
        int bytesRcvd = recv (s, (char*) data, dataLength , 0);
        result = bytesRcvd < 0 ? FAIL : SUCCESS;
}