STM32 cubeIDE- SWV İLE HATA AYIKLAMA-2

STM32 SWV – DEĞİŞKEN DEĞERLERİNİN İZLENMESİ

SWV serimizin birinci bölümünde bir kod parçacığının çalışma süresini ölçmeyi anlatmıştım. Bunun için süresini ölçeceğimiz sürecin başında ve sonunda ST Link’e birer karakterlik işaret gönderip SWV trace log konsolu üzerinde bunların zamanları arasındaki farkı hesaplıyorduk. Zaman ölçümü böyle.

Bu bölümde yine SWV araçlarını kullanarak program değişkenlerinin değerlerindeki değişiklikleri izlemeye çalışacağız. Bunların değerlerinin zaman eksenindeki değişimini osiloskop benzeri bir grafik pencere üzerinde görüntüleyeceğiz.

İZLENECEK DEĞİŞKENLERİN SEÇİMİ

Test programımızda a,b ve c olarak tanımladığımız üç değişkenimiz var. Bunlardan b ve c nin değişimini izleyelim:

İZLENECEK DEĞİŞKENLERİN SEÇİMİNDEKİ KISITLAMALAR

DEĞİŞKEN BOYUTU KISITLAMASI

SWV araçları ile izlenecek değişkenler 1, 2 ve 4 byte uzunluğunda olabiliyorlar.

SWO VERİ PORTUNUN BAND GENİŞLİĞİ KISITLAMASI

Bunun anlatımı biraz daha uzun olacak:

İzlenecek değişkenler tek bir pin, SWO/PB3 pinine bit serileri halinde gönderiliyor.

72MHz de 14 piko saniye saat frekansı ile çalışan bir STM32 MCU, yukarıdaki test programımızın her çevrimini 1 µs de tamamlayarak b ve c değişkenlerine yeni değerler yazıyor. Yani sadece sekizer bitlik iki karakter için 16 Mbit/s ilk bir trafik oluşuyor. Üstelik sadece değişken değeri değil, zaman bilgileri de gönderiliyor. Bu hesabı 16 ve 32 bitlik değişkenler için hatta daha fazla sayıda değişken için yaptığımızda gerekecek bit hızlarının dehşet verici olduğunu görebiliriz.

SWV bufferları bu taleplerle baş edemeyerek kolaylıkla dolup taşar, zaten ST Link V2 nin saat hızı da 2 MHz. O halde, izlenecek değişkenleri seçerken cimri davranmak zorundayız. Ard arda SWO ya gönderilen değişkenlere yazım komutları aralarında yeterince zaman aralığı olmalı. Bir satırda birinci değişkene, hemen ardındaki satırda ikincisine yazıyorsak, büyük ihtimalle beklediğimiz çıktıları alamayacağız. Test programımızdaki HAL_Delay(1) gecikmelerinin nedeni de bu, yoksa sürekli “over-flow” hataları alırız.

Ben doğru seçimi biraz deneme yanılma yöntemiyle yapıyorum. SWV konsollarının verdiği “over flow”uyarıları yol gösterici oluyor.

SWV DATA TRACE KONSOLUNUN AÇILMASI

Bu bölüme başlarken serinin ilk bölümündeki gibi projemizi oluşturup, debuger SWD/SWI yapılandırmalarını da yapıyoruz. Bundan sonra böceği tıklayıp kodumuzu MCU ya aktarıyoruz. Programımız her zamanki gibi HAL_Init() satırına kadar ilerleyip orada beklemeye başlıyor. Bu durumda iken Window/Show view sekmesi altından SWV Data Trace konsolunu bulup tıklıyoruz.

SWV Data Trace konsolunu Window/Show View SWV ya da bu listede yoksa Other seçenekleri altında buluyoruz.

SWV Data Trace sekmesinin de ekranın alt tarafındaki pencereye eklendiğini görebiliriz. Burada daha önce eklemiş olduğumuz SWV Trace Log sekmesi de duruyor. Eğer yoksa onu da aynı şekilde seçerek ekleyelim, biraz sonra ona da bakacağız, bulunsun orada.

Şimdi tornavida-çekiçli yapılandırma sembolüne tıklayarak artık yabancı olmadığımız SWV/ITM port ayarlama penceresine ulaşalım.

Burada daha önceki bölümde yapmış olduğumuz Port 0 seçimi duruyor. Şimdi data trace bölümüne izlemek istediğimiz değişkenleri koyacağız. Comparator 1 ve Comparator 2 yi Enable kutucuklarına çek atarak etkinleştirelim. Var/addr alanlarına da b ve c değişken isimlerini yazalım. İlle de değişken adı olmak zorunda değil, buralara izlemek istediğimiz bellek adresleri de yazılabilirdi.

OK basarak ayarlarımızı kaydedelim, bu pencere kapansın.

Önce SWV trace log penceresine bakalım, bu konsolu önceki bölümden tanıyoruz. Kırmızı kayıt başlatma butonuna basıp, resume tuşu ile programımızı koşturalım. Panelimiz hızla dolacaktır. Fazla gecikmeden programımızı beklemeye alalım ve konsollarımızı inceleyelim.

SWV Trace Log panelinde SWO üzerinden gelen ITM_SendChar() ile Port 0 a gönderdiğimiz 65 yani ‘A’ karakteri ile b ve c değişkenlerinden (Comp 0 ve Comp 1) okunan ve yazılan değerler ile bunlara ilişkin zaman bilgilerinin listelendiğini görebiliriz. Dikkat ederseniz bu ana kadar 2 adet veri paketi kaybolmuş, sol dipte over-flow uyarısı var.

Aynı bilgileri daha kolay okunur şekilde bulacağımız SWV Data Trace panelinde de görüntüleyebiliriz.

Önce Watch bölümünde b değişkenini seçelim:

Görüldüğü gibi daha kolay izlenir biçimde b değişkeninden okunan /yazılan değerler, okuma yazma zamanlarıyla birlikte listeleniyor.

Bu da c değişkenini seçtiğimizdeki döküm.

Bu bilgileri nasıl kullanacağınız size kalmış, ama ben çok yararlandığımı söyleyebilirim.

DEĞİŞKENLERİN GRAFİK OLARAK GÖRÜNTÜLENMESİ

Window/Show View/ SWV menüleri altından SWV Data Trace Timeline Graph panelini de seçelim.

Alt penceremize eklenen bu sekmeyi tıkladığımızda aşağıdaki gibi güzel bir grafik sunum görebiliriz. Bizim b ve c değişkenlerimiz basit birer testere dişi görüntüsü veriyor, ama bunlardan birini bir sinüs eğrisi verecek şekilde programlasaydık çok daha albenili bir grafik elde edebilirdik.

BU BÖLÜMÜ BİTİRİRKEN

SWV panelleri listesinden bir kaçını görmüş olduk. Bu kadarı bile son derece yararlı araçlar sunuyor. Özellikle zamanlama kritik süreçlerin izlenmesi, hata ayıklaması için çok yararlı. Kod bloklarının çalışma sürelerinin ölçülmesi, bir değişkene bir yerlerde olmaması gereken değerler yazılıyor olması gibi zorlu sorunların aşılması için bu kadarı dahi yeterli ama daha fazlası var.

Serinin gelecek bölümünde bu konsollara program içinden printf() komutu ile formatlanmış mesajlar göndermeyi göreceğiz. Artık bu mesajları UART port/FTDI/USB üzerinden PC ye göndermemize gerek kalmayacak.

Bu yayının sonu – Selçuk Özbayraktar Ağustos 2020