/* embeddedTR — blog içeriği ─────────────────────────────────────────────────────────────────────────── YENİ YAZI EKLEMEK İÇİN: aşağıdaki POSTS dizisine yeni bir nesne ekle. - slug : URL'de görünen kısa ad (boşluksuz, küçük harf). post.html?p=SLUG - title : yazı başlığı - author : yazar adı - date : YYYY-MM-DD (otomatik Türkçe tarihe çevrilir) - category : etiket (Protokoller, Tarih, Linux ...) - cover : kapak görseli yolu, ör "blog/images/spi.jpg" (görsel yoksa otomatik şık bir yer tutucu çizilir) - excerpt : liste sayfasındaki kısa özet - read : okuma süresi, ör "7 dk" - body : içerik blokları (aşağıdaki tiplere bak) BLOK TİPLERİ (body içinde): { t:"h", x:"Alt başlık" } { t:"p", x:"Paragraf metni. **kalın** ve `kod` desteklenir." } { t:"img", src:"blog/images/x.jpg", cap:"Görsel açıklaması" } { t:"code",lang:"c", x:"kod satırları\nburaya" } { t:"ul", x:["madde bir","madde iki"] } { t:"ol", x:["adım bir","adım iki"] } { t:"quote",x:"Vurgulanacak alıntı." } { t:"table",head:["A","B"], rows:[["1","2"],["3","4"]] } ─────────────────────────────────────────────────────────────────────────── */ const POSTS = [ /* ───────────────────────── SPI ───────────────────────── */ { slug: "spi-protokolu-nedir", title: "SPI Protokolü Nedir? Sıfırdan Çalışma Mantığı", author: "İbrahim Işıklı", date: "2026-06-18", category: "Protokoller", cover: "blog/images/spi.jpg", read: "7 dk", excerpt: "Dört hatlı, tam çift yönlü ve hızlı: SPI haberleşmesinin pin yapısı, saat modları (CPOL/CPHA) ve gerçek kullanım senaryoları.", body: [ { t: "p", x: "**SPI (Serial Peripheral Interface)**, gömülü sistemlerde bir mikrodenetleyici ile çevre birimleri (sensör, hafıza, ekran, ADC) arasında yüksek hızlı veri alışverişi için kullanılan senkron ve seri bir haberleşme protokolüdür. 1980'lerde Motorola tarafından tanımlanmıştır ve bugün neredeyse her MCU'da donanımsal olarak bulunur." }, { t: "h", x: "Dört temel hat" }, { t: "p", x: "SPI, bir **master** (genellikle MCU) ve bir ya da daha fazla **slave** (çevre birim) arasında çalışır. Tipik olarak dört hat kullanılır:" }, { t: "ul", x: [ "**SCLK** — Serial Clock: Master'ın ürettiği saat sinyali. Tüm veri bu saate göre senkron taşınır.", "**MOSI** — Master Out, Slave In: Master'dan slave'e giden veri hattı.", "**MISO** — Master In, Slave Out: Slave'den master'a dönen veri hattı.", "**CS / SS** — Chip Select: Hangi slave ile konuşulacağını seçen hat (genelde aktif-düşük)." ] }, { t: "p", x: "MOSI ve MISO aynı anda çalıştığı için SPI **tam çift yönlüdür (full-duplex)**: aynı saat darbesinde hem veri gönderir hem alırsın. Bu, onu UART ve I²C'den belirgin biçimde hızlı kılar." }, { t: "img", src: "blog/images/spi-baglanti.jpg", cap: "Bir master ve tek slave için tipik SPI bağlantı şeması" }, { t: "h", x: "Saat modları: CPOL ve CPHA" }, { t: "p", x: "SPI'da en çok kafa karıştıran konu **saat polaritesi (CPOL)** ve **saat fazıdır (CPHA)**. Bu iki bit dört farklı mod oluşturur ve master ile slave'in aynı modda olması şarttır — yoksa veri kayar." }, { t: "table", head: ["Mod", "CPOL", "CPHA", "Verinin örneklendiği kenar"], rows: [ ["0", "0", "0", "Yükselen kenar"], ["1", "0", "1", "Düşen kenar"], ["2", "1", "0", "Düşen kenar"], ["3", "1", "1", "Yükselen kenar"] ] }, { t: "p", x: "Sensörün veri sayfasında (datasheet) hangi modu istediği mutlaka yazar. Çoğu cihaz **Mod 0** kullanır." }, { t: "h", x: "Basit bir HAL örneği (STM32)" }, { t: "code", lang: "c", x: "// Tek byte gönder, gelen byte'ı oku (full-duplex)\nuint8_t tx = 0x9F; // örn. flash JEDEC ID komutu\nuint8_t rx = 0x00;\n\nHAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_RESET); // slave seç\nHAL_SPI_TransmitReceive(&hspi1, &tx, &rx, 1, HAL_MAX_DELAY);\nHAL_GPIO_WritePin(CS_GPIO_Port, CS_Pin, GPIO_PIN_SET); // bırak" }, { t: "h", x: "Ne zaman SPI seçilir?" }, { t: "ul", x: [ "Yüksek veri hızı gerektiğinde (ekranlar, SD kart, harici flash — onlarca MHz'e çıkabilir).", "Master ve slave arası mesafe kısa ve kart üstüyse.", "Çok sayıda çevre birim yoksa (her slave için ayrı CS hattı gerekir)." ] }, { t: "quote", x: "Kural: az sayıda hızlı cihaz varsa SPI; çok sayıda yavaş cihaz varsa I²C düşün." } ] }, /* ───────────────────────── UART ───────────────────────── */ { slug: "uart-protokolu-nedir", title: "UART Protokolü Nedir? Asenkron Haberleşmenin Temeli", author: "İbrahim Işıklı", date: "2026-06-15", category: "Protokoller", cover: "blog/images/uart.jpg", read: "6 dk", excerpt: "Saat hattı olmadan iki tel ile haberleşme: baud rate, start/stop bitleri ve UART'ın neden hâlâ her yerde olduğu.", body: [ { t: "p", x: "**UART (Universal Asynchronous Receiver / Transmitter)** bir protokolden çok bir donanım bloğudur. Adındaki **asenkron** kelimesi anahtardır: SPI ve I²C'nin aksine UART'ta **saat hattı yoktur**. İki taraf, önceden anlaştıkları bir hıza (baud rate) güvenerek haberleşir." }, { t: "h", x: "Sadece iki hat" }, { t: "ul", x: [ "**TX** — Transmit: Veri gönderen hat.", "**RX** — Receive: Veri alan hat.", "İki cihaz arasında bağlantı **çapraz** yapılır: A'nın TX'i B'nin RX'ine, A'nın RX'i B'nin TX'ine gider." ] }, { t: "p", x: "Saat hattı olmadığı için alıcı, gelen biti ne zaman örnekleyeceğini baud rate'ten hesaplar. Bu yüzden iki tarafın baud rate'i (ör. **115200**) birebir aynı olmalıdır." }, { t: "img", src: "blog/images/uart-frame.jpg", cap: "Bir UART veri çerçevesi: start biti, 8 veri biti ve stop biti" }, { t: "h", x: "Bir çerçevenin (frame) anatomisi" }, { t: "p", x: "Hat boştayken yüksek (1) seviyededir. Veri gönderimi şöyle ilerler:" }, { t: "ol", x: [ "**Start biti:** Hat 0'a çekilir — alıcıya \"veri geliyor\" der.", "**Veri bitleri:** Genelde 8 bit, LSB (en düşük anlamlı bit) önce.", "**Parity biti (opsiyonel):** Basit hata kontrolü için.", "**Stop biti:** Hat tekrar 1'e çekilir — çerçeve biter." ] }, { t: "code", lang: "c", x: "// STM32 HAL ile bir string gönder\nchar msg[] = \"embeddedTR\\r\\n\";\nHAL_UART_Transmit(&huart2, (uint8_t*)msg, sizeof(msg)-1, HAL_MAX_DELAY);\n\n// Tek byte oku (bloklayan)\nuint8_t b;\nHAL_UART_Receive(&huart2, &b, 1, HAL_MAX_DELAY);" }, { t: "h", x: "Neden hâlâ her yerde?" }, { t: "p", x: "UART yavaştır ama **basittir ve hata ayıklaması kolaydır**. Bir `printf` çıktısını bilgisayara göndermek, GPS/GSM modülleriyle konuşmak veya iki kart arasında basit komut alışverişi için ideal seçimdir. `USB-TTL` dönüştürücüyle doğrudan terminalden okunabilir olması, onu geliştiricinin ilk silahı yapar." }, { t: "quote", x: "Bir karta hayat verirken ilk iş çoğu zaman UART'tan bir 'Merhaba' yazdırmaktır." } ] }, /* ───────────────────────── CAN BUS ───────────────────────── */ { slug: "can-bus-nedir", title: "CAN Bus Nedir? Otomotivin Sinir Sistemi", author: "İbrahim Işıklı", date: "2026-06-10", category: "Protokoller", cover: "blog/images/canbus.jpg", read: "9 dk", excerpt: "Araçlardaki onlarca ECU'yu iki tel üzerinden buluşturan, gürültüye dayanıklı ve önceliklendirilmiş bir veri yolu: CAN.", body: [ { t: "p", x: "**CAN (Controller Area Network)**, 1980'lerde Bosch tarafından otomobiller için geliştirilen, çok-master'lı ve son derece gürültüye dayanıklı bir seri veri yoludur. Bir aracın içindeki motor kontrol ünitesi, ABS, klima, gösterge paneli gibi onlarca **ECU** (Electronic Control Unit), tek bir CAN hattı üzerinden konuşur." }, { t: "h", x: "İki tel, fark sinyali" }, { t: "p", x: "CAN yalnızca iki hat kullanır: **CAN_H** ve **CAN_L**. Veri, bu iki hat arasındaki **gerilim farkıyla** taşınır (differential signaling). Bu yöntem, motor bölmesi gibi elektriksel gürültünün yoğun olduğu ortamlarda bile sinyali sağlam tutar — her iki hatta da binen gürültü farkta sönümlenir." }, { t: "p", x: "Hattın iki ucuna **120 Ω**'luk sonlandırma dirençleri konur; bu, yansımaları önler ve hattın toplam empedansını 60 Ω'a düşürür." }, { t: "img", src: "blog/images/can-topology.jpg", cap: "Çoklu ECU'nun ortak hatta bağlandığı CAN bus topolojisi" }, { t: "h", x: "Adres değil, mesaj kimliği" }, { t: "p", x: "CAN'in en zarif yanı şudur: mesajların **hedef adresi yoktur**. Bunun yerine her mesajın bir **ID**'si (kimliği) vardır ve hatta yayınlanır. Her ECU, ilgilendiği ID'leri dinler, gerisini görmezden gelir. Bu, sisteme yeni cihaz eklemeyi kolaylaştırır." }, { t: "h", x: "Önceliklendirme: arbitrasyon" }, { t: "p", x: "Birden fazla ECU aynı anda konuşmak isterse ne olur? CAN bunu **arbitrasyon** ile çözer. Düşük ID değerine sahip mesaj daha yüksek önceliklidir. İki düğüm aynı anda gönderirken hattı dinler; kendi gönderdiğinden farklı bir bit görürse susar. Böylece çarpışma olmadan en yüksek öncelikli mesaj kazanır — fren sinyali, klima sinyalini her zaman ezer." }, { t: "table", head: ["Özellik", "Değer"], rows: [ ["Hız (klasik CAN)", "1 Mbit/s'e kadar"], ["Hız (CAN FD)", "8 Mbit/s'e kadar"], ["Hat", "CAN_H + CAN_L (twisted pair)"], ["Sonlandırma", "Her uçta 120 Ω"], ["Topoloji", "Hat (bus), çok-master"] ] }, { t: "h", x: "Nerede kullanılır?" }, { t: "ul", x: [ "Otomotiv: motor, şanzıman, ABS, airbag, gösterge.", "Endüstriyel otomasyon ve robotik (CANopen).", "Tıbbi cihazlar, asansörler, tarım makineleri." ] }, { t: "quote", x: "CAN, 'kim konuşuyor' değil 'ne söyleniyor' sorusuna odaklanır — bu felsefe onu 40 yıldır ayakta tutuyor." } ] }, /* ───────────────────────── ST MICROELECTRONICS ───────────────────────── */ { slug: "stmicroelectronics-kokeni", title: "STMicroelectronics'in Kökeni: İki Devlet Şirketinin Birleşmesi", author: "İbrahim Işıklı", date: "2026-06-05", category: "Tarih", cover: "blog/images/st.jpg", read: "8 dk", excerpt: "STM32'nin arkasındaki dev nasıl doğdu? İtalyan SGS ile Fransız Thomson'ın 1987'deki tarihi birleşmesinin hikâyesi.", body: [ { t: "p", x: "Bugün **STM32** denince akla gömülü sistemlerin en sevilen mikrodenetleyici ailesi gelir. Peki bu çiplerin arkasındaki **STMicroelectronics** nasıl ortaya çıktı? Hikâye, iki Avrupalı yarı iletken şirketinin 1987'deki birleşmesine dayanır." }, { t: "h", x: "İki kök: SGS ve Thomson" }, { t: "p", x: "Şirketin İtalyan ayağı **SGS Microelettronica**, kökleri 1957'ye uzanan ve İtalya'nın yarı iletken sanayisinin temelini atan bir kuruluştu. Fransız ayağı ise **Thomson Semiconducteurs**, Fransız elektronik devi Thomson'ın çip bölümüydü." }, { t: "p", x: "**1987**'de bu iki şirket birleşerek **SGS-Thomson Microelectronics**'i kurdu. Bu, o dönem Avrupa'nın yarı iletken alanında küresel oyuncularla (özellikle ABD ve Japonya) rekabet edebilmek için attığı stratejik bir adımdı. İki devlet destekli şirketin birleşmesi, ölçek ekonomisi ve Ar-Ge gücü sağladı." }, { t: "img", src: "blog/images/st-logo.jpg", cap: "SGS-Thomson, 1998'de bugünkü STMicroelectronics adını aldı" }, { t: "h", x: "İsim değişikliği ve halka arz" }, { t: "p", x: "1994'te şirket borsaya açıldı. **1998**'de Thomson hisselerini elden çıkardıktan sonra şirket bugün bildiğimiz adı aldı: **STMicroelectronics** (kısaca **ST**). Merkezi İsviçre'nin Cenevre kentindedir ve şirket hâlâ kısmen Fransız ve İtalyan devletlerinin elinde olan ortaklık yapısını korur." }, { t: "h", x: "STM32 devrimi" }, { t: "p", x: "ST'nin gömülü dünyasındaki asıl çıkışı **2007**'de, **ARM Cortex-M3** çekirdeğini kullanan ilk **STM32** ailesini duyurmasıyla geldi. Güçlü çevre birimleri, uygun fiyatı ve **STM32CubeMX / HAL** gibi geliştirme araçlarıyla STM32, kısa sürede hobiciden endüstriye kadar herkesin standart tercihi hâline geldi." }, { t: "table", head: ["Yıl", "Olay"], rows: [ ["1957", "SGS'nin kökeninin atılması (İtalya)"], ["1987", "SGS + Thomson birleşmesi → SGS-Thomson"], ["1994", "Borsaya açılma"], ["1998", "İsim: STMicroelectronics"], ["2007", "İlk STM32 ailesi (Cortex-M3)"] ] }, { t: "quote", x: "STM32'nin başarısı sadece silikonda değil; ekosistemde — araçlar, kütüphaneler ve topluluk desteğindeydi." } ] }, /* ───────────────────────── TEXAS INSTRUMENTS ───────────────────────── */ { slug: "texas-instruments-kokeni", title: "Texas Instruments'in Kökeni: Petrolden Entegre Devreye", author: "İbrahim Işıklı", date: "2026-05-28", category: "Tarih", cover: "blog/images/ti.jpg", read: "8 dk", excerpt: "Bir jeofizik şirketinden mikroçip devine: TI'nin hikâyesi ve entegre devreyi icat eden mühendis Jack Kilby.", body: [ { t: "p", x: "**Texas Instruments (TI)**, TMS320 DSP'lerinden MSP430 mikrodenetleyicilerine, güç yönetimi çiplerinden hesap makinelerine kadar geniş bir yelpazede üretim yapan köklü bir Amerikan yarı iletken şirketidir. Ama başlangıcı çiple değil, **petrol arama** ile ilgiliydi." }, { t: "h", x: "Jeofizikle başlayan yolculuk" }, { t: "p", x: "Şirketin kökü, 1930'da kurulan **Geophysical Service Incorporated (GSI)**'a dayanır. GSI, sismik yöntemlerle yer altındaki petrol yataklarını tespit eden bir hizmet şirketiydi. İkinci Dünya Savaşı sırasında bu sismik teknolojiyi denizaltı tespiti gibi askeri elektronik alanına taşıdılar." }, { t: "p", x: "**1951**'de şirket yeniden yapılandı ve adını **Texas Instruments** olarak değiştirdi. Elektronik, artık jeofizik hizmetin yanında ana iş kolu hâline geliyordu." }, { t: "img", src: "blog/images/ti-kilby.jpg", cap: "Jack Kilby'nin 1958'deki ilk entegre devre prototipi" }, { t: "h", x: "Tarihi an: entegre devrenin icadı" }, { t: "p", x: "TI'yi tarihe yazan olay **1958**'de gerçekleşti. Şirketin mühendisi **Jack Kilby**, tüm devre elemanlarını (transistör, direnç, kapasitör) tek bir yarı iletken parça üzerinde birleştiren ilk çalışan **entegre devreyi (IC)** üretti. Bu buluş modern elektroniğin temelini attı ve Kilby'ye **2000 yılında Nobel Fizik Ödülü** kazandırdı." }, { t: "p", x: "TI ayrıca 1954'te ilk ticari **silisyum transistörü** üretti ve aynı yıl ilk transistörlü cep radyosunun (Regency TR-1) çiplerini sağladı — yarı iletkeni tüketici elektroniğine taşıyan dönüm noktalarından biri." }, { t: "h", x: "Gömülü dünyaya etkisi" }, { t: "p", x: "TI bugün gömülü mühendisler için özellikle iki ürün ailesiyle tanınır:" }, { t: "ul", x: [ "**TMS320 (C2000 dahil):** Sayısal sinyal işleme ve gerçek zamanlı kontrol — motor sürücüleri, güç elektroniği ve inverterlerde standart.", "**MSP430:** Ultra düşük güç tüketimiyle pille çalışan ölçüm cihazlarının favorisi." ] }, { t: "table", head: ["Yıl", "Olay"], rows: [ ["1930", "GSI kurulur (petrol arama)"], ["1951", "Texas Instruments adını alır"], ["1954", "İlk ticari silisyum transistör"], ["1958", "Jack Kilby — ilk entegre devre"], ["2000", "Kilby'ye Nobel Fizik Ödülü"] ] }, { t: "quote", x: "Bir petrol arama şirketinin mühendisi, tüm dijital çağı tek bir silikon parçasına sığdırdı." } ] }, /* ───────────────────────── I2C ───────────────────────── */ { slug: "i2c-protokolu-nedir", title: "I²C Protokolü Nedir? İki Telle Çok Cihaz", author: "İbrahim Işıklı", date: "2026-05-20", category: "Protokoller", cover: "blog/images/i2c.jpg", read: "7 dk", excerpt: "Tek bir veri ve tek bir saat hattı üzerinden onlarca cihaz: adresleme, ACK/NACK ve pull-up dirençlerinin önemi.", body: [ { t: "p", x: "**I²C (Inter-Integrated Circuit)**, Philips (bugün NXP) tarafından geliştirilen, yalnızca **iki hat** kullanarak aynı yol üzerinde çok sayıda cihazı haberleştiren senkron bir protokoldür. Sensörler, EEPROM'lar ve RTC modülleri en yaygın kullanım alanlarıdır." }, { t: "h", x: "İki hat: SDA ve SCL" }, { t: "ul", x: [ "**SDA** — Serial Data: Çift yönlü veri hattı.", "**SCL** — Serial Clock: Master'ın ürettiği saat hattı.", "Her iki hat da **açık-drain**'dir ve hatta birer **pull-up direnci** (tipik 4.7 kΩ) gerektirir." ] }, { t: "p", x: "Pull-up dirençleri olmadan hat asla yüksek (1) seviyeye çıkamaz — bu, yeni başlayanların en sık yaptığı donanım hatasıdır." }, { t: "h", x: "Adresleme" }, { t: "p", x: "SPI'daki gibi ayrı CS hattı yoktur. Bunun yerine her cihazın **7-bit (ya da 10-bit) bir adresi** vardır. Master, konuşmak istediği cihazın adresini hatta yayınlar; sadece o adresteki slave yanıt verir. Bu sayede iki telle teorik olarak 100'den fazla cihaz aynı yola bağlanabilir." }, { t: "h", x: "ACK / NACK mekanizması" }, { t: "p", x: "Her gönderilen byte'tan sonra alıcı, hattı bir saat darbesi boyunca 0'a çekerek **ACK (onay)** verir. Onay gelmezse (**NACK**) master, cihazın yanıt vermediğini ya da iletişimin bittiğini anlar." }, { t: "table", head: ["Özellik", "I²C", "SPI"], rows: [ ["Hat sayısı", "2", "4+"], ["Hız", "Orta (100k–3.4M)", "Yüksek (onlarca MHz)"], ["Cihaz seçimi", "Adres", "CS hattı"], ["Çift yönlü", "Half-duplex", "Full-duplex"] ] }, { t: "quote", x: "Çok sayıda yavaş sensörü az telle toplamak istiyorsan I²C senin dostundur." } ] }, /* ───────────────────────── EMBEDDED LINUX ───────────────────────── */ { slug: "embedded-linux-nedir", title: "Embedded Linux Nedir? Mikrodenetleyiciden İşletim Sistemine", author: "İbrahim Işıklı", date: "2026-05-12", category: "Linux", cover: "blog/images/embedded-linux.jpg", read: "10 dk", excerpt: "Bare-metal'in ötesi: bootloader, kernel, root filesystem ve gömülü cihazlarda neden Linux çalıştırdığımız.", body: [ { t: "p", x: "Bir STM32 üzerinde **bare-metal** (işletim sistemsiz) kod yazmaya alışkınsan, **Embedded Linux** bambaşka bir dünyadır. Burada artık doğrudan donanımı sürmezsin; **Linux çekirdeği (kernel)** üzerinde, dosya sistemi ve süreç yönetimi olan tam bir işletim sistemiyle çalışırsın." }, { t: "h", x: "Neden Linux?" }, { t: "ul", x: [ "Ağ (Ethernet/Wi-Fi), USB, ekran gibi karmaşık yığınlar hazır gelir.", "Çoklu görev, dosya sistemi, kullanıcı/süreç yönetimi işletim sistemine devredilir.", "Python, C++, web sunucusu gibi zengin bir yazılım ekosistemi kullanılabilir." ] }, { t: "p", x: "Bunun karşılığında daha güçlü bir işlemci (genelde **Cortex-A** çekirdekli SoC) ve **MMU** (bellek yönetim birimi) ile **harici RAM** gerekir. Bu yüzden Raspberry Pi, BeagleBone ve i.MX tabanlı kartlarda görülür; küçük bir Cortex-M0'da çalışmaz." }, { t: "h", x: "Bir gömülü Linux sisteminin katmanları" }, { t: "ol", x: [ "**Bootloader (örn. U-Boot):** Donanımı başlatır ve çekirdeği belleğe yükler.", "**Kernel (Linux):** Donanımı yönetir, sürücüleri ve süreçleri çalıştırır.", "**Device Tree:** Çekirdeğe donanımın nasıl bağlandığını anlatan tanım dosyası.", "**Root Filesystem:** Uygulamaların, kütüphanelerin ve ayarların bulunduğu dosya sistemi." ] }, { t: "h", x: "Yapılandırma araçları" }, { t: "p", x: "Kendi gömülü Linux dağıtımını oluşturmak için iki popüler araç vardır: hızlı ve sade **Buildroot**, ve daha esnek ama dik öğrenme eğrili **Yocto Project**. İkisi de bootloader + kernel + rootfs'i tek bir imaja paketler." }, { t: "code", lang: "bash", x: "# Çalışan bir gömülü Linux'ta tipik komutlar\ncat /proc/cpuinfo # işlemci bilgisi\ndmesg | grep -i error # çekirdek günlükleri\nls /dev/ # cihaz dosyaları (i2c, spi, gpio...)" }, { t: "quote", x: "Bare-metal donanıma hükmetmektir; embedded Linux ise donanımı bir işletim sistemine emanet etmektir." } ] }, /* ───────────────────────── FREERTOS / RTOS ───────────────────────── */ { slug: "rtos-nedir", title: "RTOS Nedir? Gerçek Zamanlı İşletim Sistemine Giriş", author: "İbrahim Işıklı", date: "2026-05-04", category: "Donanım", cover: "blog/images/rtos.jpg", read: "8 dk", excerpt: "Bare-metal süper döngüden çok görevli yapıya: task, scheduler, öncelik ve neden 'gerçek zamanlı' dediğimiz.", body: [ { t: "p", x: "**RTOS (Real-Time Operating System)**, mikrodenetleyiciler üzerinde birden fazla işi (task) eşzamanlı yürütmeyi ve bunu **öngörülebilir zamanlama** ile yapmayı sağlayan küçük bir çekirdektir. Gömülü dünyada en yaygını **FreeRTOS**'tur." }, { t: "h", x: "Süper döngünün sınırı" }, { t: "p", x: "Basit projeler `while(1)` içinde her işi sırayla yapar. Ama işler arttıkça ve bazıları 'tam zamanında' çalışmak zorunda kaldıkça bu yapı tıkanır. RTOS, her işi ayrı bir **task** hâline getirir ve aralarında geçişi kendisi yönetir." }, { t: "h", x: "Temel kavramlar" }, { t: "ul", x: [ "**Task:** Kendi yığını (stack) olan bağımsız bir iş parçacığı.", "**Scheduler:** Hangi task'ın ne zaman çalışacağına karar veren zamanlayıcı.", "**Öncelik (priority):** Yüksek öncelikli task, düşüğü bekletip öne geçebilir.", "**Senkronizasyon:** Semaphore, mutex ve queue ile task'lar güvenli haberleşir." ] }, { t: "p", x: "'Gerçek zamanlı' demek 'çok hızlı' demek değildir; **zamanında ve öngörülebilir** demektir. Bir airbag tetikleyicisi her zaman milisaniyeler içinde yanıt vermelidir — RTOS bu garantiyi sağlar." }, { t: "code", lang: "c", x: "// FreeRTOS ile bir task oluştur\nvoid blinkTask(void *p) {\n for (;;) {\n HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);\n vTaskDelay(pdMS_TO_TICKS(500)); // 500 ms uyu, CPU'yu bırak\n }\n}\nxTaskCreate(blinkTask, \"blink\", 128, NULL, 1, NULL);" }, { t: "quote", x: "RTOS, CPU zamanını işler arasında adil ve zamanında paylaştıran görünmez bir trafik polisidir." } ] }, /* ───────────────────────── GPIO & KESMELER ───────────────────────── */ { slug: "gpio-ve-kesmeler", title: "GPIO ve Kesmeler: Mikrodenetleyicinin Dış Dünyayla Konuşması", author: "İbrahim Işıklı", date: "2026-04-26", category: "Donanım", cover: "blog/images/gpio.jpg", read: "6 dk", excerpt: "Pinleri okuyup yazmak, pull-up/pull-down, ve 'polling yerine interrupt' felsefesiyle verimli kod yazmak.", body: [ { t: "p", x: "**GPIO (General Purpose Input/Output)**, mikrodenetleyicinin dış dünyayla en temel bağlantısıdır. Bir LED yakmak, bir butonu okumak ya da bir röleyi sürmek — hepsi bir GPIO pininin durumunu okuyup yazmakla başlar." }, { t: "h", x: "Giriş mi, çıkış mı?" }, { t: "p", x: "Her pin ya **giriş (input)** ya da **çıkış (output)** olarak yapılandırılır. Çıkışta pini 0 veya 1 yaparsın; girişte ise dışarıdaki gerilimi okursun. Giriş modunda hattın 'havada' kalmaması için genelde dahili bir **pull-up** ya da **pull-down** direnci etkinleştirilir." }, { t: "h", x: "Polling vs. Interrupt" }, { t: "p", x: "Bir butona basıldığını anlamanın iki yolu vardır:" }, { t: "ul", x: [ "**Polling:** Sürekli döngüde pini kontrol etmek. Basit ama CPU'yu boşa meşgul eder ve anı kaçırabilir.", "**Interrupt (kesme):** Pin değiştiğinde donanımın CPU'yu durdurup özel bir fonksiyonu (ISR) çağırması. Verimli ve anında." ] }, { t: "p", x: "İyi gömülü kodun sırrı çoğu zaman 'sürekli sorma, olunca haber ver' felsefesidir — yani **kesme** kullanmaktır. Bu, hem güç tasarrufu sağlar hem de CPU'yu başka işler için serbest bırakır." }, { t: "code", lang: "c", x: "// STM32 HAL — dış kesme (EXTI) callback'i\nvoid HAL_GPIO_EXTI_Callback(uint16_t pin) {\n if (pin == BUTON_Pin) {\n // butona basıldı — işini burada (kısa tut!) yap\n buton_sayaci++;\n }\n}" }, { t: "quote", x: "ISR içinde kısa kal: bayrağı kaldır, ağır işi ana döngüye bırak." } ] } ]; // slug ile hızlı erişim const POST_BY_SLUG = {}; POSTS.forEach((p) => { POST_BY_SLUG[p.slug] = p; }); Object.assign(window, { POSTS, POST_BY_SLUG });