Keil'de bu programi nasil debug edecegim.

Başlatan z, 11 Haziran 2014, 23:16:25

z

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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

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.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

X-Fi

Options->uitility->settings->debug->Reset options->Reset->Halt after bootloader
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

z

#4
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.


Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

#5
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"

z

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

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?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

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.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

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

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.

z

#10
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.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

AsHeS

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.

z

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)
      }
}
Bana e^st de diyebilirsiniz.   www.cncdesigner.com