Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => KEIL => Konuyu başlatan: z - 11 Haziran 2014, 23:16:25

Başlık: Keil'de bu programi nasil debug edecegim.
Gönderen: z - 11 Haziran 2014, 23:16:25
Cip icin bir bootloader yazdim ve cipe yukledim. Cip resetlenince bu kodlarim calismaya basliyor.

Su anda cipime bu kodlari yukledim.

Artik bu proje ile hic isim kalmadigi icin Keil projeden ciktim.
----------------------

Baska bir klasor icinde yeni bir proje olusturdum. Bu projede kodlarim bootloaderdan daha sonraki adreslere  yerlesecek sekilde yapilandirma yaptim.

Bunu da cipe yukledim. Bootloderima dokunmadan bu kodlar da cipe yuklendi. Debug menuden yerlesimde sorun olmadigini da gordum.

Gel gelelim kodlari adim adim calistirmak istedigimde program counter 0x00000000 adresinden itibaren kod isletmeye kalkiyor.

Nerede hata yapiyorum?

Bootloader koduna ait projeyi calistirirsam sorun kalkar ama ben bir daha bootloader projesini acmak istemiyorum.

Bu amacla program counterin icerigini elle degistirerek ikinci prje kodlarimin basindan isletebiliyorum ama bu tur numaralara ihtiyac duymadan yapilabilmesi lazim.
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: X-Fi - 11 Haziran 2014, 23:31:05
Hocam debug ayarlarında Reset: Halt After Bootloader seçeneği var seçerseniz main başındaki vektör değiştirdiğiniz satırdan başlar.
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: z - 11 Haziran 2014, 23:37:30
Bahsettigin secenegi bulamadim.
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: X-Fi - 11 Haziran 2014, 23:44:34
Options->uitility->settings->debug->Reset options->Reset->Halt after bootloader
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: z - 12 Haziran 2014, 01:17:47
Malesef ST-Link de Options->uitility de setting butonu tiklanabildigi halde yeni pencere acilmiyor.

J-link secersem sorun yok.

Fakat bundan boyle ST-Link kullanacagim.


mesaj birleştirme:: 12 Haziran 2014, 01:34:07

Simdi asagidaki islemi Keil'de yapamayacakmiyim.

Atiyorum;

Yazmis oldugum programi

1) 0x08001000 adresinden itibaren flasha yuklenecek sekilde derle.
2) Debug etmek istersem 0x08000300 adresinden basla.

Debug menuye gectigimde Command satirindan PC icerigine otomatik olarak benim tanimladigim degeri yukleyecek bir batch dosya yapisi da isimi gorur.


Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: ErsinErce - 12 Haziran 2014, 10:15:59
zamanında reset state için yazmıştık hocam debug.ini dosyası onda değişiklik yapsanız?

LOAD %L INCREMENTAL
MAP 0x00000000, 0x0000000F
MAP 0x40000000, 0x400FFFFF
_WDWORD(0x00000000,_RDWORD(0x08000000));
_WDWORD(0x00000004,_RDWORD(0x08000004));
SP = _RDWORD(0x08000000); // Setup Stack Pointer
PC = _RDWORD(0x08000004); // Setup Program Counter
xPSR = 0x01000000; // Set flag "T"
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: z - 12 Haziran 2014, 11:30:23
Süpersin.
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: z - 12 Haziran 2014, 17:09:43
SP = _RDWORD(0x08000000);
PC = _RDWORD(0x08000004);


Debug ini dosyasına bu iki satırı koyunca debug menüsüne geçince tam istediğim oldu. Kodları adım adım işletince bootloader kodları ilerliyor ve nihayetinde asıl proje kodlarıma geliniyor. İstediğim de buydu.

Ancak;

Debug menüden reset tuşuna basarsam Debug.ini dosyasındaki init işlemi yapılmıyor. Debug ini sadece edit moddan debug moda geçildiğinde işe yarıyor.

Bu durumda Keili iki projeli modda çalıştıracağım yada bootloaderı kütüphane olarak kullanıp herdefasında yükleteceğim.

Bootloader kodlarının ayak altında olması riskli. O yüzden kaynak kod olarak proje dosyaları arasında yeralmasını kesinlikle istemiyorum. Öte yandan kütüphane kodu olarak projeye eklersem bu kez de her defasında çipe yüklenecek.

Benim derdim çipin içine 1 kere yükleyeyim. Daha sonra asıl proje dosyamda çalışma yapayıp yükleyeyim ve kolayca debug edebileyim.

Bir ara Can bunu soruyordu sanırım. Ordamısın Can. Aynı sorunla mı karşı karşıyayız?
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: z - 12 Haziran 2014, 18:41:56
Programı run ettiğimde işlemci 0x0000000 dan başlıyor. Haliyle benin reset rutinime girmiyor.

Halbuki 0x000... daki vektortör tablosundan reset vektörünü okuyup oraya dallanması gerekiyor.

-------------------

Yaptığım scatter dosyasında kodun yerleşeceği adresi 0x08001000 gibi belirttim. Derleme ve yükleme ardından kodlarım gerçekten de bu adrese yerleşiyor. Fakat kodların başlayacağı adres reset vektöründe kayırlı adres olması lazım onu tanımlamayı başaramadım.

Debug.ini de reset rutininin adresi bu, SP değerinde bu diye tanımladım. Debug moda girince tamam yaptığım tanım da işe yaradı. Ama debug menüde kodları durdurup reset yaparsam debug.ini deki tanımı bir daha kullanmıyor ve işlemci gene 0x00000000 dan kod çalıştırmaya kalkıyor.

Sorunum bu.

Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: ErsinErce - 12 Haziran 2014, 18:59:23
FUNC void Setup (void){
SP = _RDWORD(0x08001000);
PC = _RDWORD(0x08001004);
_WDWORD(0xE000ED08, 0x08001000); /vector tablosunda offset noktasını değiştiriyor
}


http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/CIHGEFHJ.html (http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337e/CIHGEFHJ.html)

debug'a girdikten sonra Setup() yapıp deneyin hocam
reset aldıktan sonra yine 0x08001000 den başlaması lazım

tabi vector tablosunun offseti değişirken kesmelerde sıkıntı oluşabilir.
Bu konuda da keilde programı derlerken kesmelerinde kaymış olabileceği 50% de çalışma ihtimali veriyor.
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: z - 12 Haziran 2014, 19:29:56
Vektör tablom değişmeyecekki.

Debug etmeyecek olsam işlemci resetlendiğinde reset vektöründe kayıtlı adresdeki rutine zıplayacak (Bootloader)
Bootloader çalışacak  bakacak flashda zaten hazır user.program var doğrudan user programına zıplayacak.

Bu çalışmada sorun yok.

Sorun debug ederken (debug menuye geçildiğinde debug.ini işletiliyor) debug.ini reset vektöründe kayıtlı adresi komut bazında PC içine yüklüyor. Dolayısı ile olması gerektiği gibi bootloader programı çalışıyor.

Ama reset yaparsam debug.ini çalıştırılmıyor. (Bence bu keilin bir bug'ı) Bunu elle çalıştırmak mümkünse elle çalıştırmak gerekiyor.

Fakat bu benim için eziyet. Eminim debug ederken işlemciyi resetledikten sonra sürekli olarak ini dosyasını çalıştırmayı unutacağım.

Kesin bir çözümü vardır. Reset butonuna basıldığında debug.ini de çalışsa sorun çözülmüş olacak aslında.
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: AsHeS - 12 Haziran 2014, 20:01:00
Alıntı yapılan: z - 12 Haziran 2014, 17:09:43
Bir ara Can bunu soruyordu sanırım. Ordamısın Can. Aynı sorunla mı karşı karşıyayız?

Bülent hocam eğer tek projeden 2 hex çıkartıp birini debug etmek istemekse hemen hemen aynı sorun ama ben daha çözemedim. Bazı IDE'lerde kodun flash ve/veya romda ki adresini elinizde ki koda attach edip debug edebiliyorsunuz (MULTI vs..) fakat Keil'de bu yapılabiliyor mu emin değili.
Başlık: Ynt: Keil'de bu programi nasil debug edecegim.
Gönderen: z - 12 Haziran 2014, 20:21:35
Acaba scatterda ben mi bir hata yapıyorum.

Aşağıdaki tanım, kodlarımın 0x8001000 daresinden itibaren yerleşmesini ve kodların bu adrese uygun şekilde derlenmesini sağlıyor.

Gel gelelim execution adress her nedense 0x0000000 oluyor.

LR_IROM1 0x08001000 0xE000              ; load region size_region
{   
     ER_IROM1 0x08001000 0x0000E000     ; load address = execution address
       { 
           *.o (User, +First)
           .ANY (+RO)
       }
   
     RW_IRAM1 0x20000000 0x00005000        ; RW data
       {
          *.o (ZiosRam)
          .ANY (+RW +ZI)
      }
}