Gömülü yazılım

Gömülü yazılım, denetim makineleri ve bilgisayar sayılmayan aygıtlar için yazılmış yazılımlardır. Gömülü yazılımlar genellikle çalıştırılacakları donanıma göre özelleştirilir, zaman ve bellek kısıtlamalarına sahiptir. "Gömülü yazılım" terimi bazen firmware terimi ile beraber kullanılır, fakat firmware bir bilgisayardaki, üstünde bir işletim sisteminin çalıştığı ROM tabanlı koda uygulanabilir. Oysaki, gömülü yazılım genellikle aygıttaki tek yazılım olarak bulunur.Gömülü yazılımların belirgin ve değişmez bir özelliği ise, bu yazılımların çoğu işlevlerinin kullanıcı arayüzü değil, bilgisayar arayüzü aracılığıyla gerçekleştirilmesi ve denetlenmesidir.İmalatçı firmalar, gömülü yazılımlarını arabalar, telefonlar, modemler, robotlar, elektronik tehçizatlar, oyuncaklar, güvenlik sistemleri, kalp pilleri, televizyonlar ve set üstü cihazlar, dijital saatler gibi ürünlerinin içine yerleştirmektedir. Bu yazılım işlem karmaşıklığı Yaklaşık Değer Hesaplama sistemi (Rasgeleleştirilmiş algoritmaları baz alan bir yöntem) kullanılarak belirlenmiş, birkaç kilobaytlık hafızaya sahip olan bir 8-bit mikrodenetleyicide çalıştırılan bir ışıklandırma kontrolü kadar basit olabilirken, uçaklar, füzeler ve süreç denetimi sistemlerindeki uygulamarında çok daha karışık bir halde bulunabilirler.OS X, Windows veya GNU/Linux gibi işletim sistemlerini kullanan standart bilgisayarlardan farklı olarak, gömülü yazılımlar hiçbir işletim sistemini kullanmayabilir ya da işletim sistemi kullanımı söz konusu olduğunda, gerçek zamanlı işletim sistemleri genel tercih olmak üzere, çeşitli işletim sistemlerini kullanabilir. Bu çeşitlilik küçük, birer çalışma döngüsü ve zamanlayıcıdan oluşan tek kişilik işlemlerden, LynxOS, VxWorks, BeRTOS, ThreadX'e, Windows CE veya Linux (yamalı kernel kullanımıyla)'a kadar yükseltilebilir. Diğer seçenekler OpenWrt, PikeOS, eCos, Fusion RTOS, Nucleus RTOS, RTEMS, INTEGRITY, uC/OS, QNX, FreeBSD ve OSE'yi içerir. Yazılım kodu genellikle C veya C++ programlama dillerinde yazılır, fakat son zamanlarda mikrodenetleyiciler ve gömülü sistemlerde kullanılma amacıyla Python ve JavaScript gibi yüksek seviyeli programlama dillerinin kullanımı yaygınlaşmıştır. Ada dili ise bazı askeri projelerde ve havacılık projelerinde yer almaktadır.Çoğu tüketiciler, bilgisayara işlevsellik kazandıran uygulama yazılımlarına aşinadır. Gömülü yazılımlar ise, bu tür yazılımlardan daha basit olmamasına karşın, tüketicinin kullanımında daha az oranda görünür. Uygulama yazılımlarından farklı olarak gömülü yazılımlar kalıplaşmış, sabit donanım gereksinimlerine ve yeteneklerine sahiptir, üçüncü parti yazılım ve donanımların ilavesi katı bir şekilde kısıtlanmıştır.Gömülü yazılımlar, gerekli tüm aygıt sürücülerini üretim esnasında içermek zorundadır ve bu sürücüler özelleştirilmiş donanımlara göre oluşturulur. Yazılım ise CPU ve özel olarak seçilen yongalara bağlı olarak yüksek derecede bağımlılık gösterir. Çoğu gömülü yazılım mühendisleri şema analizi ve bileşenlerin, girdi ve iletişim sistemlerinin kullanımını belirlemekte kullanılan veri sayfalarının analizi konusunda mutlaka geçmiş tecrübeye sahiptir. Ondalık, onaltılık ve ikili veri türlerinin dönüşümü bit manipülasyonu tekniğinin kullanımı kadar kullanışlıdır.Web uygulamaları nadir sıklıkla kullanılmaktadır, fakat XML dosyaları ve benzer çıktılar görüntüleme amacıyla bir bilgisayara aktarılabilir. Klasör içeren dosya sistemleri, SQL veritabanlarının olduğu gibi genellikle bulunmamaktadır.Yazılım geliştirme işlemi, kodu bilgisayarda çalıştırabilen, ayrıca çalıştırılabilir kodu hedeflenen aygıta göre derleyebilen bir çapraz derleyici gerektirir. Hata ayıklama işleminde bir devre içi emulatör, JTAG veya SWD'nin kullanımı mecburidir. Yazılım geliştiricilerinin çoğu zaman kernel (İS) kodunun tamamına erişim imkânı vardır.Depolama hafızasının ve RAM'in boyutu büyük ölçüde değişiklik gösterebilir. Bazı sistemler 16 KB Flash hafıza, 4KB RAM ve 8 MHz frekansla çalışan bir işlemciyle çalışırken, bazı sistemler donanım konusunda günümüz bilgisayarlarını geçebilir. Bu tür hafıza gereksinimleri C++ yerine C veya Embedded C++ dillerinin daha fazla kullanımını gerektirebilir. BASIC gibi yorumlanan diller ( Parallax Propeller gibi aygıtların kullandığı derlenen BASIC dışında) ve Java (Java ME Embedded 8.3 ARM Cortex-M4, Cortex-M7 mikrodenetleyicileri ve Raspberry Pi and Intel Galileo Gen. 2'de kullanılan eski ARM11 mikrodenetleyiciler için mevcuttur.) dillerinin kullanımı yaygın değildir; fakat yorumlanan bir dil olan Python 3 dilinin mikrodenetleyicilere özel uygulaması MicroPython özellikle 32-bit ARM-tabanlı mikrodenetleyici (Örneğin BBC micro:bit gibi) ve 16-bit PIC mikrodenetleyici kullanımına açıktır.İşlemciler arası ve işlemcinin diğer sistem bileşenleri ile iletişimin kurulabilmesi oldukça önemlidir. Doğrudan bellek adresleme dışında, genellikle kullanılan protokollere  I²C, SPI, Seri port ve USB  örnek verilebilir.Gömülü sistemlerde kullanım için tasarlanmış iletişim protokolleri InterNiche Technologies ve CMX Systems gibi şikretler tarafından kapalı kaynak yazılım olarak elde edilebilir.Açık kaynak protokoller uIP, lwip vb. diğer protokollerden gelmektedir.Edward A. Lee, "Embedded Software", Advances in Computers (M. Zelkowitz, editor) 56, Academic Press, London, 2002.