STM32H7 ile Çift Çekirdek Debug İşlemi

Merhaba,

Bu konuda başta benim de zorluk çektiğim farklı iki çekirdeğe sahip STM32 mikrodenetleyicisine nasıl debug işleminin gerçekleştirilebileceğini göstermeye çalışacağım. İlk 2016 yılında yayınlanan STM32H7 serisi mikrodenetleyicilerinde ana işlemci mimarisi olarak ARM-Cortex M7 kullanılmaktadır. Ancak bazı modellerinde buna ek olarak ARM-Cortex M4 mimarisine sahip ikinci bir mikrodenetleyici daha bulunmaktadır. Özellikle ikinci mikrodenetleyici olan modellerinde debug işlemini gerçekleştirebilmek için uyulması gerken bazı işlem adımları mevcut. Bu işlem adımlarına uyulmazsa çekirdeklerden biri hata durumuna düşüyor ve yüklediğiniz yazılımı adım adım ilerletebilmeniz mümkün olmuyor. Konu içerisinde bu adımların neler olduğuna değineceğiz.

Öncelikle konu içerisindeki debug işlemleri için STM32H747I-Discovery geliştirme kartını kullanacağım. Bu kart içerisinde STM32H747XIH6 mikrodenetleyicisi bulunur ve bu mikrodenetleyicide M7 ve M4 mimarisine sahip iki ayrı çekirdek bulunmaktadır. Yapacağımız uygulamada bu Discovery kartı üzerindeki 4 adet LED’i 2’şerli gruplayıp 2 ayrı çekirdeğe böleceğiz ve belirli zaman aralıklarında bu LED’lerin yanıp sönmesini sağlayacağız. Öncelikle elimizdeki STM32 geliştirme kartı için projeyi oluşturalım. Projeyi oluşturduğumuzda öncelikle bütün pinleri atamalarını temizliyoruz. Bu işlemi yapacağımız uygulamada hazır konfigurasyonlara ihtiyaç duymadığımız için yaptık. Gerekli ise ön ayarlı pin konfigurasyonlarını kullanabilirsiniz. Proje oluşturma işlemi sona erdiğinde zaman proje hiyerarşisi şu şekilde gözükecektir.

Resimde oluşturulan proje hiyerarşisi gözükmektedir. Yeşil ile işaretli kısımda M4 mimarisine sahip çekirdek için gerekli yazılımları bulunmakta iken mavi ile işaretli kısımda M7 mimarisine sahip çekirdeğin yazılımları bulunmaktadır. Sarı ile işaretli dosya ise CubeMx konfigurasyon dosyası olup her iki çekirdek için de ortaktır. Bu CubeMx dosyasının içerisinde öncelikle saat ayarlarını yaparak başlayalım. Saat ayarı seçimi genel STM32 mikrodenetleyicilerindeki gibi olsa da kullanmak istediğiniz saat frekansına göre ayarlamanız gereken güç parametreleri değişiklik göstermektedir. Ben mikrodenetleyiciyi 400MHz saat frekansında kullanmak istediğim için güç parametreleri ayarını aşağıdaki görüntüdeki gibi yaptım. Mikrodenetleyici 400 Mhz’de kullanabilmek için RCC menüsü altında HSE’yi resimde de görüldüğü gibi aktif edilmelidir.

Saat ve güç ayarlarını tamamladıktan sonra Debug ayarlarını yapmalıyız. Debug ayarların aşağıdaki görseldeki gibi kırmızı işaretli Trace and Debug sekmesi altından yapacağız. Bu menüye tıkladığımız zaman görselin sağındaki yer açılacaktır. Açılan yerde yeşil ile işaretli yeri Serial Wire olacak şekilde seçmeliyiz. Böylece CubeIde’de debug işleminde kullanacağımız protokolü belirlemiş olduk. Ayrıca sarı ile işaretli alanda başlatıcı olarak Cortex-M7 seçili olduğuna ve M7 ve M4 çekirdeklerini ifade eden tick’lerin seçili olduğuna emin olmalısınız.

Debug ayarlamalarını da bitirdikten sonra LED’leri ayarını gerçekleştirelim. Konunun başında da belirttiğim gibi kullandığım geliştirme kartı üzerinde 4 adet LED bulunmaktadır. Bu LED’leri geliştirme kartının çiziminden bakıp CubeMx içerisinde çıkış olarak yönlendirmeliyiz. STM32H747I geliştme kartı üzerinde LED’ler “PI12 – PI13 – PI14 – PI15” pinlerine bağlıdır. Burada pinleri çıkış olarak yönlendirdikten sonra ek olarak hangi çekirdek tarafından kontrol edileceğini de seçmemiz gerekiyor. Örneğin M7 çekirdeği tarafından kontrol edelecek LED’lerin atamasını burada yapınca o LED’lerin konfigurasyonu sadece M7 çekirdeğinin projesinde yapılacaktır. Yani bu LED’leri diğer çekirdek tarafından doğrudan kullanmak mümkün değildir. Aşağıdaki resimde de görüldüğü üzere PI12 ve PI13 pinlerini M7 çekirdeğine atamışken, PI14 ve PI15 pinlerini M4 çekirdeğine atadım. Daha sonrasında yaptığımız ayarlar ile projeyi kaydedip projeyi tekrar üretiyoruz.

Projenin yazılımlarını yaptığımız konfigurasyonlar ile ürettiğimiz zaman sırası ile M7 ve M4 çekirdekleri için üretilen main yazılımlarının giriş kısımları aşağıdaki gibidir. Görseldeki yazılımlarda da görüldüğü üzere mikrodenetleyicinin düzgün şekilde başlayabilmesi için çekirdeklerin birbirini bekledikleri bir sürece gereksinim duyulmaktadır. M7 çekirdeğin ait soldaki main yazılımda kırmızı ile işaretli kısımda M7 çekirdeği başlayınca yazılıma devam etmek için diğer çekirdeğin çalışmasını beklediği görülmektedir. Sağdaki M4 çekirdeğine ait yazılımda ise üstte mavi ile işaretli kısımda M4 çekirdeği çalışıp çalıştığı bilgisini donanımsal semaphore kullanarak diğer çekirdeğe iletmektedir. Daha sonra turuncu ile işaretli kısımda ise M4 çekirdeği uyku moduna geçip beklemeye başlamaktadır. Bu aşamada henüz hafıza ve saat gibi önemli ayarlamalar yapılmadığı için M4 çekirdeği uyguluya geçiyor ve M7 çekirdeğinin bu ayarlamaları yapmasını bekliyor. M7 için verilen yazılımda sarı ile işaretli kısım gerçekleştirildiğinde M4 çekirdeği uyanacak ve her iki çekirdek de düzgün bir şekilde çalışmaya başlayacaktır.

Debug işlemini test etmek için basit bir yazılım hazırlayalım. Bu yazılımda grupladığımız ve çıkış olarak atadığımız LED’leri farklı zaman aralıklarında toggle işlemi yapalım.Böylece hangi LED’i hangi çekirde kontrol ediyor görebiliriz. Ayrıca bir çekirdeği debug işlemi sırasında breakpoint ile durdurduğumuzda diğer çekirdeğin çalışmaya devam ettiğini görebileceğiz. Hazırladığım yazılım aşağıda verilmiştir. Basit bir yazılım olduğu ve yan yana koyabilmek için görsel olarak vermeyi tercih ettim. Soldaki yazılım M7 çekirdeğine ait projedeki yazılım iken sağdaki yazılım dosyası ise M4 çekirdeği içerisinde çalışacak yazılımdır.

Proje konfigurasyonlarını yaptıktan ve yazılımımızı hazırladıktan sonra daha çok dikkat edilmesi gereken kısma geldik. Bu kısımda hazırladığımız yazılımı mikrodeneteyleyici içerisindeki çekirdeklere yükleyip debug işlemini gerçekleştireceğiz. Mikrodenetleyicide iki ayrı çekirdek olduğu için her iki çekirdek için de ayrı ayrı debug işlemini bir proje altında başlatmalıyız. Böylece her çekirdeğin yaptığı işlemi ayrı ayrı takip edebilmemiz mümkün olacaktır. Ancak bu debug işlemi ilk seferde zahmetli sonrasında ise normal debug sürecine kıyasla biraz zahmetlidir.

M7 Çekirdeği İçin Debug Ayarları

İlk olarak M7 çekirdeğinin projesinin içerisindeki main dosyasına açıp “Debug Configuration” penceresini açıyoruz. Burayı açtığımızda aşağıda resimde verilen ekran karşınıza gelecektir. Bu ekranda öncelikle kırmızı ile işaretli kısmın altında önceden oluşturuduğunuz Debug konfigurasyonları varsa onları silmelisiniz. Daha sonra kırmızı ile işaretli kısma çift tıklayarak yeni bir Debug konfigurasyonu oluşturuyoruz. M7 çekirdeğine ait projenin main dosyası seçili olarak çift tıklama işlemini gerçekleştirdiğimiz için turuncu ernk ile gözüken Debug konfigurasyonu M7 çekirdeği için oluşturuldu. Daha sonra turuncu ile gösterilen konfigurasyona çift tıklayıp mavi ile gösterilen Debugger sekmesine tıklıyoruz. Açılan sayfada sarı ile gösterilen ayarların benim yaptığım şekilde olması önemlidir. Bunlara ek olarak resime sığmayan sayfanın sonundaki Shared ST-Link seçeneğinin de seçili olduğunu kontrol etmelisiniz.

Debugger ayarları bittikten sonra aynı yerde aşağıdaki resimde mavi ile gösterilen Startup sekmesini açıyoruz. Bu kısımda normalde sadece M7 çekirdeği için ayarlar bulunacaktır. Biz resimde sarı ile işaretli Add butonuna basarak M4 çekirdeği için de Startup ayarı ekleyeceğiz. Sarı ile işaretli butona bastığımız zaman açılan pencerede yeşil ile işaretli ayarları yapıp son olarak OK butonuna basarak açılan pencereyi kapatmalıyız. Bu kısım ile Debugger’ın farklı işlemci çekirdekleri için derleme, yükleme işlemlerini belirleyebiliyoruz. Yani aslında burada yaptığımız ayar ile M7 ve M4 çekirdeği için de derleme, kod indirme ve sembol yükleme işlemlerini M7 çekirdeği için açılan projenin debug işlemi sırasında gerçekleştirileceğini ifade etmiş olduk. M4 çekirdeği için açacağımız Debug konfigurasyonu kısmında bu ayarları farklı yapacacağız. Son olarak Debug Configuration penceresinin sağ altında yer alan Apply butonuna ve Close butonuna basarak bu pencereyi kapatıyoruz.

M4 Çekirdeği İçin Debug Ayarları

Böylece M7 çekirdeği için debug işlemlerini bitirmiş olduk. Şimdi M4 çekirdeği için debug işlemlerinin nasıl yapılacağına bakalım. Burada bazı ayarlar M7 çekirdeği için yaptığımız ayarlardan farklı olacak. Öncelikle proje kısmından M4 çekirdeği için olan projeye geçip main dosyasını açıyoruz. Sonrasında yine Debug configuration penceresini açıp yine önceki ksıımda olduğu gibi kırmızı ile işaretli alana çift tıklıyoruz. Böylece M4 çekirdeği için Debug Configuration oluşturmuş olacağız. Daha sonra yeşil ile gösterilen yere tıklayarak sağdan mavi ile işaretli Debugger penceresine geçiyoruz. Bu kısımda önceki kısımdan farklı olarak Debugger’ın bağlanacağı port adresini önceki port adresinden 3 fazla belirliyoruz. Bu değer, ST’nin paylaştığı dökümanlarda en az 2 fazla olacak şekilde belirtildiği için bu şekilde seçilmektedir. Daha sonra aşağıdaki Access port kısmında Cortex – M4 seçili olduğundan emin olup Reset Behaviour seçeneğini None ayarına getiriyoruz.

Debugger ayarlarını da hallettikten sonra M4 çekirdeği için Startup ayarlarını yapacağız. Az önce M7 çekirdeği için yaptığımız startup ayarında M4 çekirdeği için kod yükleme işlemi yapılması gerektiğini belirtmiştik. O sebeple bu kısımda onu kaldırmalıyız. Startup sekmesi altında yeşil ile gösterilen kısmı seçip sağda sarı ile gösterilen Edit butonuna basmalıyız. Açılan pencerede turuncu ile işaretli Download seçeneğindeki onayı kaldırıp OK butonuna basıp pencereyi kapatıyoruz. Daha sonra sağ alttaki Apply ve Close butonlarına basarak Debug Configurastion penceresini kapatabiliriz. Çift çekirdekli bir STM32 mikrodenetleyicisi için yapmamız gereken Debug ayarları bu kadardı. Şimdi Debug işlemini nasıl yapacağımıza geleceğiz. Bu kısıma kadar yaptığımız ayarları projeyi oluşturuduğumuzda 1 kez yapmamız yeterli iken bu kısımdan sonra yapacağımız adımları her Debug işleminde tekrarlamalısınız. Bu adımlar başta biraz göz korkutucu olsa da zamanla alışıldığını söyleyebilirim.

STM32H7 için Debug İşlemi

STM32H747 mikrodenetleyicisi içeriisnde bulunan iki işlemci çekirdeği için ayrı ayrı debug işlemi gerçekleştireceğiz. Öncelikle geliştirme kartını bilgisayarımıza bağlıyoruz. Debug işlemine öncelike M7 çekirdeği ile başlayacağız. Bunun için yine Debug Configuration penceresini açıp yeşil ile işaretli M7 çekirdeği için hazırladığımız ayarları seçerek sağ alttaki sarı Debug butonuna basıyoruz. Böylece CubeIde debug görünümüne geçecek ve M7 çekirdeği için hazırlanan main sayfasının başında beklemeye başlayacaktır. M7 çekirdeği beklerken yine Debug Configuration penceresini açarak bu sefer kırmızı ile işaretli ayarları seçip sağ altta sarı ile işaretli Debug tuşuna basacağız. Böylece M4 çekirdeği için de debug işlemini başlatılacak ve debug imleci M4 çekirdeği için oluşturduğumuz projenin main dosyasının başında bekleyecektir.

Üstteki adımlar ile Debug işlemlerini başlattığımızda mikrodenetleyici içerisindeki her iki çekirdek de bekleme durumunda olacaktır. CubeIde’nin debug görünümündeki debug sekmesinde başlattığımız her iki debugger işlemi de görülebilmektedir. Aşağıdaki resimdeki gibi her iki debugger’ın beklediği yeri ifade eden kırmızı ve yeşil olarak işaretli main ifadelerine Ctrl tuşuna basılı tutarken sol tıklayarak seçmeliyiz. Daha sonra debugger görünümünde üstte mavi olarak işaretli Run tuşuna basarak her iki işlemci çekirdeğini de başlatmalıyız. Her iki işlemci çekirdeğini de aynı anda başlatmak zorunludur. Çünkü M7çekirdeği yazılımı ilerletmek için M4 çekirdeğini bekleyecektir. M4 çekirdeğinin çalışabilmesi için de saat ayarları gibi bazı gerekli ayarlar M7 çekirdeği tarafından yapılacağından M7 çekirdeği olmadan M4 çekirdeğini de hazırladığımız projede tek başına çalıştırmanız mümkün olmyacaktır.

Debug işlemini başattıktan sonra diğer STM32 kartları ile kullandığımız gibi breakpoint’leri kullanabiliriz. İki çekirdek birbirinden tamamen bağımsızdır ve birini durdurduğunuzda diğeri çalışmaya devam edecektir. Henüz bu H7 serisi mikrodenetleyicilerde ben de yeniyim. Farklı şeyler öğrendikçe ben de paylaşmaya çalışacağım.

Burada anlatılanları video halinde takip etmek isterseniz bağlantıdaki videoyu takip etmenizi öneririm. Ayrıca videoyu yayınlayan kanalda STM32H7 serisi ve diğer STM32 mikrodeneletleyiciler için güzel içerikler bulunmaktadır.

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir