- Katılım
- 24 Şubat 2018
- Mesajlar
- 24,930
Gömülü sistemlerde eğer üzerinde çalıştığınız programda birden fazla süreç paralel olarak çalışıyor, veya program ile kesmelerin etkileşimi sonucunda oluşan sorunları analiz etmek istiyorsanız, klasik debugger programlarının yararları çok sınırlıdır, çünkü programı bir satırda durduğunuz anda bütün timing çöker, çünkü bütün süreçler ve kesmeler durur. Debugger bu durumlarda ancak şu işe yarar: Olan olmuş, program çökmüş veya takılıp kalmış bir yerde. Artık debugger'i kullanarak program üzerinde otopsi yaparsınız
Yani program datalarını inceleyerek oradan bir ip ucu elde etmeye çalışırsınız.
Böyle durumda kullanılabilecek etkili tekniklerden birisi GPIO işaretlemedir. İlgilenilen süreçlerdeki stratejik yerlerde bazı pinleri set/reset edersiniz, sonra da osiloskop ile bu pinlerin durumuna bakıp programın çalışmasını canlı olarak gözlemleyebilirsiniz.
Mesela benim üzerinde çalıştığım program FreeRTOS üzerinde çalışıyor ve şu anda iki tane süreç (Task) ve bir kesme olan kısmına odaklanıyorum. Task1 bir buffer'a veri yazıyor ve bu buffer'in seri porta yazılma işlemini başlatıyor. Yazma işlemi yudum yudum yapılıyor, buffer çok büyük. Kesme ise bir yudum yazılınca Task2 yi tetikliyor, Task2 de buffer'dan ilave veri yazıyor. sonra tekrar bir yudum yazılması gerçekleşiyor, kesme çalışıyor, Task2 yi tetikliyor ve süreç buffer'in tamamının yazılması bitene kadar devam ediyor.
Bu yapının doğru çalıştığını anlamak için Task1, Task2, ve Kesme rutininde üç ayrı GPIO işaretleme kullandım.
Eflatun: Task1 in buffer'a ilk veriyi yazması.
Sarı: Kesme rutini (transmit buffer empty interrupt)
Mavi: Task2 (yeni veri yazıyor)
Yeşil: Seri porttan transmit edilen veri
Dikkat edilirse, transmit buffer empty interrupt'ı son byte yazılırken devreye giriyor, yani orada bir byte'lik bir avanta kazanıyoruz
Eğer transmit complete interrupt kullansaydım, son byte da yazıldıktan sonra veri ilave edebilecektim.

Böyle durumda kullanılabilecek etkili tekniklerden birisi GPIO işaretlemedir. İlgilenilen süreçlerdeki stratejik yerlerde bazı pinleri set/reset edersiniz, sonra da osiloskop ile bu pinlerin durumuna bakıp programın çalışmasını canlı olarak gözlemleyebilirsiniz.
Mesela benim üzerinde çalıştığım program FreeRTOS üzerinde çalışıyor ve şu anda iki tane süreç (Task) ve bir kesme olan kısmına odaklanıyorum. Task1 bir buffer'a veri yazıyor ve bu buffer'in seri porta yazılma işlemini başlatıyor. Yazma işlemi yudum yudum yapılıyor, buffer çok büyük. Kesme ise bir yudum yazılınca Task2 yi tetikliyor, Task2 de buffer'dan ilave veri yazıyor. sonra tekrar bir yudum yazılması gerçekleşiyor, kesme çalışıyor, Task2 yi tetikliyor ve süreç buffer'in tamamının yazılması bitene kadar devam ediyor.
Bu yapının doğru çalıştığını anlamak için Task1, Task2, ve Kesme rutininde üç ayrı GPIO işaretleme kullandım.
Eflatun: Task1 in buffer'a ilk veriyi yazması.
Sarı: Kesme rutini (transmit buffer empty interrupt)
Mavi: Task2 (yeni veri yazıyor)
Yeşil: Seri porttan transmit edilen veri
Dikkat edilirse, transmit buffer empty interrupt'ı son byte yazılırken devreye giriyor, yani orada bir byte'lik bir avanta kazanıyoruz
