Cortex M0/+ için STM32CubeIDE'de Hata Ayıklama
Yakın bir zamanda gömülü sistemleri öğrenmeye başladım. Bundan dolayı, günlük hayatta programlama yaparken en çok kullandığım bir araç olan debugging'i öğrenmem gerekiyordu. Şimdi öğrendiklerimi ileride kendime not olması amacı ile burada paylaşmak istedim.
Öncelikle, şu bilinmelidir ki, burada bahsedeceğim printf() tipi ile yapılan ilkel hata ayıklama işlemidir. Yoksa normal bir şekilde geliştirme kartı bilgisayara takılı iken debug tuşuna bastığınızda hata ayıklama moduna geçmesi gerekiyor.
Çıktı vererek hata yakalamak istiyor isek bu iş için kullanabileceğimiz iki yol var. Bunlardan biri yalnızca Cortex M3 ve daha üst işlemciler için çalışan Serial Wire Viewer metotu, diğeri ise –bizim de Cortex M0/+ için kullanacağımız– OpenOCD metotu. Ben bu yazıda OpenOCD'den ve bunu nasıl STM32CubeIDE ile ayarlayacağımızdan bahsedeceğim.
İlk olarak yapmamız gereken çalışma ortamı grubunun içindeki ilgili projemizin ismine sağ tıklayıp Properties penceresini açmak. Bunu projeyi seçtikten sonra Alt + Enter kombinasyonu ile de yapabilirsiniz.
Daha sonra, "C/C++ Build > Settings > MCU GCC Linker > Miscellaneous" yolunu takip etmek. Açılan ayarlardan "Other Flags" grubunun üstündeki bayrak ekleme tuşuna basarak hemen aşağıdaki bayrakları ekliyoruz ve kaydetip pencereyi kapatıyoruz.
-specs=rdimon.specs -lc -lrdimon
Ardından tekrar projemizin adına sağ tıklayarak "Debug as > Debug Configurations" penceresini açıyoruz. Bu pencerede sol üstte bulunan yeni konfigürasyon ekleme tuşuna basarak yeni bir "STM32 Cortex-M C/C++ Application" konfigürasyonu yaratıyoruz. Bu ayarsetine istediğiniz adı verebilirsiniz. Daha sonra "Debugger" sekmesine geçerek "Debug Probe" açılır seçeneğinde "OpenOCD" olan şıkkı seçiyoruz. Bu ayarı da yaptıktan sonra "Startup" sekmesine geliyoruz ve en aşağıdaki "Run Commands" yazı kutusuna aşağıdaki komutu yazıyoruz, kaydetip pencereyi kapatıyoruz.
monitor arm semihosting enable
Üçüncü adımda ise amacımız src
klasörünün altında bulunan syscall.c
kütüphanesinin derlenmesini engellemek. Bunun için ilgili kütüphaneye sağ tıklayıp "Properties" penceresini açıyoruz. "C/C++ Build" başlığı altındaki "Settings" ayarlarını açıyoruz ve "Exclude resource from build" tikini aktif hale getiriyoruz. Bu pencereyi de kaydedip kapatabiliriz.
Bu kadar meşakkatli işin ardından asıl noktaya geldik! Artık programımızda printf() fonksiyonunu çağırabiliriz ancak son bir adım kaldı. Bu fonksiyonu çağırmak istediğimiz zamanlarda kodumuza, main() fonksiyonumuzun içine şu kodu yazmalıyız.
initialise_monitor_handles(); // It is mandotory to use printf().
Ve buna ek olarak kodumuzu global olarak bu fonksiyonunun varlığından haberder etmeliyiz. Bu yüzden aşağıdaki satırı da kodumuzda main() fonksiyonundan önceki bir alana yapıştırmalısınız.
extern void initalise_monitor_handles(void);
Ardından bir build, daha sonra debug! Kolay gelsin herkese.