# Gömülü sistem
Gömülü sistem, bilgisayarın kendisini kontrol eden cihaz tarafından içerildiği özel amaçlı bir sistemdir. Genel maksatlı, örneğin kişisel bilgisayar gibi bir bilgisayardan farklı olarak, gömülü bir sistem kendisi için önceden özel olarak tanımlanmış görevleri yerine getirir. Sistem belirli bir amaca yönelik olduğu için tasarım mühendisleri ürünün boyutunu ve maliyetini azaltarak sistemi uygunlaştırabilirler. Gömülü sistemler genellikle büyük miktarlarda üretildiği için maliyetin düşürülmesinden elde edilecek kazanç, milyonlarca ürünün katları olarak elde edilebilir.
Gömülü bir sistemin çekirdeğini, belirli bir sayıda görevi yerine getirmek için programlanan mikroişlemciler ya da mikrodenetleyiciler oluşturur. Kullanıcıların üzerinde istediği yazılımları çalıştırabildiği genel maksatlı bilgisayarlardan farklı olarak, gömülü sistemlerdeki yazılımlar yarı kalıcıdırlar ve firmware ismiyle anılırlar.


## Gömülü Sistem Örnekleri.
  - Banka ATM'leri
  - Eylemsiz rehber sistemleri, uçuş kontrol donanım/yazılımı ve uçak ve füzelerdeki diğer tümleşik sistemlerden oluşan havacılık elektroniği parçaları
  - Yönlendirici (router), timeserver ve güvenlik duvarı (firewall) gibi bilgisayar ağ ekipmanları
  - Bilgisayar yazıcıları
  - Fotokopi makineleri
  - Disket sürücüler (floppy disket sürücüler ve sabit disk sürücüler)
  - Termostat, klima, sprinkler ve güvenlik izleme sistemleri gibi ev otomasyonu ürünleri
  - Hesap makineleri
  - Mikro dalga fırınlar, çamaşır makinesi, televizyon alıcısı ve DVD oynatıcı/kaydedici gibi ev elektroniği ürünleri
  - Tıbbi ekipmanlar
  - Çok işlevli kol saatleri
  - İnternet radyo alıcıları, TV set top box ve dijital uydu alıcılar gibi çokluortam uygulamaları
  - Çok işlevli yazıcılar
  - PDA'lar gibi küçük avuç içi bilgisayarlar
  - PDA ve Java destekli gelişmiş cep telefonları
  - Endüstriyel otomasyon ve izleme için PLC'ler
  - Video oyun konsolları ve avuç içi oyun konsolları
  - Taşınabilir bilgisayarlar


## Tarihçe.
Kayda değer ilk gömülü sistem MIT Instrumentation Laboratory‘da Charles Stark Draper tarafından geliştirilen Apollo Guidance Computer olmuştur. Aya yapılan yolculuklarda iki tane kullanılırdı ve komuta modülü ve LEM'in eylemsiz rehber sistemlerini çalıştırıyordu.
Projenin başlangıcında Apollo rehber bilgisayarı Apollo projesinin en riskli parçası olarak kabul ediliyordu. O zamanki tek parça entegre devrelerin kullanılması boyut ve ağırlığı azaltıyor ama riski artırıyordu.
İlk kitlesel gömülü sistem üretimi 1961 yılında Minuteman füzesi için yapılan Autonetics D-17 rehber bilgisayarı oldu. Ayrık transistör mantık devresinden yapıldı ve ana bellek için bir harddiski vardı. 1966 yılında Minuteman II üretime girdiğinde, D-17 ilk defa yüksek hacimli tümleşik devrelerin kullanıldığı yeni bir bilgisayara yerini bıraktı. Bu yazılım dörtlü NAND kapılı tümleşik devrelerin birim fiyatını 1000$'dan 3$'a çekti ve ticari kullanımlarının yolunu açtı.
Minuteman bilgisayarının önemli tasarım özellikleri, füzenin hedefi daha hassas bulabilmesi için rehber algoritmasının yeniden programlanabilir olması ve bilgisayarın kablo ve konnektörden tasarruf sağlayarak füzeyi test edebilmesiydi.
Maliyetin dikkate alınmadığı 1960'lardaki bu ilk uygulamalardan itibaren gömülü sistemlerin fiyatları düşmeye başladı. Bunlarla birlikte işlem gücü ve işlevsellikte de yükseliş oldu.
İlk mikroişlemci hesap makineleri ve diğer ufak sistemlerde kullanılan Intel 4004 oldu. Çalışabilmesi için harici bellek yongaları ve harici destek lojiklerine ihtiyaç duyuyordu. Intel 8080 gibi daha güçlü mikroişlemciler askeri projelerde geliştirildi, ama diğer kullanıcılara da satıldı.
1970'lerin sonunda 8-bit mikroişlemciler standart olmakla birlikte çözümleme ve giriş/çıkış işlemleri için genellikle harici bellek yongaları ve lojiklere ihtiyaç duyuyorlardı. Öte taraftan, fiyatlar hızla düşüyor ve uygulamalar küçük gömülü sistemleri lojik tasarımların içine sokuyordu. Görünebilir uygulamaların bir kısmı enstrümantasyon ve pahalı aygıtlardı.
1980'lerin ortalarında harici olarak kullanılan sistem parçaları, işlemci ile beraber aynı yonganın içine girmeye başladı. Bunun sonucu olarak boyutta ve gömülü sistemlerin maliyetinde çok büyük düşüşler oldu. Bu tip tümleşik devrelere mikroişlemci yerine mikrokontrolör dendi ve gömülü sistemlerin yaygın bir şekilde kullanımı mümkün oldu.
Mikrokontrolör maliyeti bir mühendisin 1 saatlik maaşının altına indi ve bu gömülü sistemlerin sayısını ve gömülü sistemlerde kullanılmak üzere farklı şirketler tarafından üretilen parçaların sayısının patlamasına neden oldu. Örneğin, pek çok yeni özelliğe sahip IC'ler, geleneksel paralel programlama arayüzleri yerine mikrokontrolörlere daha az sayıda arabağlantı sağlayan seri programlama arayüzleri ile beraber gelmeye başladı. I2C‘nin çıkış zamanı da bu döneme rastlamaktadır. Mikrokontrolörler 1$’ın altına düştüğünde, voltmetre ve değişken kapasitör gibi pahalı analog elemanların yerlerini küçük bir mikrokontrolör ile kontrol edilen dijital elektronik elemanlara bırakması mümkün oldu.
80’lerin sonundan itibaren, tüm elektronik cihazlar için gömülü sistemler bir istisna değil bir standart haline geldi ve bu akım halen devam etmektedir.


## Karakteristikler.
Gömülü sistemler en geniş manasıyla bilgisayar sistemidir. Gömülü sistemlerin örnekleri taşınabilir müzik çalıcılardan uzay araçlarındaki altsistemler için kullanılan gerçek zamanlı kontrol sistemlerine kadar uzanır. En ticari gömülü sistemler, düşük maliyette bir takım işleri gerçekleştirmek için tasarlanıyor. Hepsi olmamakla birlikte büyük çoğunluğunun gerçek zamanlı sistem kısıtlamalarını karşılaması gerekir. Bazı işlevlerinin çok hızlı olması gerekebilirken, diğer pek çok işlevinin kesin zamanlama gereksinimi olması gerekmemektedir. Bu tip sistemler, gerçek zaman kısıtlarını sistem gereksinimlerine bağlanmış özel amaçlı yazılım ve donanım kombinasyonları ile karşılarlar.
Gömülü sistemleri hız ve maliyet ile karakterize etmek zor olmakla beraber, maliyeti azaltan yüksek hacimli sistemler öncelikli tasarım hedefidir. Genellikle gömülü sistemlerin düşük verim gereksinimleri olur. Bu sistem donanımını, maliyeti düşürmek için basitleştirme olanağı tanır. Mühendisler gerekli işlevleri sağlayan “yeteri kadar iyi” olan donanımları seçerler.
Örneğin, uydu televizyon için dijital bir set-top box' ın saniyede onlarca megabit veri işlemesi gerekir ama bu işlemlerin büyük bölümü çok kanallı dijital videoyu ayrıştıran, yönlendiren ve çözen özel tümleşik devreler tarafından gerçekleştirilir. Gömülü CPU bu işlemi kurar ve set box'ın kullanıcı arayüzü gibi görsel öğelerini ekrana basar. Gömülü işlemcilerin hızları artıp, fiyatları ucuzlarken, yüksek hızlı veri işlemede öncülüğü daha fazla ele almaktadırlar.
Düşük hacimli gömülü sistemler için kişisel bilgisayarlar, yazılımları sınırlayarak ya da işletim sistemini gerçek zamanlı işletim sistemiyle değiştirerek kullanılabilir. Bu durumda özel amaçlı donanım bir ya da daha fazla yüksek verimli CPU ile değiştirilebilir. Bazı gömülü sistemler istenen görevleri yerine getirmek için, yüksek performanslı CPU, özel donanım ya da büyük belleklere ihtiyaç duyabilir.
Taşınabilir müzik çalıcılar ve cep telefonları gibi büyük hacimli gömülü sistemlerde, maliyeti düşürme yönünde yapılan çalışmalar öncelik kazanır. Bu sistemler genellikle birkaç tümleşik devre, bütün fonksiyonları kontrol eden tümleşik CPU ve tek bir bellek yongası içerirler. Bu tasarımlarda her bir eleman bütün sistem maliyetini düşürecek şekilde seçilir ve tasarımları bu şart altında yapılır.
Bir disk sürücüsü olmayan gömülü sistemler için yapılan yazılıma firmware adı verilir. Firmware yazılımları cihazın içinde bir ya da daha fazla ROM ya da flaş bellek yongalarında gömülü olarak bulunur. Gömülü sistemlerdeki yazılımlar genellikle pek çok donanım kaynağından mahrum bir şekilde çalışırlar. Genellikle bu tip sistemlerde disket sürücü, işletim sistemi, klavye ya da ekran yoktur. Eğer bir kullanıcı arayüzü var ise küçük bir klavye ya da LCD gerekebilir.
Gömüllü sistemler, yıllarca hatasız bir şekilde çalışacağı varsayılan donanımların içinde bulunur. Bu yüzden gömülü sistem içindeki yazılımlar, kişisel bilgisayar içinde olanlardan daha dikkatli bir şekilde geliştirilip test edilir. Pek çok gömülü sistemde, disket sürücü, anahtar ya da düğme gibi mekanik parçaların kullanımından sakınılır çünkü bu tip parçalar flash bellekler gibi statik parçalara kıyasla daha az güvenilirdir.
Bütün bunlara ek olarak, gömülü sistemler insanların kolaylıkla ulaşabileceği yerlere uzak olabilirler (bir petrol kuyusunun dibinde ya da uzayda bulunan bir uydu üzerinde). Dolayısıyla gömülü sistemler çok büyük veri kayıpları yaşandığı durumlarda bile kendilerini yeni baştan başlatabilmelidirler. Bu tip bir işlev watchdog timer adı verilen standart elektronik bir parça tarafından yerine getirilir.


## Gömülü Sistemlerin Tasarımı.
Elektronik cihazlar genellikle mikroişlemci ya da mikrokontrolör kullanırlar. Bazı büyük ya da eski sistemler ise genel maksatlı büyük bilgisayarlar ya da minibilgisayarlar kullanırlar.


### Kullanıcı Arayüzleri.
PARC, Apple Computer, Boeing ve HP' de bulunan arayüz tasarımcıları, kullanıcı eylemlerininin tipinin sayısının azaltılması gerektiği ilkesini keşfettiler. Gömülü sistemlerde bu ilke daha düşük maliyetlere yönelik çalışmalarla birleştirilmektedir.
Gömülü sistemlerde yaygın olarak kullanılan standart bir arayüz iki tuştan oluşmaktadır; bunlardan biri menü sistemini kontrol etmek için diğeri ise istenilen seçimi gerçekleştirmek için kullanılmaktadır. Menüler kendilerini belgeleyebildikleri ve çok basit kullanıcı eylemleri ile seçilebildikleri için oldukça popülerdir.
Bir diğer yöntem ise çıktı tipini ufaltmak ve basitleştirmektir. Tasarım bazı durumlarda her bir arayüz çıkışı ya da sistem hatasını bilgilendirmek amacı ile ışık veren LED içerir. Ucuz bir seçenek olması açısından üzerine kullanıcının yerel dilini içeren hata çıkıntılarını gösteren baskılı matris etiketleri yapıştırılmış ışık barları kullanmaktır. Örneğin, pek çok küçük bilgisayar yazıcısı üzerinde herhangi bir dilde yazılar olan etiketlerle etiketlenmiş ışıklar kullanmaktadır. Bazı marketlerde bu tip ürünler müşterinin seçeceği dilde hazırlanmış etiketlerle satışa sunulmaktadır.
Kullanılan bir başka yöntem mode'ların kullanıcı ekranında açıkça görünür hale getirilmesidir. Eğer bir arayüzün modları varsa, her zaman bir yöntemle ya da arayüzün kendisi tarafından otomatik olarak tersine çevrilir. Örneğin, Boeing'in standart test arayüzü bir düğme ve birkaç ışıktan oluşur. Düğmeye basıldığı zaman ışıklar yanar ve bırakılması ile birlikte hata mesajı veren ışıklar yanar. Kullanılan etiketler yalın bir İngilizce ile hazırlanmıştır.
Tasarımcılar sıklıkla farklı renkleri kullanırlar. Kırmızı tehlike anlamına gelir ya da tüm sistemi etkileyecek bir hatanın varlığını belirtir. Sarı bir takım problemlerin olduğunu yeşil ise sistem durumunda herhangi bir aksaklık olmadığını belirtir. Seçilen renkler birçok insanın anlaması açısından trafik işaretlerindeki renkler olarak belirlenir.
Eğer yapılan tasarım bir ekran gerektiriyorsa tasarımcılar genelde düz metin kullanımını tercih ederler. Eğer ürün görsel eğlence öğeleri üzerinde kurulmuş bir tasarımdan ibaretse, görselliği zengin metinler, resimler ve menüler ürün için tercih edilmelidir.


### Platform.
Gömülü tasarımlarda kullanılabilecek ARM, MIPS, Coldfire/68k, PowerPC, X86, PIC, 8051, Atmel AVR, Renesas H8, SH, V850, FR-V, M32R gibi pek çok işlemci mimarisi bulumaktadır.
Standart PC/104 küçük hacimli gömülü sistem tasarımları için sıkılıkla tercih edilmektedir. Bu tasarımlar genellikle DOS, Linux, NetBSD veya QNX ya da Inferno gibi gerçek zamanlı işletim sistemleri kullanmaktadır.
Büyük hacimli gömülü sistem tasarımlarında ise genellikle tek bir yonga üzerinde toplanmış sistemler tercih edilir ve bunun içinde uygulamaya yönelik tümleşik devre tasarımları kullanılır. Bu tasarımlar genelde CPU dahil tüm lojik tasarımlar FPGA kullanarak gerçeklenebilir.


### Araçlar.
Gömülü sistem tasarımcıları, bilgisayar programcıları gibi derleyici, çevirici ve hata ayıklayıcı gibi araçları gömülü sistem geliştirmekte kullanırlar. Bununla birlikte, pek çok programcıya yabancı gelebilecek bir takım araçlarda geliştirme sürecinde kullanılır.
Yazılım araçları birkaç kaynaktan elde edilebilir:
  - Gömülü pazarda uzmanlaşmış yazılım şirketleri
  - GNU yazılım geliştirme araçlarından çalışılacak ortama taşınarak (bkz. çapraz derleme)
  - Bazen de işlemci mimarisi kullanılacak gömülü işlemci mimarisine yakın olan kişisel bilgisayarlarda kullanılan yazılımlardan faydalanılabilir.
Bilgisayar programcılarının tercih etmediği ama gömülü sistem tasarımcıları tarafından kullanılan birkaç yazılım aracı bulunmaktadır:
  - Sıklıkla kullanılan bir araç “in-circuit emulator” (ICE) daha modern tasarımlarda ise gömülü bir hata ayıklayıcı. Bu hata ayıklama aracı gömülü kod geliştirmede kullanılan temel yapılardan biridir. Mikroişlemciye yapılan bağlantı ile sistemde geliştirilen kodların çabuk ve hızlı bir şekilde yüklenmesini ve ayıklanmasını sağlar. 
  - Gömülü bağlayıcıların (linker) kodun boyutunu ufaltmak ve çalışma zamanını azaltmak için pek çok optimizasyon özellikleri vardır. Bunlara ek olarak data overlays ve bank switching gibi optimizasyon teknikleri de sağlayabilmektedirler. 
  - Kullanılan bir diğer araç ise gömülü uygulamaya bir CRC yazılımı eklenmesi böylece gömülü sistem yazılım verisini çalıştırmadan önce kontrol edebilir.
Bunların dışında kullanılan bazı programlama dilleri kullanıcıya gömülü sistemler tasarlamak amacıyla çeşitli kolaylıklar sağlar. C dili için:
  - İsimlendirilmiş adres alanları
  - İsimlendirilmiş depolama sınıfları
  - Temel I/O donanım adresleme


### Hata Ayıklama.
Hata ayıklama genellikle bir devre emülatör ya da mikrokontrolör tarafından çalışan mikrokodu kesebilecek bir çeşit hata ayıklayıcı tarafından gerçekleştirilebilir. Mikrokod kesme hata ayıklayıcıya üzerinde sadece CPU'nun çalıştığı donanım üzerinde çalışma imkânı verir. CPU tabanlı hata ayıklayıcılar bilgisayar donanımlarını CPU açısından test etmek ya da hata ayıklamak amacı ile kullanılabilir. Bunun yanında geliştiriciler, yüksek seviyeli dillerle kesme noktası ve tek adımlama kullanarak hata ayıklamalıdır çünkü bu özellikler oldukça yaygın olarak kullanılmaktadır. Bunlara ek olarak basit log kayıtlarının tutulması gerçek zamanlı eylemlerin hata ayıklamasında faydalı olur.
Gömülü sistemin karmaşıklığı arttıkça üst seviye araçlar ve işletim sistemleri tasarımların içine girmeye başlar. Cep telefonları, pda' ler ve diğer tüketici bilgisayarları ileri düzey yazılım ve işletim sistemleri gerektirir. Bu tip sistemlerde, Linux, NetBSD, OSGi ya da Embedded Java gibi açık programlama ortamları, geniş bir pazara satış yapabilmek amacı ile kullanılmalıdır.


### İşletim Sistemi.
Gömülü sistemlerde işletim sistemi olmayabildiği gibi (Örn: PIC), Embedded (gömülü) Linux, Windows IoT, WinCE, Android, IOS gibi gelişmiş ya da özelleştirilmiş gömülü işletim sistemleri de kullanılabilir.


### Başlangıç.
Tüm gömülü sistemlerin bir başlangıç kodu vardır. Kesmeleri iptal eder, aygıtları devreye sokup çalıştırır, bilgisayarı test eder (RAM, CPU ve yazılım) ve ardından uygulama kodunu başlatır. Pek çok gömülü sistem kısa süreli güç kayıplarından, en son yapılan testler tekrarlanmadan kurtarılabilir.
Tasarımcılar hataları işaret etmesi açısından genellikle LED kullanımını tercih ederler. Genel bir tasarım olarak tekrar başlatma sırasında tüm cihazlara bağlı LED'ler yanmaya başlayacaktır. Daha sonra açılış testi sırasında yazılım, LED'lerin durumunu hata ya da normal haller için değiştirir.


### Yerleşik Kendi kendine-Test.
Kendini test eden gömülü sistemlerin temel şekilleri şöyle açıklanabilir:
  - CPU, RAM ve yazılım belleğinin test edilmesi. Bu genellikle sisteme enerji verildiğinde bir kereliğine gerçekleştirilir. Güvenliğin kritik olduğu sistemlerde periyodik olarak ya da belli zaman aşımlarında gerçekleştirilir.
  - Giriş, çıkış ve çevre aygıtlarının test edilmesi. İletişim, analog ve kontrol sistemleri bu tip testleri gerçekleştirebilir.
  - Batarya ya da ona karşılık gelen enerji kaynağının test edilmesi. 
  - Bağlantı üniteleri arasında gerçekleştirilen iletişim testleri. Üniteler arasında yollanan ve alınan basit mesajlarla sağlanır. 
  - Kablo testleri. Bağlantı pinlerinin doğruluğunu test etmek için yapılır ve özellikle senkronize iletişim sistemlerinde ön plandadır.
  - Donanım arama testi. Eklenen bir donanım ile ilgili bilgiler kullanıcıya döndürülerek sistem yükleme işlemine yönelik yol gösterme sağlanır. 
  - Tüketilebilinenlerin testi. Sistemde kullanılanların miktarı seviyesi ve pozisyonu hakkında bilgiler döndürür. Yakıt ya da çeşitli kimyasal maddelerin kontrolü buna örnek verilebilir.
  - Operasyonel testler. Bu testler sistemin çalışması esnasında yürütülen fonksiyonlara yönelik bir testtir ve sistem çalışırken gerçekleştirilir.
  - Güvenlik testi. Sistem güvenliği belli bir aralık değerine göre test edilir.


### Güvenilirlik rejimleri.
İnsanların talep etme nedenlerine göre güvenirliğin farklı tanımları vardır. Ama güvenilirlik tipleri farklı sistemler için temel olup birbirleri arasında büyük değişiklik göstermemektedir:
  - Sistem oldukça güvensiz ya da onarım maksadı ile ulaşılması imkânsız (Uzay sistemleri, denizaltı kabloları vs.). 
  - Sistem güvenli bir şekilde kapatılamaz.
  - Sistem güvensiz durumdayken çalışamaz.
Bu tanımlamalar güvenilirlik rejimi için kriter olarak seçilebilir.