SEGGER JLink Ultra+

taydin

Timur Aydın
Staff member
Katılım
24 Şubat 2018
Mesajlar
25,529
Geçen hafta e-component ile satın aldığım JLink Ultra+ geldi. Aslında elimde klon Jlink var bir tane, fiyatı 100 TL iken almıştım, ama denemeye fırsat olmadı. Üzerinde çalıştığım Renesas RA6M2 işlemcinin üreticisinin önerdiği E2 emülatörü kullandım bugüne kadar.

IMG_20230909_111659.jpg


IMG_20230909_111719.jpg
 
Klonun genel olarak iş gördüğü belirtiliyor, ama ben hem SEGGER'in bütün yazılım ürünleri ile uyumlu olacağı, hem de çok daha hızlı çalışacağı beklentisi ile Ultra+ modelini aldım. Öncelikle, yanında gelen JTAG kablosunu, benim bağlayacağım karttaki emülatör konnektörü ile uyumlu hale getirdim.

IMG_20230909_111759.jpg


IMG_20230909_111933.jpg
 
Sonra şimdiye kadar kullandığım, eclipse bazlı e2_studio ile deneyip programın işlemciye yüklenmesi ve programın ilk satırındaki breakpoint'ta durması için geçen süreyi ölçtüm. Süre değişken, ama en az 15 saniye sürüyor, bazan çok daha uzun sürdüğü de oluyor. e2_studio bir Java programı, javanın o alışılageldik yavaşlığını ve herşeyin belirsiz bir zaman almasını görüyorsun. Sonra programa step yaptırınca, bir satır bazan yarım saniyede işliyor, bazan 2 saniyede işliyor.

Sonra da emülatör arabirim hızını doğrudan maksimum değer olan 50 MHz değerine getirdim. SEGGER'in kendi debugger'i olan Ozone yazılımının da linux sürümünü kurdum. Programın yüklenip ilk satırda durması 3 saniyenin altında bir zaman tutuyor. Program üzerinde adım adım gitme için ise zaman ölçümü yapmak mümkün değil, F10 tuşuna bastığın anda bir sonraki satırda oluyorsun. Sadece bu hız artışı bile çok zaman kazandıracak bana.
 
Ozone debugger'i doğrudan FreeRTOS işletim sistemine destek veriyor. Hangi task'lar çalışıyor, öncelikleri nedir, durumları nedir ve ne kadar stack kullanıyorlar görebiliyorsun.

1694249369685.png
 
Debugger ile her C satırına karşılık gelen assembly'yi de görmek mümkün. Öğrenmek için çok faydalı bir özellik. Mesela burada assembly olarak önce R0 registerine 1 yüklenerek usb_vbus_set fonksiyonu çağrılıyor.

1694249519546.png
 
Bunun dışında debugger'in kendi script dili var. Yapısı C ye çok benziyor. Her türlü işlemi otomatikleştirmek mümkün. Mesela böyle boot loader ile yüklenen programlarda, debugger hemen programı çipe yükleyip sonrasından çalıştırması mümkün değil, çünkü program çipin normal reset vektöründen çalışmaya başlamıyor. Farklı bir bellek adresine yükleniyor ve boot loader bu adrese jump ediyor. O yüzden program yüklendikten sonra stack pointer (SP) ve program counter (PC) registerlerine yükleme yapmak gerekiyor. Oluşturduğum debug projesine bakınca, SEGGER zaten bu senaryoyu öngörmüş ve tam olarak bu işi yapan bir script parçasını koymuş oraya. Benim sadece baştaki comment'leri kaldırmam yeterli oldu

Kod:
/*********************************************************************
*
*      AfterTargetDownload
*
* Function description
*   Event handler routine. Optional.
*   The default implementation initializes SP and PC to reset values.
*
**********************************************************************
*/
void AfterTargetDownload (void) {

  unsigned int SP;
  unsigned int PC;
  unsigned int VectorTableAddr;

  VectorTableAddr = Elf.GetBaseAddr();
  //
  // Set up initial stack pointer
  //
  if (VectorTableAddr != 0xFFFFFFFF) {
    SP = Target.ReadU32(VectorTableAddr);
    Target.SetReg("SP", SP);
  } else {
    Util.Error("Project file error: failed to set initial SP", 1);
  }
  //
  // Set up entry point PC
  //
  PC = Elf.GetEntryPointPC();

  if (PC != 0xFFFFFFFF) {
    Target.SetReg("PC", PC);
  } else if (VectorTableAddr != 0xFFFFFFFF) {
    PC = Target.ReadU32(VectorTableAddr + 4);
    Target.SetReg("PC", PC);
  } else {
    Util.Error("Project file error: failed to set entry point PC", 1);
  }
}
 
Hayırlı olsun. Peki klon olanla arasında ciddi hız farkı var mı?
 
Timur Hocam, clone JLink'e official firmware yukleyerek orijinal hale getirenler vardi. Siz daha once denediniz mi?


Not : Bu arada siz 100 Tl'ye almisim deyince huzunlendim. Simdi klonu dahi 1.500 TL'ye satiyorlar.
 
Klon ile arasında hız farkı var, ama e2_studio kadar kötü değil. Yalnız SEGGER'in yazılımları klonu hemen algılıyor. Şimdi algılayınca da adam istese bazı özellikleri devre dışı bırakabilir, yanlış çalışacak şekilde tanımlayabilir, veya başka tedbirler de alabilir. O yüzden orijinal olunca en azından SEGGER yazılımlarını eksiksiz ve sorunsuz kullanabilme olanağı elde etmiş oluyorsun.

Bir de RTT denen bir özellik var SEGGER'in. Bu özellik klonlarla da çalışıyor, ama bant genişliği anlamında çok büyük fark var. Ultra+ ile 2 MByte/s lik bir RTT bant genişliği elde etmiş oluyorsun, bunun da anlamı kod timing'ini neredeyse hiç değiştirmeyerek debug logging yapabilirsin. Bana çok lazım olan bir özellik bu.
 
Klon ile arasında hız farkı var, ama e2_studio kadar kötü değil. Yalnız SEGGER'in yazılımları klonu hemen algılıyor. Şimdi algılayınca da adam istese bazı özellikleri devre dışı bırakabilir, yanlış çalışacak şekilde tanımlayabilir, veya başka tedbirler de alabilir. O yüzden orijinal olunca en azından SEGGER yazılımlarını eksiksiz ve sorunsuz kullanabilme olanağı elde etmiş oluyorsun.

Bir de RTT denen bir özellik var SEGGER'in. Bu özellik klonlarla da çalışıyor, ama bant genişliği anlamında çok büyük fark var. Ultra+ ile 2 MByte/s lik bir RTT bant genişliği elde etmiş oluyorsun, bunun da anlamı kod timing'ini neredeyse hiç değiştirmeyerek debug logging yapabilirsin. Bana çok lazım olan bir özellik bu.
Bu RTT konusunda, gördüğüm kadarıyla RTT chip içindeki bir ram buffera değişkenleri veya stringleri basıyor. bu sayede işlem sadece memcopy kadar vakit alıyor. arkada sürekli çalışan debug donanımı ise bu ram adreslere erişip eğer dolu ise jlink üzerinden pc'ye aktarıyor.

bu özelliği interrupt içinde değişkenleri takip etmek için vs kullanıyorum ve gerçekten de çalışma zamanlamasını hiç etkilemiyor. hiç etkilemiyor derken belki 50-100 ns değişiyordur.

klon cihazlarda da sistem aynı - cihaz klon olduğu için 2mbyte ile okuyamayabilir ama 200kbit okuduğunu düşünelim. ben oradaki ram bufferi tamamen doldurmadığın sürece cpu için iş akışında bir fark olmaması lazım. buffer dolarsa da RTT default olarak o bölgeye yeni bir bilgi yazmıyor. o ram alanına erişip veriyi çeken ise chip içindeki debug donanımı. bunu nasıl yapıyor bilmiyorum ama mcu instruction cycledan çalmıyor olması lazım.

yani klon veya EDU modeli. yavaş olan seriler diyelim. bunların RTT'nin mcu içindeki çalışma zamanlamasına bu durumda bir etkisi olmaması gerekir diye düşünüyorum ?
 
Elimde sadece Ultra var ve karşılaştırma imkanım yok malesef. Sonradan RTT yi koddan çıkardım ve UART üzerinden debug bilgilerini gönderecek şekilde logging modülünü değiştirdim. Böylece sahada da log verisi toplamak mümkün hale geldi. Malum müşteriye JTAG podu tak diyemezsin, ama USB/UART dönüştürücü ile PC'den log verisi toplayabilirsin. Hızı da ona göre yapılandırırsın. Benim linux PC ile 4 Mbps UART hızı elde edebiliyorum. Windows kullanan müşterilerde 900 kbps yi aşamadık.
 
tabi hepsi yapılabilir. ben genelde 1mbit debug uart kullanıyorum.
benim aklıma takılan RTT fonksiyonunun farklı donanımlarda farklı hızlarda çalışıp çalışmayacağıydı.
segger dökümanlarına göre RTT mcu içinde sadece bir memcpy kadar vakit harcamalı.
şurada fark olabilir ben 200kbit ile okurken buffer dolarsa veri kaçırabilirim. 4mbit ile okurken veri kaçırma ihtinali çok daha az olur.
 
faydalı bir log elde etmek için, gönderilecek string'i çok zengin içeriklerle şekillendirmen gerekiyor. Mesela ben vsnprintf kullanarak log string'ini oluşturuyorum. Asıl süreyi de bu tuttuğu için, RTT nin sağladığı süre kazançlarının pek faydası olmuyor. Örnek log kullanımı


C:
static int32_t fat_eeprom_write_blocks(uint8_t* buffer,
                                       uint32_t sector_address,
                                       uint32_t count,
                                       FF_Disk_t* disk)
{
    debug_log(LOGMASK_INFO, 0, "buffer = %p, sector_address = 0x%08X, count = 0x%08X, disk = %p\n",
              buffer, sector_address, count, disk);

    return FF_ERR_IOMAN_DRIVER_FATAL_ERROR;
}

Bu tip loglarda en önemli varsayım, logların "burst" şeklinde olduğu. Yani kısa aralıklarla yoğun loglama, sonra nispeten sessizlik. Böylece uygun buffer boyutu seçilince veri kaçırmadan tüm loglar toplanabiliyor. Ama gene de veri kaçtığını da algılayıp raporlamak lazım. Mesela log buffer'a kaç byte girdi, kaç byte UART üzerinden gönderildi? Bu iki rakamın durağan durumda eşit olması lazım.
 
yanlış hatırlamıyorsam RTT içinde printf fonksiyonlarını pc tarafında halleden bir yapı da vardı.


1754168826404.png
 
Basit işler için (upload, debug, uart) nal kadar J-link yerine Aliexpressten aldığım 1.22 dolarlık DAPlink de iş görüyor. ARM'ın kendi CMSIS-DAP açık protokolünü ve yazılımını kullanıyor. Sanırım iletişimi J-link kadar hızlı değil.

Hatta biri bunu ESP ile wireless hale getirdi. Satılsa onu da alırım https://github.com/windowsair/wireless-esp8266-dap
 
ufak programlayıcı lazımsa stlink v3-mini var. esp8266 kadar yer kaplıyor. tabi o kadar ucuz değil.15 dolar civarı olması lazım.

daplink ile hiç debug yapmadım ama jlink ile adım adım debug yaparken çok akıcı ve sorunsuz ilerliyor. live watch değişkenler çok yüksek hızda update ediyor vs. aynı akıcılık ve hızı stlink V3 ile sağlayamıyorum.
 

Forum istatistikleri

Konular
8,077
Mesajlar
132,934
Üyeler
3,220
Son üye
bafrali

Son kaynaklar

Son profil mesajları

erdemtr55 taydin erdemtr55 wrote on taydin's profile.
Merhaba Taydin bey,
Gruba spms serisi yapıcak mısınız?
ben 3 sargılı toroid ile 2 adet flyback sürücek bir devre yapmayı düşünüyorum.size soracak sorularım vardı?
Mutluluğun resmi illa güzel çizilmiş tablo olmak zorunda değil.Bazen basit bir çizgi,doğru bir renk,yada küçük bir detay
Python Geliştirmeye eklediğim yapay zeka sunucusu, yeni başlayanlar için roket etkisi
Bir insanın zeka seviyesinin en kolay tesbiti, sorduğu sorulardır.
yapay zeka interneti yedi bitirdi, arama motoru kullanan, forumlara yazan kaldı mı ?
Back
Top