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.
Taşınabilir C Yapısı, SysTick Tabanlı clock(), GPIO Soyutlama, LED Durum Makinesi
Bu derste, donanıma bağlı kalmadan çalışan taşınabilir bir ARM BASE yapısı oluşturulmuştur.
Kod yapısı modüler olarak ayrılmış ve system, io ve main dosyaları üzerinden organize edilmiştir.
SysTick zamanlayıcısı kullanılarak clock() fonksiyonu soyutlanmıştır.
Süre kontrolü donanımdan bağımsız şekilde sağlanmış ve yapı, FreeRTOS gibi sistemlerle uyumlu hale
getirilmiştir.
LED blink uygulaması üzerinden init ve stable fazlarına sahip basit bir durum makinesi örneği
sunulmuştur.
Her bir geçiş, zaman tabanlı mantıkla yönetilmiştir.
GPIO işlemleri, IO_Init, IO_Read ve IO_Write fonksiyonlarıyla soyutlanmıştır.
Tüm pin yapısı s_ios[] dizisi ile kontrol altına alınmış ve yapı farklı platformlara taşınabilir
hale getirilmiştir.
Bu ders, yazılım ve donanım katmanlarının profesyonel seviyede nasıl bir araya getirildiğini
göstermek
ve ARM mimarisine daha sağlam bir bakış kazandırmak amacıyla hazırlanmıştır.
HD44780 Uyumlu Ekran Kontrolü, Printf Redirection, 4-bit Paralel İletişim
Bu projede STM32F411 platformu için optimize edilmiş karakter LCD sürücü kütüphanesi
geliştirilmiştir. HD44780/ST7066U uyumlu kontrol çipleri ile 4-bit paralel haberleşme
protokolü kullanılarak verimli kaynak kullanımı sağlanmıştır.
IAR Embedded Workbench'in __write weak fonksiyonu override edilerek printf() fonksiyonları
doğrudan LCD'ye yönlendirilmiştir. Bu sayede UART/Serial port konfigürasyonuna gerek kalmadan
debug çıktıları görsel olarak LCD üzerinde takip edilebilmektedir.
Gelişmiş format kontrol motoru ile terminal emülasyonu sağlanmış; escape sequence işleme,
satır başı kontrolü ve ekran temizleme komutları implementasyona dahil edilmiştir.
Non-blocking state machine tabanlı LED kontrolü ile real-time performans gösterilmiştir.
Donanım abstraksiyon katmanı sayesinde port/pin mapping table ile platform bağımsızlığı
kazanılmış; SysTick entegrasyonu ile ARM Cortex-M4 zamanlayıcısından 1ms hassasiyetinde
timing logic sağlanmıştır.
Profesyonel UART Protokolü, Multi-Port Desteği, Real-time Veri İletişimi
Bu projede STM32F411 mikrodenetleyicisi üzerinde profesyonel seviyede UART iletişim sistemi
geliştirilmiştir. Çoklu UART port desteği ile full-duplex asenkron veri iletişimi sağlanmaktadır.
Donanım seviyesinde UART1, UART2, UART3 ve UART4 portları desteklenmekte; yapılandırılabilir
baud rate seçenekleri ile esnek iletişim altyapısı sunulmaktadır. 8N1 veri formatı ve
comprehensive hata kontrolü ile güvenilir veri transferi gerçekleştirilmektedir.
Polling tabanlı non-blocking operasyonlar ile gerçek zamanlı veri kontrolü yapılmakta;
overrun, framing ve noise error detection sistemleri entegre edilmiştir. Terminal emülasyonu
için karakter bazlı send/receive API'ları geliştirilmiştir.
Modüler tasarım sayesinde kolay entegrasyon sağlanmış ve multi-tasking yapılar ile
uyumlu çalışacak şekilde optimize edilmiştir. GPIO abstraksiyon katmanı üzerinden
pin konfigürasyonları yönetilmektedir.
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.