Gömülü ve Gerçek Zamanlı Tasarım Kalıpları-3. Girdi/Çıktı Donanım Adaptasyon

Huseyin Kutluca
Yazılım Mimarileri
3 min readJan 27, 2021

Gömülü sistemler donanımla yakın çalışan sistemlerdir. Bu sistemlerde sensörler ve eyleyiciler(actuator) ile bilgi alışverişi sayısal ya da analog girdi/çıktı yöntemiyle yapılabilir. Kimi zaman daha karmaşık sensör, eyleyici ya da cihazlar sisteme eternet, seri, usb, Mil-STD 1553, Can-Bus gibi veri yolları ve bunlar üzerinden koşan standart yada firma özel protokoller üzerinden erişirler. Bu ara yüzler gerek donanım açısından gerekse sürücü yazılımı açısından farklı ara yüzlere sahip olabilmektedir. Bu durumda herhangi bir donanım değişikliği bütün yazılım modüllerinde değişikliğe sebep olabilecektir. Gömülü sistemlerde bu donanım bağımlılığını azaltmak üzere girdi/çıktı donanımı, iletişim donanımı, sürücü yazılımının (Girdi/Çıktı Donanım Adaptasyonu) soyutlanması sağlanmaktadır.

Sürücü Yazılımları

Farklı firmalar tarafından geliştirilen donanımlara erişmek ve bu donanımlar üzerinden veri alışverişi sağlamak üzere sürücü yazılımları(device driver) kullanılır. Sürücü yazılımları donanımın durum ve kontrol yazmaçlarına (register) erişerek veri alışverişini başlatır. Bu sürücü yazılımları istek tabanlı veri erişimi yapabileceği gibi kesme(interrupt) işleme yöntemi ile de çalışabilmektedir. Kesme (Interrupt) tabanlı sürücü yazılımlarında girdi/çıktı donanımı veri hazır olduğunda kesme yöntemi ile sürücü yazılımının kesme işleme yazılımını çalışır hale getirir. İlgili kesme işleme yazılımı veriyi donanımdan belleğe aktarıp hızlıca işlemciyi bırakır. Veri yazmak ta benzer şekilde yapılmaktadır. Sürücü yazılımları farklı tür veri yolu (PCI, ISA, VME) üzerinden farklı erişim yöntemlerini kullanarak (memory mapped, IO mapped) veriyi bellek ile cihaz arasında iletmektedir. Kimi zamanda DMA denilen yaklaşım ile veri cihaz belleğinden bilgisayar belleği arasında doğrudan aktarılabilmektedir.

Bu sürücü yazılımları işletim sisteminin çekirdeği üzerinde geliştirildiğinde standart bir ara yüz üzerinden hizmet verebilmektedir. Bu ara yüz yaratma (create), açma (open), okuma (read), yazma (write) ve cihazı kontrol etme (ioctl) ara yüzünü sağlar. Temel servisler çok benzer olmasına karşılık bu ara yüzler işletim sistemlerine bağımlıdırlar. Kimi zamanda ise donanım geliştiricileri veya sürücü yazılım geliştiriciler bu ara yüzü kullanmak yerine kendi belirledikleri standart olmayan sürücü ara yüzleri ile sağlamaktadır. Bu özellikle daha karmaşık cihazlarda kullanıcıya daha esnek bir ara yüz sağlamak üzere tercih edilebilmektedir.

Girdi/Çıktı Donanım Adaptasyonu

Geliştirilen yazılımların farklı donanım ortamlarına ve/veya farklı işletim sistemlerinde da kolayca taşınabilmesi için bu farklılıkların bir katman olarak soyutlanması yöntemine gidilmektedir. Böylelikle uygulama bileşeni geliştirici fiziksel seviyede verinin nasıl taşındığı, nasıl kodlandığı ve sürücü yazılımın ara yüz servislerinden bağımsız olarak kendi kodunu geliştirebilmektedir.

Bu katman AUTOSAR standardında Girdi/Çıktı Donanım Soyutlama (I/O Hardware Abstraction) veya FACE standardında Girdi/Çıktı Servis (I/O Services)olarak karşımıza çıkmaktadır.

Bu Soyutlama girdi/çıktı soyutlama katmanının

  • İlklendirme,
  • Yapılandırma,
  • Veri okuma,
  • Veri yazma,
  • Durum bilgisi sorgulama,
  • Asenkron okuma yazma için geri çağırma fonksiyonları (callback function) gibi ortak ara yüzleri tanımlanmaktadır.

Aşağıda IDL dili ile tanımlanmış bir girdi/çıktı servisi ara yüzü verilmiştir.

module IO_Service {

void Initialize ( in CONFIGURATION_RESOURCE config_resource, out RETURN_CODE_TYPE return_code);

void Open_Connection ( in CONNECTION_NAME_TYPE name, in TIMEOUT_TYPE timeout, out CONNECTION_HANDLE_TYPE handle, out RETURN_CODE_TYPE return_code);

void Read ( in CONNECTION_HANDLE_TYPE handle, in TIMEOUT_TYPE timeout, inout READ_PAYLOAD_TYPE payload, out RETURN_CODE_TYPE return_code);

void Write (in CONNECTION_HANDLE_TYPE handle, in TIMEOUT_TYPE timeout, in WRITE_PAYLOAD_TYPE payload, out RETURN_CODE_TYPE return_code);

void Configure_Connection_Parameters (in CONNECTION_HANDLE_TYPE handle, in TIMEOUT_TYPE timeout, in _PARAMETER_TRANSACTION_TYPE parameters, out RETURN_CODE_TYPE return_code);

void Get_Connection_Configuration (in CONNECTION_HANDLE_TYPE handle, in TIMEOUT_TYPE timeout, inout IO_PARAMETER_TRANSACTION_TYPE parameters, out RETURN_CODE_TYPE return_code);

void Get_Connection_Status ( in CONNECTION_HANDLE_TYPE handle, out CONNECTION_STATUS_TYPE status, out RETURN_CODE_TYPE return_code);

}

Farklı tür bağlantılar ve protokoller veriye erişim ve veri gönderme konusunda farklı davranabilmektedir. Kimi çözümler bu tür farklı yaklaşımlar için farklı ara yüzler sunarken kimisi bunları tek bir ara yüzde toplamayı hedeflemektedir. Örneğin seri port, Can-Bus ve eternet için farklı ara yüzler sunduğunuzda ilgili tür farklı donanımları soyutlamış oluyorsunuz. Ama bir seviye üste çıkıp her tür donanımı aynı ara yüz üzerinden soyutlayabilirsiniz . Bu durumda veri yolu farklılıklarını yönetmek için daha titiz bir çalışma yapmanız beklenmektedir.

--

--

Huseyin Kutluca
Yazılım Mimarileri

Highly motivated Software Architect with hands-on experience in design and development of mission critical distributed systems.