Gömülü Sistemlere Giriş: ARM Mimarisi ve Bu Notların Kaynağı
Hazırlanan bu not serisi, gömülü sistemler alanında bireysel öğrenme sürecini yapılandırmak ve
dokümante etmek amacıyla oluşturulmuştur. Odak noktası, ARM mimarisi temelinde geliştirilen
STM32 mikrodenetleyici ailesidir. Bu mimarinin seçilme nedeni, hem akademik hem de endüstriyel
alanda yaygınlığı ve güçlü ekosistemidir.
C Sistem ve Programcıları Derneği tarafından sunulan ARM Mikrodenetleyici
Kursu, bu çalışmanın temel referans kaynağını oluşturmaktadır. Eğitmen
Gürbüz Aslan tarafından sunulan sistematik anlatım, teorik altyapının yanı sıra
uygulamalı bilgilerin de kazanılmasına olanak tanımıştır.
Bu içerikler, ARM Cortex-M çekirdeği ve çevresel donanımlar üzerine yapılan uygulamalı
çalışmalarla zenginleştirilmiş; STM32 serisi ile entegre kullanıma yönelik yapılandırılmıştır.
Hem giriş seviyesindeki kullanıcılar hem de ileri düzey geliştiriciler için kademeli bir yol
haritası sunulmaktadır.
Ders içerikleri sırasıyla şunlardır:
ARM mimarisine giriş ve çekirdek yapısı
Çevresel birimlerin kullanımı (GPIO, Timer, ADC, USART, DMA)
C dili ile donanım seviyesinde kod geliştirme
IDE ve proje geliştirme araçlarının kullanımı
HAL, LL ve doğrudan register erişimi üzerine yazılım katmanları
Gerçek zamanlı sistemler ve kesme yönetimi
Tüm ders içerikleri uygulamaya dayalı olarak sunulmuştur.
Takip eden notlar, en güncelden en eskiye doğru sıralanarak düzenli bir şekilde sunulmaktadır.
Bu içerikte, ARM tabanlı gömülü sistemlerde kullanılan yazılım mimarisi, katmanlı yapıların
avantajları ve donanım-software etkileşiminde dikkat edilmesi gereken temel prensipler
açıklanmaktadır.
Katmanlı mimarinin donanım değişimine karşı sağladığı taşınabilirlik, okunabilirlik ve test
kolaylığı detaylandırılmış; CMSIS, HAL, Upper-Low Driver gibi yazılım bileşenlerinin görevleri net
biçimde aktarılmıştır.
Weak fonksiyon yapısı, özellikle interrupt handler'lar gibi kullanıcı tarafından override edilebilir
işlevlerde nasıl kullanıldığı örneklenmiş; `__WEAK` kavramının amacı ve sistemi nasıl esnek kıldığı
açıklanmıştır.
Donanım tarafında CMOS mantığı, tristate buffer, High-Z kavramları, TTL ve Schmidt-Trigger lojik
yapı farkları üzerinden kararlı sistem tasarımının temelleri aktarılmıştır.
Bu ders, hem yazılım hem donanım katmanlarının profesyonel seviyede nasıl bir araya geldiğini
anlamak ve ARM mimarisine daha sağlam bakış kazanmak için hazırlanmıştır.
Bu derste mikrodenetleyici sistemlerinde kullanılan çok görevli yapıların temel prensipleri
anlatılmıştır. Cooperative (işbirlikçi) ve Preemptive (öncelikli) multitasking yapılarına dair
farklar, kullanım alanları ve avantaj-dezavantajları karşılaştırılmıştır.
Finite State Machine (FSM) yapısı, cooperative multitasking içinde görevlerin duruma bağlı yönetimi
için açıklanmış; kod örnekleriyle sade bir yapı sunulmuştur. FSM, küçük sistemlerde zaman kontrolü
ve görev yönetimini basitleştirir.
Prosesler arası haberleşme (IPC) yöntemleri; bayraklar, kuyruklar, semaphore ve mutex yapıları
üzerinden özetlenmiş, görevler arası veri paylaşımı ve senkronizasyon ihtiyacı temel seviyede
açıklanmıştır.
Ders sonunda multitasking türlerinin karşılaştırması, kullanım senaryoları ve küçük sistemlerde
nasıl kurulduğu özetlenmiştir. Özellikle cooperative yapı + FSM + zaman fonksiyonlarının düşük
kaynak sistemleri için ideal olduğu vurgulanmıştır.
Dokuzuncu derste gömülü sistemlerde yazılımın donanım üzerinde çalışabilir hale gelmesini
sağlayan temel süreçler teknik düzeyde ele alınmaktadır. Derleyici tarafından oluşturulan `.o`
uzantılı nesne dosyalarının, linkleme süreciyle `.hex` veya `.elf` formatlarına dönüştürülmesi;
bu işlemlerin neden ayrı adımlarla yapıldığı, object code’un tek başına neden yeterli olmadığı
detaylandırılmaktadır.
Ayrıca startup assembly dosyalarında kullanılan `PUBWEAK` ifadesi üzerinden zayıf sembol tanımı
kavramı açıklanmakta; kullanıcı tanımı yapılmadığında default fonksiyonların çalışması gibi
sistematikler anlatılmaktadır. Bu yapıların IRQ handler gibi kritik işlevlerde nasıl
kullanıldığı örneklenmiştir.
Load/Store mimarisi, ARM işlemcilerinin bellekle yalnızca `LDR` ve `STR` komutlarıyla etkileşim
kurmasını sağlayan mimari yapı olarak işlenmektedir. Doğrudan bellekten işlem yapılmamasının
sebebi, sistem tasarımı ve performans açısından değerlendirilmiştir.
Dersin son bölümünde PLL yapısı detaylı biçimde açıklanmakta; M, N ve P parametrelerinin sistem
saatine etkisi üzerinden örneklemelerle gösterilmektedir. SYSCLK’in güvenli aralıkta kalması ve
giriş/çıkış frekanslarının neden kritik olduğu teknik düzeyde ele alınmaktadır.
Sekizinci derste, Tri-State buffer yapısının mantığı, High-Z (yüksek empedans) kavramı ve ARM
mikrodenetleyicilerde bu yapıların nasıl uygulandığı ele alınmaktadır. Veri yolunun paylaşımı,
open-drain modları ve floating girişlerin donanım seviyesinde nasıl kontrol edildiği örneklerle
açıklanmaktadır.
Ayrıca çevresel birimlere clock verilme mantığı teknik olarak ele alınmakta; güç tüketimi, sistem
kontrolü ve RCC yapılandırmaları ile ilişkisi detaylandırılmaktadır. CMSIS tabanlı konfigürasyon
sistematiği, hedef işlemcinin tanımlanması, başlık dosyalarının dahil edilmesi ve build ayarları
üzerinden doğru derleme süreci anlatılmaktadır.
Son olarak, `Run to main()` debug ayarının etkileri, `Reset_Handler`, `SystemInit`, .data/.bss
segmentleri, libc init ve main() çağrısı gibi sistem başlangıç aşamaları teknik düzeyde
aktarılmakta, CMSIS-mimarili sistem açılış süreci açıklanmaktadır.
Yedinci haftada, ARM Cortex-M mimarisine özgü bit-banding tekniği ele alınmakta; atomik bit
manipülasyonu gereksinimleri bağlamında kullanım gerekçeleri açıklanmaktadır. Bit-banding'in kesme
güvenliği ve kod basitliği üzerindeki etkisi örneklerle sunulmaktadır.
CMSIS standardı ile birlikte donanım erişiminin nasıl sadeleştirildiği, yazılım katmanlarının (ASM,
CMSIS, LL, HAL, BSP, Application) sistematik olarak nasıl inşa edildiği anlatılmaktadır.
Donanım-soyutlama katmanlarının rolü üzerinden taşınabilir ve sürdürülebilir gömülü yazılım
mimarilerinin temelleri aktarılmaktadır.
22 yaşındayım. Gömülü sistemler, mikrodenetleyiciler ve düşük seviyeli yazılım geliştirme alanında
çalışıyorum. Sürekli öğrenen, detaycı ve üretmeye odaklı bir mühendis adayıyım.