Mikrodenetleyiciyle Gömülü Sistem Nasıl Programlanır
Mikrodenetleyici ile gömülü sistem programlamanın temelleri: GPIO, zamanlayıcı, haberleşme, DMA, düşük güç ve RTOS. Öğrenme yolu ve sık yapılan hatalar.
Gömülü sistem programlama neyi kapsar?
Gömülü sistem, belirli bir görevi yerine getirmek için bir cihazın içine yerleştirilmiş küçük bir bilgisayardır. Çamaşır makinesinin kontrol kartı, bir sensör modülü, otomotivdeki bir kontrol birimi ya da endüstriyel bir motor sürücüsü örnek verilebilir. Bu cihazların kalbinde çoğunlukla bir mikrodenetleyici bulunur: işlemci, bellek ve çevre birimlerini bir çipte toplayan bir yapı.
Gömülü programlama, genel amaçlı yazılımdan birkaç yönüyle ayrılır. Kaynaklar kısıtlıdır, yani bellek ve işlem gücü sınırlıdır. Yazılım donanımla doğrudan konuşur; pinler, kayıtlar ve çevre birimleri koddan yönetilir. Zamanlama önemlidir; bir olaya belirli bir süre içinde yanıt vermek doğruluğun parçasıdır. Bu yüzden iyi bir gömülü geliştirici hem C diline hem de donanım belgelerini okumaya hâkim olmalıdır.
ARM Cortex-M ve STM32 ailesi
ARM Cortex-M, mikrodenetleyicilerde yaygın kullanılan işlemci çekirdeği ailesidir. Çekirdeği ARM tasarlar, çipi üreticiler yapar. STM32, STMicroelectronics'in Cortex-M çekirdekli mikrodenetleyici ailesidir; geniş model yelpazesi, kapsamlı belgeleri ve geliştirme kartları sayesinde öğrenmek için sık seçilir.
Çekirdek mimarisini tanımak şu kavramları içerir: • Kesme (interrupt) denetleyicisi ve öncelik düzeni • Bellek haritası: kod, veri ve çevre birimi adresleri • Başlangıç kodu, vektör tablosu ve sistem saati • Kayıtlar ve çevre birimlerinin bellek eşlemeli erişimi
Geliştirme için üreticinin geliştirme ortamı ve kod üretim aracı kullanılabilir. Üretilen kod iskeleti hızlı başlamayı sağlar, ancak arkada ne olduğunu bilmeden kullanmak ilk hatada yön kaybettirir. Bu yüzden bir çevre biriminin kayıt düzeyinde nasıl yapılandırıldığını en az bir kez elle görmek öğreticidir.
Adım adım ilk proje: LED'den sensöre
Başlangıç yolu, her adımda bir yeni çevre birimi ekleyen küçük projelerden geçer. Örneğin bir geliştirme kartıyla şu sırayı izleyebilirsiniz: • Geliştirme ortamını kurup kartı bağlamak, boş bir projeyi derleyip karta yüklemek • Genel amaçlı giriş çıkış pinleriyle (GPIO) bir LED'i yakıp söndürmek, sonra bir düğmeyi okumak • Düğme okumada gürültü sıçramasını (debounce) yazılımla süzmek • Zamanlayıcıyla düzenli aralıklı olay üretmek, darbe genişlik modülasyonuyla LED parlaklığını ya da bir motorun hızını ayarlamak • Analog sayısal çeviriciyle bir sensör gerilimini okumak ve değeri birime çevirmek • Seri haberleşmeyle okunan değeri bilgisayara göndermek
Her adımda önce çevre biriminin kılavuzunu okuyup hangi saatin açılması gerektiğini, hangi pinin hangi işleve bağlandığını doğrulayın. Gömülü hataların büyük bölümü yanlış saat yapılandırması ya da yanlış pin işlevi atamasından çıkar.
Haberleşme çevre birimleri ve DMA
Gerçek cihazlar sensörler, ekranlar, bellek çipleri ve diğer denetleyicilerle konuşur. Bunun için seri haberleşme standartları kullanılır: UART ile basit seri bağlantı, SPI ile hızlı ve çok bağlantılı çevre birimleri, I2C ile az pinle birden fazla cihaz, CAN ile otomotiv ve endüstride dayanıklı ağ iletişimi. Her protokolün hız, mesafe, pin sayısı ve hata denetimi bakımından ödünleşimi vardır; seçim cihazın ihtiyacına göre yapılır.
Veri hacmi arttığında işlemcinin her baytı kendisi taşıması verimsizdir. Doğrudan bellek erişimi (DMA), çevre birimi ile bellek arasında veriyi işlemciyi meşgul etmeden taşır. Örneğin sürekli örneklenen bir sensör verisi DMA ile bir tampona yazılır, işlemci yalnızca tampon dolduğunda uyarılır. DMA'da en sık hata tampon sınırlarını yanlış yönetmek ve işlemci önbelleği ile belleğin tutarsız kalmasıdır.
Düşük güç, hata ayıklama ve ürünleştirme
Pille çalışan cihazlarda enerji tüketimi tasarımın belirleyicisidir. Mikrodenetleyiciler farklı uyku kiplerine sahiptir; işlemci bir olay gelene kadar uyutulur, kesmeyle uyandırılır. Saat hızını düşürmek, kullanılmayan çevre birimlerinin saatini kapatmak ve bekleme döngüleri yerine kesme kullanmak güç tasarrufunun temel yöntemleridir. Tüketimi tahmin etmek yerine ölçmek gerekir.
Hata ayıklamada hata ayıklama probu, kesme noktaları, kayıt ve bellek gözlemi ana araçlardır. Zamanlamaya bağlı hatalar için mantık analizörü ya da osiloskop gibi ölçüm cihazları devreye girer. Koda yerleştirilen kısa yazdırma çağrıları zamanlamayı bozabileceğinden dikkatle kullanılmalıdır.
Ürünleştirme aşamasında bekçi zamanlayıcısı (watchdog), güç kesintisinde güvenli davranış, yazılım güncelleme yolu ve üretim hattında test edilebilirlik gibi konular gündeme gelir. Prototipte çalışan kod, bu önlemler olmadan sahada güvenilir değildir.
Ne zaman gerçek zamanlı işletim sistemi gerekir?
Basit cihazlar bir ana döngü ve kesmelerle yönetilebilir. Cihaz birden fazla bağımsız işi aynı anda yürütmeye başlayınca, örneğin sensör okuma, ağ iletişimi ve ekran güncelleme birlikte çalışınca, ana döngü karmaşıklaşır. Gerçek zamanlı işletim sistemi (RTOS) bu işleri görevlere ayırır ve zamanlayıcı hangi görevin ne zaman çalışacağını önceliğe göre belirler.
RTOS kullanımıyla yeni sorunlar da gelir: görevler arası paylaşılan kaynaklarda yarış durumu, öncelik terslenmesi, kilitlenme ve yığın boyutunun yanlış seçilmesi. Bunlara karşı mutex, semafor ve mesaj kuyruğu gibi araçlar kullanılır; asıl beceri, hangi görevin hangi veriye sahip olacağını baştan tasarlamaktır. FreeRTOS, mikrodenetleyicilerde yaygın kullanılan açık kaynaklı bir RTOS örneğidir. Zamanlama analizi ve ölçümü yapmadan öncelik ataması varsayıma dayanır.
Sık yapılan hatalar
Gömülü programlamaya yeni başlayanlarda tekrar eden hatalar şunlardır: • Veri sayfasını ve başvuru kılavuzunu okumadan örnek kod kopyalamak • Kesme içinde uzun işlem yapmak, kesme ile ana kodun paylaştığı değişkeni korumasız bırakmak • Derleyici eniyilemesinin etkisini hesaba katmamak; döngüde değişmediği sanılan bir değişkenin okunmaması gibi sonuçlar için uygun niteleyiciler gerekir • Yığın ve yığıt (heap) kullanımını izlememek, dinamik bellek ayırmayı sınırsız kullanmak • Elektriksel konuları ihmal etmek: ortak toprak, çekme dirençleri, besleme gürültüsü • Hata ayıklama probu olmadan yalnızca kod okuyarak hata aramak
Kendinize bir kural koyun: her çevre birimi için önce çalışan en küçük örneği yazın, ölçerek doğrulayın, sonra birleştirin. Birleştirilmiş ve doğrulanmamış kod, hatanın kaynağını gizler.
Mindset programlarında gömülü sistem
Mindset'in Mikrodenetleyici Programlama (STM32, ARM Cortex-M) eğitimi şu modülleri içerir: Cortex-M mimarisi ve geliştirme ortamı, saat ağacı, güç ve sistem yapılandırması, GPIO, zamanlayıcı ve analog birimler, haberleşme çevre birimleri, DMA ve yüksek verimli veri akışı, düşük güç, hata ayıklama ve ürünleştirme. Gerçek Zamanlı İşletim Sistemleri (RTOS) ile Geliştirme eğitimi ise gerçek zamanlı sistem kavramları, görev yönetimi, senkronizasyon, görevler arası iletişim, zamanlama analizi ve güvenilirlik konularına odaklanır.
Eğitimler birlikte düşünüldüğünde, çıplak donanım programlamasından görev tabanlı gerçek zamanlı tasarıma uzanan bir sıra oluşur.
İlgili Mindset programı
Mikrodenetleyici Programlama (STM32, ARM Cortex-M)
Sık sorulan sorular
Gömülü sistem programlamaya hangi dille başlanır?
C dili, mikrodenetleyici programlamanın temel dilidir; donanıma yakın çalışır ve çoğu üretici kütüphanesi bu dilde yazılır. C++ daha büyük projelerde kullanılır. Önce işaretçileri, bit işlemlerini ve bellek düzenini iyi anlamak, sonraki her adımı kolaylaştırır.
Arduino ile STM32 arasındaki fark nedir?
Arduino, kolay kullanımı ve hazır kütüphaneleriyle başlangıç için tasarlanmış bir platformdur ve çevre birimi ayrıntılarını gizler. STM32 ise profesyonel ürünlerde kullanılan geniş bir mikrodenetleyici ailesidir; çevre birimlerine kayıt düzeyinde erişim ve daha zengin özellikler sunar. İkisi birbirini dışlamaz, Arduino ile başlayıp STM32'ye geçilebilir.
Gömülü yazılım geliştirmek için elektronik bilgisi gerekir mi?
Temel düzeyde gerekir. Gerilim, akım, direnç, pin yapılandırması ve devre şemasını okuyabilmek yeterli bir başlangıçtır. Yazılım hatalarının bir kısmı aslında kablolama ya da besleme sorunudur; bu yüzden basit bir ölçüm aletini kullanmayı öğrenmek zaman kazandırır.
Geliştirme kartı olmadan öğrenilebilir mi?
Kuramsal kısımlar öğrenilebilir, ancak gömülü programlama donanım üzerinde deneyle pekişir. Bir geliştirme kartı, LED, düğme ve birkaç sensör içeren düşük maliyetli bir set yeterlidir. Simülatörler fikir verir fakat zamanlama ve elektriksel davranışı tam yansıtmaz.
Gömülü yazılımda test nasıl yapılır?
İş mantığı donanımdan ayrı yazılırsa bilgisayarda birim testiyle denenebilir. Donanıma bağlı kısımlar kart üzerinde, ölçüm cihazlarıyla ve hata ayıklama probuyla doğrulanır. Ürünleştirmede üretim hattı için ayrı bir test yazılımı da hazırlanır.