Kazanimlar:
- Mikrodenetleyici için register, kesme ve zamanlama gereksinimlerini net bir promptla tanımlayabilme
- AI'ın ürettiği C/Arduino kodunu register ayarları, tampon taşması ve gerçek zaman kısıtları açısından denetleyebilme
- Üretilen kodu donanım üzerinde ölçerek (osiloskop, seri port) doğrulama alışkanlığını uygulayabilme
Gömülü sistem geliştirmek, yazılım ile donanımın kesiştiği yerdir: bir register bitini yanlış kurmak, bir kesmeyi çok uzun tutmak veya bir tamponu taşırmak, kodun "derlenip çalışmasına" rağmen sahada tuhaf, yeniden üretilmesi zor arızalara yol açar. AI bu alanda gerçekten hızlandırıcıdır; başlangıç iskeleti, donanım soyutlama fonksiyonları, durum makineleri ve haberleşme rutinleri üretebilir. Ama AI sizin kartınızın datasheet'ini görmez, saat frekansınızı bilmez ve gerçek zaman kısıtlarınızı hissetmez. Bu ünitede mikrodenetleyici işini AI'a net biçimde nasıl tanımlayacağınızı, üretilen C/Arduino kodunu neye göre denetleyeceğinizi ve neden her şeyi donanımda ölçmeniz gerektiğini işleyeceğiz.
Gereksinimi Net Tanımlamak: Register, Kesme, Zamanlama
AI'a "bir LED yak" demek işe yaramaz; hangi kart, hangi pin, hangi saat frekansı, hangi zamanlama? Gömülü bir görevi AI'a verirken şu çerçeveyi kullanın: donanım (MCU ailesi, saat, pin), işlev (ne olacak), kısıt (zamanlama, güç, bellek) ve arayüz (register mı, HAL mı, Arduino kütüphanesi mi).
Zayıf Prompt / Güçlü Prompt
ZAYIF:"STM32 ile PWM üret."(Sonuç: hangi timer, hangi frekans, hangi pin belirsiz; genel,muhtemelen yanlış register isimli kod.)GÜÇLÜ:"STM32F103 (72 MHz sistem saati) için TIM3 CH1 (PA6) üzerinde 20 kHz,%0-100 ayarlanabilir duty PWM üret. Register seviyesinde (HAL değil) yaz.- Prescaler ve ARR değerlerini 20 kHz için HESAPLA ve yorum satırında hesabı göster.- duty'yi 0-100 arası bir fonksiyon parametresiyle ayarla.- Kullandığın her register bitini yorumla.Saat varsayımın yanlışsa değerlerin değişeceğini not düş."
Fark, güçlü promptun modele hesabı gösterttirmesi ve saat varsayımını açığa çıkarmasıdır. Böylece prescaler/ARR değerlerini bağımsız kontrol edebilirsiniz:
20 kHz PWM için (72 MHz saat):Timer_clock = 72 MHzİstersek prescaler = 72-1 → sayaç saati = 1 MHzARR = (1 MHz / 20 kHz) - 1 = 50 - 1 = 49Doğrulama: 1e6 / (49+1) = 20 000 Hz ✓
AI Kodunu Denetlemek: Neye Bakılır?
Üretilen kodun derlenmesi, doğru çalıştığı anlamına gelmez. Şu denetim listesini uygulayın:
Kontrol alanı
Ne aranır
Register/bit ayarları
Datasheet ile birebir uyum, doğru bit maskesi
Kesme (ISR)
Kısa mı? Bloklayıcı gecikme yok mu? volatile kullanılmış mı?
Tampon/dizi
Sınır kontrolü var mı? Taşma (overflow) riski?
Zamanlama
delay ile mi, timer ile mi? Gerçek zaman kısıtı karşılanıyor mu?
Tip ve genişlik
8/16/32-bit taşması, işaretli/işaretsiz karışıklığı
Güç/watchdog
Sonsuz döngü watchdog'u besliyor mu?
Kesme servis rutinleri (ISR) en sık hata kaynağıdır. AI bazen ISR içine delay() veya uzun döngü koyar. Bu, diğer kesmelerin kaçırılmasına ve watchdog resetlerine yol açar. Kural: ISR mümkün olduğunca kısa olmalı; asıl işi bir bayrak kurup ana döngüye taşımalıdır.
// ZAYIF (AI bazen böyle üretir): ISR içinde bloklayıcı işvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; read_sensor(); // uzun sürebilir - KÖTÜ HAL_Delay(10); // ISR içinde gecikme - ÇOK KÖTÜ }}// GÜÇLÜ: ISR kısa; iş ana döngüye taşınırvolatile uint8_t tick_flag = 0; // volatile ŞARTvoid TIM3_IRQHandler(void) { if (TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~TIM_SR_UIF; tick_flag = 1; // sadece bayrak kur }}// ana döngüde:if (tick_flag) { tick_flag = 0; read_sensor(); }
Dikkat: Kesme ve ana döngü arasında paylaşılan her değişken volatile olmalıdır. Aksi halde derleyici değişkeni register'da önbelleğe alıp güncellemeyi kaçırabilir. AI bu anahtar kelimeyi sık sık unutur; kodu okurken özellikle arayın.
Tampon Taşması ve Tip Hataları
AI, seri porttan gelen veriyi sabit boyutlu bir diziye sınır kontrolü yapmadan kopyalayabilir. Gömülü sistemde bu, bitişik belleğin ezilmesi ve açıklanamayan çökmeler demektir. Her strcpy, dizi indeksi ve DMA tamponunda sınırın kontrol edildiğinden emin olun. Benzer şekilde, 8-bit bir sayaç 255'ten sonra sıfırlanır; AI bunu göz ardı edip taşan bir hesaba dayanabilir.
Donanımda Doğrulama: "Çalışıyor" Ölçülür, Varsayılmaz
Gömülü sistemde en güvenilir kanıt derleyici değil, ölçü aletidir. Üretilen kodu şu üç yolla doğrulayın:
- Osiloskop/mantık analizörü: PWM frekansını, sinyal zamanlamasını ve haberleşme dalga biçimini ölçün. 20 kHz istediyseniz ekranda 20 kHz görün.
- Seri port (UART) log: Değişken değerlerini, durum geçişlerini ve hata sayaçlarını dışarı basıp beklenen davranışla karşılaştırın.
- Sınır ve stres testi: En yüksek yük, en hızlı veri ve en kötü zamanlama altında sistemin dayanıp dayanmadığını test edin.
Ölçülen değer hesapla uyuşmuyorsa, saat varsayımı, prescaler değeri veya register ayarı yanlıştır; kovalayın.
Mini Vaka
Bir öğrenci ekibi, AI'a bir HC-SR04 ultrasonik sensörle mesafe ölçüm kodu yazdırıyor. Kod derleniyor ama mesafe hep saçma değerler veriyor. Osiloskopa bağladıklarında echo bacağının zamanlamasını mikrosaniye yerine milisaniye ölçeğinde hesapladığını görüyorlar; AI, micros() yerine millis() kullanmış. Bir kelimelik bu hata, tüm ölçümü 1000 kat şaşırtmış. Seri log'a ham echo süresini bastırıp gerçek bir cetvelle karşılaştırdıklarında hatayı bulup düzeltiyorlar. Ders: derlenen kod doğru kod değildir; donanımda ölçüm hatayı hemen açığa çıkarır.
Yaygın Hatalar
- Register isimlerini ve bit maskelerini datasheet ile karşılaştırmadan kabul etmek.
- ISR içinde bloklayıcı gecikme veya uzun işlem bırakmak.
- Paylaşılan değişkenlerde volatile unutmak.
- Tampon ve dizi sınır kontrolünü atlamak; taşmayı görmemek.
- Saat frekansı ve zamanlama varsayımlarını doğrulamadan güvenmek.
- Kodu osiloskop/seri log ile ölçmeden "çalışıyor" saymak.
Özetle
- Gömülü görevi donanım, işlev, kısıt ve arayüz olarak net tanımlayın.
- AI'a prescaler/ARR gibi zamanlama değerlerini hesaplattırıp bağımsız doğrulayın.
- ISR'leri kısa tutun, paylaşılan değişkenlerde volatile kullanın.
- Register, tampon sınırı ve tip genişliği hatalarını özellikle arayın.
- "Çalışıyor" derleyiciyle değil osiloskop, mantık analizörü ve seri log ile kanıtlanır.
- Ölçülen değer hesapla uyuşmuyorsa varsayımları kovalayın.
Uygulama görevi
Elinizdeki bir mikrodenetleyiciyle (Arduino, STM32, ESP32) belirli frekansta PWM veya periyodik bir görev isteyin AI'dan. Kodu yüklemeden önce: (1) frekans/zamanlama değerlerini yorum satırındaki hesaptan bağımsız doğrulayın, (2) ISR ve paylaşılan değişkenlerde volatile ve bloklama kontrolü yapın. Yükledikten sonra osiloskop veya mantık analizörüyle gerçek frekansı ölçüp hedefle karşılaştırın. Sapma varsa kaynağını bulup düzeltin ve neyin yanlış varsayıldığını not edin.