"Enter"a basıp içeriğe geçin

Eclipse IDE ile STM32 Mikrodenetleyicileri İçin Gömülü Yazılım Geliştirme ve Hata Ayıklama – Board Emülatörü

Merhaba sevgili ziyaretçiler bu yazımın konusu bir önceki ve önceki yazılarımın  üzerine ilave olarak devam edecek. Bu yazıya devam etmeden önce o yazılarımı okumanızı tavsiye ederim. Bu yazımda Eclipse IDE ile STM32 mikrodenetleyicileri üzerinde hata ayıklama için gerekli ayarlamaları yapıp hata ayıklama araçlarına değineceğiz. Bu bölüm ve sonrasında daha çok uygulama ağırlıklı ilerleyeceğiz.

Evet hadi başlayalım. STM32 NUCLEO F103RB boardunu kullanacağımızı önceki yazılarımda belirtmiştim. Şimdi bu bordu IDE’mize eklemek için Packs perspektifine geçmemiz gerekiyor. bunun için “Window->Perspective->Open Perspective->Other…” menü yolunu izliyoruz. Karşımıza Eclipse IDE’nin perspektiflerinin bulunduğu liste gelecek. Bu listeden “Packs” perspektifine çift tıklayarak açalım. Bizi aşağıdaki gibi bir ekranın karşılaması gerekiyor.

Packs Perspektifi
Packs Perspektifi üzerinde birçok firmanın üretimi olan çipler ve boardları bulabilirsiniz.

Boards ve Devices listeleri boş gelirse endişelenmeyin. Aşağıdaki resimde sarı vurgu rengi ile işaretlenmiş olan “Update the packages definitions from all repositories” butonuna tıkladığınızda tüm Board ve Mikrodenetleyici (Device) paketleri gelecektir. Tabi biraz uzun sürecek.

Update the packages definitions from all repositories butonu
Update the packages definitions from all repositories butonu

Paket tanımlarının güncelleştirilmesi tamamlandıktan sonra bir aksilik olmadıysa sol taraftaki Boards ve Devices listelerinin dolduğunu göreceksiniz.

STM32 NUCLEO F103RB boardunu kullanacağımı belirtmiştim. Bu yüzden sol taraftaki “Boards” listesinden “STMicroelectronics” klasörünü seçtim ve altına açılan listeden NUCLEO-F103RB‘yi üzerine tıklayarak seçtim. Ortadaki Packs listesinde seçtiğim boarda ait kullanılabilir paketler listelenecektir. Ben burada en üstte bulunan Keil klasörü altındaki paket olan “STM32NUCLEO_BSP” paketine sağ tıklayıp gelen menüden “Install” seçeneğini seçiyorum. Board paketimizin kurulumu tamamlandıktan sonra diğer aşamalara geçebiliriz.

Önceki yazımda projeyi oluşturduğumuzdan burada proje oluşturma adımlarını geçiyorum. O yazıda oluşturduğumuz proje template bir proje olan “blink led” projesiydi. Bu proje üzerinden devam edeceğiz.

Projeyi oluşturduktan sonra main.cpp içinde timer.sleep ifadesinin bulunduğu satırda hata gösterebilir. Ben aşağıdaki adımları izleyerek düzelttim. Sizde bu hatalar olmayabilir. Olursa da bu adımları izleyerek düzeltebilirsiniz.

“Timer.cpp” dosyasında

void
Timer::sleep(ticks_t ticks)

satırını aşağıdaki gibi değiştirmeniz gerekiyor.

void Timer::sleep(ticks_t ticks)

“Timer.h” dosyası içinde bulunan aşağıdaki satırı da

static void
sleep(ticks_t ticks);

aşağıdaki gibi değiştirmeniz gerekiyor

static void sleep(ticks_t ticks);

bu satır da

inline static void
tick(void)

böyle olacak

inline static void tick(void)

son olarak bu satır da

inline void
start(void)

böyle olacak

inline void start(void)

Yani anlayacağınız alt alta satırlarda olan tür adıyla nesne adını aynı satıra aldım.

Artık hataları da giderdiğimize göre, projede debug işlemini yapabilmek gerekli olan debug konfigürasyonu yapalım. Bunun için “Run->Debug Configurations…” menü yolunu izliyoruz. Karşımıza aşağıdaki resimde gördüğünüz gibi “Debug Configurations” penceresi gelecek.

Debug Configurations
Debug Configurations penceresi tüm hata ayıklama ayarlarının yapıldığı penceredir.

Bu pencerede sol tarafta gördüğünüz “GDB QEMU Debugging” satırına sağ tıklayarak açılan menüden “New” seçeneğini seçin. Böylece proje için yeni bir Debug konfigürasyonu oluşturmuş olduk.

Yeni bir debug konfigürasyonu oluşturduğunuzda bu konfigürasyon varsayılan ayarlarıyla birlikte oluşturulur.
Hata ayıklamayı yapacak olan QEMU emülatörüne ilişkin ayarlamalar Debugger sekmesinde yapılır.

Debugger sekmesindeki önemli alanlardan kısaca bahsedecek olursak:

Executable: QEMU emülatörünün çalıştırılabilir dosyasının bulunduğu konumu buradan gösteriyoruz. Window->Preferences‘ta bu konumu daha önceki yazılarımızda nasıl belirteceğimizi görmüştük. Burada joker ifadeler(${qemu_path} vs. gibi) ile yol tanımlamasını yapıyoruz.

Board Name: Hangi boardu kullanacağımızı buradan belirtiyoruz. Biz bu yazı kapsamında “NUCLEO-F103RB” boardunu kullanacağımızdan Board Name alanına bu adı resimde de görüldüğü üzere olduğu gibi yazıyoruz.

Device Name: QEMU Emülatörde emülasyonunu yapacağımız mikrodenetleyiciyi de burada belirtiyoruz. NUCLEO-F103RB bordunun mikrodenetleyicisi F103RB modeli olduğundan bu alana “STM32F103RB” ifadesini yukarıdaki resimde de görüldüğü üzere olduğu gibi yazıyoruz.

NOT: 

Kullanmak istediğiniz board ve mikrodenetleyicinin QEMU tarafından desteklenip desteklenmediğini görmek için konsolda QEMU klasöründeyken (bende “C:\GNU_Tools\GNU_ARM_Eclipse\QEMU\2.7.0-201611282115-dev\bin” klasörü altında);

qemu-system-gnuarmeclipse -board help

yazarak board listesini,

qemu-system-gnuarmeclipse -mcu help

yazarak mikrodenetleyici listesini görebilirsiniz.

Sonraki sekme olan “Startup” sekmesinde de hata ayıklama süreci ile ilgili bazı başlangıç ayarları ve reset durumuna ilişkin ayarlamalar mevcuttur.

Run Configurations Penceresi, Startup Sekmesi

Startup sekmesinde, geliştirilen yazılımın hata ayıklama sürecine nasıl başlayacağı ve reset durumu ile ilgili ayarlamalar mevcuttur.Söz konusu ayarlamaları başlıklar halinde inceleyelim.

“Initialization Commands” Başlığı :

Bu başlık altında mikrodenetleyici debug işlemine başlarken yapılacak işlemleri belirliyoruz. “Initial Reset” seçeneği seçildiğinde debuggerımız (GDB) işlemciyi hangi durumda (state) bulunursa bulunsun o durumdan çıkarırarak reset durumuna geçirir ve mikrodenetleyicinin flaş hafızasını programlamak amacıyla hazırlar. Aslında GDB başlangıçta kendisi bir reset işlemi gerçekleştirir ancak bu seçenek duruma özel reset türlerinin gerektiği zamanlarda oldukça işe yarar.

“Load Symbols and Executable” Başlığı:

Çalıştırılabilir program ve bu programa ait sembol tablosunun mikrodenetleyiciye yüklenip yüklenmeyeceğini ve yüklenecekse nereden yükleneceğini buradan belirtiyoruz.

“Load Symbols” seçeneği ile, programa ait sembollerin yani değişken adları, metotlar ve tür tanımlarının bulunduğu tablonun nereden yükleneceğini belirtiyoruz. “Use Project Binay” seçeneği ile sembol tanımlarının otomatik olarak Eclipse tarfından belirlenmesini sağlayabilirsiniz. Varsayılan seçenek budur.

Sembol Tablosu Nedir Ne İşe Yarar?

GDB ile bir programı, yazdığınız C kodlarından satır satır debug edebilmek için sembol tablosu gerekir. Bu sembol tablosu ile GDB hangi değişken veya fonksiyonun nerede olduğunu tespit eder. Ancak bu sembollerin denetleyiciye yüklenmesi gömülü yazılımın mikrodenetleyici hafızasında daha fazla yer kaplamasına neden olur. Eğer sembol tablosu verilmezse GDB programı C kodlarından satır satır değil Assembler nemonik kodlarından komut komut ilerletir ve verdiğiniz “breakpoint”lerde debugger durmaz. Mikrodenetleyici debug modunda çalıştırılmayacaksa sembollerin yüklenmesine gerek yoktur.

“Load Executable” seçeneği ile mikrodenetleyicide asıl çalışacak olan çalıştırılabilir program dosyasını (elf, bin, hex uzantılı) belirtiyoruz. Bu bizim olmazsa olmazımız. “Use Project Binary” seçeneği ile mikrodenetleyiciye yüklenecek çalıştırılabilir program dosyasının otomatik olarak Eclipse tarafından belirlenmesini sağlayabilirsiniz. Varsayılan seçenek budur.

“Runtime Options” Başlığı:

Bu başlık altında bulunan “Debug in RAM” seçeneği seçildiğinde GDB programı mikodenetleyicinin RAM belleğine yükleyerek tüm Debug sürecini buradan çalıştırır. Bu seçeneğin en önemli etkisi çalıştırılabilir program sadece başlangıçtaki ilk reset aşamasında değil her resetten sonra belleğe yüklenecektir.

“Run/Restart Commands” Başlığı:

“Pre-run/Restart reset.” seçeneği seçili olduğunda, GDB her yeniden başlatma sonrası mikrodenetleyiciye ikinci bir reset atar ve belli bir durumdan (state) çalışmaya başlaması için hazırlar. Her zaman mikrodenetleyici yeniden başlatıldığında icra edilir. Bu seçeneğin GDB konsolunda karşılığı olan komut “monitor system_reset”tir.

“Set program counter at (hex)” seçeneği seçili olduğunda Program Sayıcısı (PC) reset adresinden değil hemen seçeneğin sağındaki kutucuğa girilen adresten başlar.

“Set breakpoint at” seçeneği seçili olduğunda seçeneğin sağındaki kutucuğa girilen sembole geçici bir breakpoint koyar.

Continue seçeneği debug edilen programın resetten sonra kalmış (halt durumunda) olduğu yerden devam etmesini sağlar.

Common sekmesinde “Save As” opsiyonunu “Shared Files” olarak seçmemiz gerekiyor.

Son olarak Common sekmesinde “Apply” butonuna tıklayarak yaptığımız ayarları kaydedelim.  Ardından “Debug” butonuna tıkladığımızda derleme süreci başlayacak ve ardından aşağıdaki resimdeki gibi bir uyarı ile karşılaşacaksınız. Burada “Yes” diyerek Hata Ayıklama perspektifine geçebilirsiniz.

Debug Perspektifine geçmek için bu mesajı “Yes” butonuna tıklayarak yanıtlayın (Mesajla bir daha karşılaşmamak için “Remember my decision” kutucuğunu işaretlemeyi unutmayın).

Eğer burada anlattığım bütün aşamaları sorunsuz yaptıysanız ekrana aşağıdaki resimde gördüğünüz gibi bir Nucleo Development Board penceresi gelecektir. Yazdığınız programın hata ayıklama işlemlerini artık bu board üzerinde yapabilirsiniz.

QEMU Nucleo Board Emülatörü
QEMU Nucleo Board Emülatörü

 

İlk Yorumu Siz Yapın

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir