Back to Blog

STM32CubeIDE’de Manuel Eklenen FreeRTOS V10 ile SEGGER SystemView Kullanımı: RTT Buffer Sorunu ve Çözümü

STM32CubeIDE içerisine manuel olarak eklenen FreeRTOS V10 ile SEGGER SystemView entegrasyonu sırasında karşılaştığım RTT buffer’ın hiç dolmaması ve kayıt alınamaması problemini ele alıyorum. Sorunun gerçek nedenini, vSetVarulMaxPRIGROUPValue() fonksiyonunun neden gerekli olduğunu, port.c dosyasında yapılan değişiklikleri ve RTT Single Shot yöntemiyle .SVdat kayıtlarının nasıl oluşturulacağını adım adım açıklıyorum. Ayrıca yaşadığım hata sürecini, çözümünü ve çevrimdışı (offline) SystemView analizinin nasıl yapılacağını anlattım.

July 5, 2026 Updated: July 13, 2026 8 min read
STM32CubeIDE’de Manuel Eklenen FreeRTOS V10 ile SEGGER SystemView Kullanımı: RTT Buffer Sorunu ve Çözümü


Gerçek zamanlı işletim sistemi (FreeRTOS) kullanan gömülü sistemlerde, çalışan task’ların davranışını analiz edebilmek hata ayıklama sürecini önemli ölçüde kolaylaştırır. Task geçişlerini, interrupt sürelerini, scheduler davranışını ve işlemci kullanımını görebilmek için kullanılan en başarılı araçlardan biri SEGGER SystemView’dir.

STM32CubeIDE üzerinde geliştirdiğim projede FreeRTOS’u CubeMX üzerinden eklemek yerine, FreeRTOS V10’u manuel olarak projeye dahil ettim. Daha sonra SEGGER RTT ve SEGGER SystemView dosyalarını ekleyerek sistemden zamanlama kayıtları almayı hedefledim.

Ancak beklediğim gibi olmadı.

Her şey doğru görünmesine rağmen SystemView hiçbir kayıt oluşturmuyor, RTT buffer sürekli boş kalıyor ve .SVdat dosyası oluşturulamıyordu.

Bu yazıda yaşadığım problemi, sorunun gerçek nedenini ve uyguladığım çözümü adım adım anlatıyorum.


Proje Yapısı

Bu çalışmada kullanılan yapı aşağıdaki gibidir.

  1. STM32CubeIDE
  2. STM32F4 serisi mikrodenetleyici
  3. FreeRTOS V10 (manuel eklenmiş)
  4. SEGGER RTT
  5. SEGGER SystemView
  6. ST-Link ile Debug

Burada önemli nokta FreeRTOS’un CubeMX tarafından değil, manuel olarak projeye eklenmiş olmasıdır.


İlk Karşılaşılan Problem

Projeye;

  1. FreeRTOS
  2. SEGGER RTT
  3. SEGGER SystemView

başarıyla eklendi.

Kernel patch’i de uygulandı.

Proje sorunsuz derleniyor ve FreeRTOS düzgün şekilde çalışıyordu.

Task’lar çalışıyor,

Queue’lar çalışıyor,

Semaphore’lar çalışıyor,

Scheduler düzgün çalışıyordu.

Fakat SystemView tarafında hiçbir kayıt oluşmuyordu.

RTT Viewer açıldığında herhangi bir problem görünmüyor olmasına rağmen;

_SEGGER_RTT.aUp[1].WrOff

değeri sürekli 0 olarak kalıyordu.

Dolayısıyla Memory Browser üzerinden export edilecek hiçbir veri oluşmuyordu.


İlk Düşündüğüm Sebep

İlk olarak sorunun FreeRTOS V10’dan kaynaklandığını düşündüm.

Çünkü SEGGER dokümantasyonunda FreeRTOS V10 için kernel tarafında bazı değişikliklerin (patch) uygulanması gerektiği belirtilmektedir.

Bu nedenle gerekli patch dosyalarını uyguladım.

Patch gerçekten gereklidir.

Çünkü FreeRTOS’un scheduler olaylarını SystemView’in anlayacağı trace event’lerine dönüştürmesini sağlar.

Ancak patch uygulanmasına rağmen kayıt alınamıyordu.


Asıl Problem

Yaptığım araştırmalar sırasında izlediğim teknik bir eğitim videosunda problemin gerçek nedeni anlatılıyordu.

Sorun FreeRTOS değildi.

Sorun SystemView’in ihtiyaç duyduğu Priority Group (PRIGROUP) bilgilerinin oluşturulmamasıydı.

Bunun sonucu olarak SystemView trace oluşturamıyor ve RTT buffer içerisine hiçbir veri yazamıyordu.

Dolayısıyla;

_SEGGER_RTT.aUp[1].WrOff

değeri sürekli sıfır kalıyordu.

Bu nedenle export edilecek kayıt oluşmuyordu.


Çözümün İlk Adımı

Main fonksiyonunda SystemView başlatılırken aşağıdaki kodların çalıştırılması gerekiyor.

DWT->CTRL |= (1UL << 0);

SEGGER_SYSVIEW_Conf();

vSetVarulMaxPRIGROUPValue();

SEGGER_SYSVIEW_Start();


Buradaki her satırın farklı bir görevi vardır.


DWT’nin Aktif Edilmesi

DWT->CTRL |= (1UL << 0);

Bu satır Cortex-M işlemcisinin Data Watchpoint and Trace (DWT) birimini aktif eder.

SystemView zaman ölçümlerini bu donanım sayacı üzerinden yaptığı için DWT aktif edilmeden doğru zaman bilgisi elde edilemez.


SEGGER Yapılandırması

SEGGER_SYSVIEW_Conf();

SystemView kütüphanesini yapılandırır.

RTT üzerinden kullanılacak buffer’lar ve kayıt ayarları hazırlanır.


Kritik Fonksiyon

vSetVarulMaxPRIGROUPValue();

Problemi çözen asıl satır budur.

Bu fonksiyon eklenmediğinde;

  1. FreeRTOS çalışmaya devam eder.
  2. Scheduler çalışır.
  3. Task’lar çalışır.

Ancak SystemView buffer’a hiçbir kayıt yazmaz.

Benim yaşadığım problem tam olarak buydu.


Kayıt Başlatılması

SEGGER_SYSVIEW_Start();

SystemView trace toplamaya başlar.


port.c Dosyasındaki Değişiklik

Bu fonksiyon FreeRTOS’un standart kaynak kodunda bulunmadığı için,

portable/GCC/ARM_CM4F/port.c


dosyasına manuel olarak eklendi.

Eklenen fonksiyon aşağıdaki işlemleri yapmaktadır.

  1. İşlemcinin kaç adet interrupt priority biti desteklediğini belirler.
  2. Donanımın gerçek priority maskesini hesaplar.
  3. configMAX_SYSCALL_INTERRUPT_PRIORITY değerini doğrular.
  4. ucMaxSysCallPriority değişkenini oluşturur.
  5. ulMaxPRIGROUPValue değişkenini hesaplar.
  6. NVIC Priority Group bilgisini oluşturur.
  7. Değiştirilen interrupt register’ını eski haline getirir.

Aslında bu kod FreeRTOS’un Cortex-M portunda bulunan doğrulama kodlarından türetilmiştir.

Burada amaç scheduler başlamadan önce SystemView’in ihtiyaç duyduğu PRIGROUP bilgisini hazırlamaktır.


Bu Değişiklik Neden Çalışıyor?

SEGGER SystemView interrupt önceliklerini doğru yorumlamak zorundadır.

Bunun için FreeRTOS’un kullandığı Priority Group bilgisine ihtiyaç duyar.

Bu bilgi oluşturulmazsa;

  1. ISR öncelikleri hesaplanamaz.
  2. Trace event’leri oluşturulamaz.
  3. RTT buffer boş kalır.

Dolayısıyla kayıt alınamaz.

vSetVarulMaxPRIGROUPValue() fonksiyonu bu eksik bilgiyi oluşturarak SystemView’in doğru çalışmasını sağlar.


RTT Buffer’dan Kayıt Alma

Problemin çözülmesinden sonra artık RTT buffer veri üretmeye başladı.

Kayıt almak için şu adımlar izlenebilir:

  1. Proje Debug modunda başlatılır.
  2. Sistem birkaç saniye çalıştırılır.
  3. Debug durdurulur, değişken izleme penceresinde buffer adresi(_SEGGER_RTT.aUp[1].pBuffer) ve segger kaydı uzunluğu (_SEGGER_RTT.aUp[1].WrOff) girilerek değerleri not alınır.
  4. Memory Browser penceresi açılır, buradan ilgili buffer adresine erişilecek.
  5. _SEGGER_RTT.aUp[1].pBuffer adresi Memory Browser penceresinde ilgili yere girilerek bu adrese gidilir.
  6. Memory Browser penceresindeki Export butonuna tıklanarak yeni bir mini pencere açılır(çıktı dosyası alma penceresi).
  7. Bu pencerede yine buffer adresi(_SEGGER_RTT.aUp[1].pBuffer) ve segger kaydı uzunluğu (_SEGGER_RTT.aUp[1].WrOff) değerleri girilir.
  8. Dosya tipi RAW Binary seçilir.
  9. Dosya .SVdat uzantısıyla kaydedilir.
  10. SystemView üzerinden bu oluşturulan dosya açılarak analiz edilir.

Bu yöntem sayesinde canlı kayıt alınamasa bile RTT buffer üzerinden çevrimdışı (offline) analiz yapmak mümkündür.


port.c Dosyasının Düzenlenmesi

Bu dosyanın düzenlenmesini anlatan video: https://youtu.be/32Tu01EpQvc?si=bIJMj4S531eJbqpF


Sonuç

Bu çalışmada STM32CubeIDE içerisine manuel olarak eklenen FreeRTOS V10 ile SEGGER SystemView entegrasyonu gerçekleştirildi. İlk aşamada problemin FreeRTOS V10’un SystemView ile uyumsuzluğundan kaynaklandığı düşünülse de, yapılan incelemeler sonucunda asıl sorunun RTT buffer’ın hiç dolmaması olduğu görüldü.

Kernel patch’lerinin uygulanması entegrasyon için gerekli olsa da tek başına yeterli değildir. SystemView’in doğru çalışabilmesi için DWT’nin etkinleştirilmesi, SystemView’in doğru sırayla başlatılması ve özellikle vSetVarulMaxPRIGROUPValue() fonksiyonu ile ulMaxPRIGROUPValue değerinin scheduler başlamadan önce hesaplanması gerekmektedir. Ayrıca bu amaçla FreeRTOS’un port.c dosyasına ilgili fonksiyonun eklenmesi de çözümün önemli bir parçasıdır.

Bu değişiklikler sonrasında RTT buffer veri üretmeye başlamış, _SEGGER_RTT.aUp[1].WrOff değeri artmış ve buffer içeriği .SVdat dosyası olarak dışarı aktarılarak SEGGER SystemView üzerinde task geçişleri, interrupt süreleri ve scheduler davranışı başarıyla analiz edilebilmiştir.

Bu deneyim, gömülü sistemlerde yalnızca gerekli kütüphaneleri projeye eklemenin yeterli olmadığını; özellikle gerçek zamanlı izleme araçlarının, işlemci mimarisi ve işletim sistemi çekirdeğiyle olan etkileşiminin doğru yapılandırılmasının da en az entegrasyon kadar önemli olduğunu göstermektedir.

Related Posts