stm32f te debug ta breakpoint koyunca çalışıyor ,koymayınca düzgün çalışmıyor?

Başlatan koray692, 21 Mart 2015, 19:13:06

koray692

merhaba arkadaşlar stm32f407vg keil de debug yapıyorum breakpoint koyunca program çalışması gerektiği gibi çalışıyor ancak breakpointleri kaldırınca düzgün çalışmıyor nedenini bulamadım...

Gökhan BEKEN

Keil'deki debug'a asla güvenmeyin,
bir if bloğuna normalde girmiyor fakat debug'da giriyordu.
if'e girdiği yerden öncesine ve if'in içine led koyarak tekrar denedim, ne öncesindeki ledi yakıyordu, ne if'in içindeki ledi
yani hem girmediği yere giriyormuş gibi yapıyor, hem de girdiği halde ledi yakmıyordu.

Bunun dışında keil'de başka bir problem daha var. Geçen gün karşılaştım bu problemle.
Int değişken türünde 2 adet array tanımladım, iki dizinin de boyutu 15104
yani şöyle:
unsigned int dizi1[15104];
unsigned int dizi2[15104];

dizi1'in son elemanına birşey eşitlediğimde, dizi2'nin ilk elemanı değişiyordu.
Sebebi de şu, ikinci dizinin ram'deki adresi ilk dizinin son elemanının adresinden başlıyordu.
Mesela dizi1'in bellekteki adresi 0x20000000 olsun, ikincinin adresi normalde 0x20000000 + (15104*4) olması gerekir, yani 0x2000EC00 olması gerekir. Oysa o gidiyor 0x2000EBFD değerini alıyordu, yani 3byte geriden başlıyordu.
Bu sorunu aşamadım, araya 3byte'lık başka bir dizi koymama ramen düzelmemişti, ben de en sonunda, 30208 elemanlık tek dizi tanımladım, bütün işlemleri o tek dizide yaptım.
Keil'e asla güvenmem bu saatten sonra.
Özel mesaj okumuyorum, lütfen göndermeyin.

X-Fi

@koray692 fazladan breakpoint koyduğunuzda işlemci run moda girmez bu sebeple hepsini kaldır tuşuna tıklayıp tüm breakpointleri kaldırın tekrar yerleştirin. Debug modu çalıştırdıktan sonra en fazla 6 adet breakpoint kullanabilirsiniz daha fazla ihtiyacınız varsa debug moda girmeden önce ekleyin kodu o şekilde derleyip debug'ı çalıştırın bu şekilde 65536 tane eklenebilir hale geliyor.

Sayın @Gökhan BEKEN Keil programını nekadar yoğun kullanıyorsunuz bilmiyorum ancak sizin kullanıcı hatalarınızı söyleyebilirim. Keil debug modunda optimizasyon ayarları 0 da iken hiçbir satırı atlamadan volatile olarak debug yapar. Sanırım sizin sorununuz debug a uygun bir optimizasyon seçmemekten kaynaklanıyor. Memory management sistemi gayet iyi işliyor register oluşturmada static mantığını bir araştırın o zaman bu şekilde iç içe dizi tanımlamadığını göreceksiniz ve C/C++ ayarlarından warning seçimini All warning seçili olsun bu sayede de memory erişimindeki aksaklıkları size bildirecektir. Keil ARM şirketinin kendi ürettiği bir ide olduğu için ARM işlemcilerde en yeni ve gelişmiş armc complier versiyonunu kullanıyor. Bu tarz bir hatayı derleyiciye yıkmak amatörlük olur. Biraz daha üzerine düşer araştırırsanız bu hataların sebeplerini kendiniz de bulabilirsiniz.

iyi çalışmalar.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

Gökhan BEKEN

Optimizasyon sıfırda dururken, şunları yazıp derlediğim zaman:
volatile unsigned int dizi1[15104];
volatile unsigned int dizi2[15104];

int main(void)
{	

}

diyor ki:
Alıntı YapProgram Size: Code=520 RO-data=444 RW-data=0 ZI-data=1024 


Şunları yazıp derlersem:
volatile unsigned int dizi1[15104];
volatile unsigned int dizi2[15104];
int main(void)
{	
	unsigned int i;	
	for(i=0;i<15104;i++)dizi1[i]=0;
}

diyor ki:
Alıntı YapProgram Size: Code=544 RO-data=444 RW-data=0 ZI-data=121856 

Hem volatile yaptım, hem optimizasyonu sıfır yaptım, daha ne yapabilirim ki? For'daki işlemi yapmazsam ne derlerken ne debug'da gösteriyor.
Özel mesaj okumuyorum, lütfen göndermeyin.

X-Fi

Hocam bu konu forumda defalarca konuşuldu kodun içinde kullanmadığınız bir diziyi bu şekilde tanımlayıp bırakamazsınız. Tanımladınız ve kullanmıyorsunuz neden program size'ın değişmesini bekliyorsunuz? Ayrıca o alan volatile olarak bir kez ayırıldı başka registerlar oluşturursanız oraya dokunmayacak demektir. Bunların doğrulamasını anlamak için assembly kısmına geçin çünkü hafıza ayırmanın yolu bu değil Memory Areas kısmından IRAM kısımlarını doldurun daha özel alanlar gerekirse scatter file düzenlemesi yapılmalıdır. Ayırdığınız bloklara kod içinde erişmek istiyorsanız  __attribute__((at(0x2000xxxx)); ekiyle beraber tanımlarsanız hafızayı parse etmiş olursunuz. Tekrar söylüyorum bunlar program size ile alakalı şeyler değildir C deki object oriented sistemi soyut kavramlıdır. Yanlış yere takılmışsınız.
http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

FxDev

STM8'lerde Debug ile birlikte debugtan ötürü gecikmeler oluşuyordu. Özellikle de interruptlar fazlaca kullanılıyorsa bu durum gözle görülür hale geliyordu. STM32F0 lar hariç debuglarda muhteşem hızlılar.
Optimizasyonu kullanırken çok dikkatli olmak gerekiyor. Ben olabildiğince kullanmamaya özen gösteriyorum, diğer türlü her bir tanımlamanızı ince bir elekten geçirmek zorundasınız. Normal çalışan projenizi yerden kazanmak maksadıyla optimizasyona uğratırsanız bazı ihmallerden kodunuz çalışmayabilir. Özellikle kesmelerde ve static fonksiyonlarda buna çok dikkat etmek gerekiyor.

Keil ve IAR her ne kadar IDE'leri çok gösterişsiz olsa da şu an için gördüğüm çok iyi Debug arayüzüne sahip iki derleyici.
Forumda bazı bağnaz kişiler tarafından engellenip, atıldım. Tüm bu bağnaz kişilere rağmen Atatürkçülüğü sonuna kadar savunacağım; onlar da bağnazlıklarında boğulacaklar. Haberleşme için: info[at]firatdeveci.com / ©firatdeveci.com - ße Different Everytime!

z

CM3 işlemcilerde hele hele de C ile çalışıyorken kod optimizasyonuda açıksa breakpointler anlamsız davranabilir.

Conditional komut seti üzerine breakpoint gelirse şart gerçekleşsin gerçekleşmesin her hal ve karda işlemci durur. Bu da debug etmeyi zorlaştırır. ARM bu komut kümesi sayesinde güçlüdür ancak debug modunda bu komutlar başa dert olur.

Programınızı optimizasyon olmadan derleyin debug edin. Baktınız herşey yolunda daha sonra optimizasyonu devreye alırsınız.


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

Karamel

hocam optimizasyon tam olarak ne ise yariyor? codelara sIkIstirma gibi birsey mi yapiyor?

yukarida meftun hocamin verdigi code parcalarinda optimizasyon varmi?

sanirim yukarida kullanilmayan degiskenler derlenmemis? yoksa optimizasyon bumu?

z

Bir program satırı makine kodlarına çevrilirken bir kaç amaç güdülebilir. Bunlar;

- Kodum kısa olsun dolayısı ile roma daha çok kod yerleştirebileyim.
- Kodun uzunluğu kısalığı önemli değil çok hızlı çalışsın.
- Program makul uzunlukta ve hızda olsun. (Bu gerçekleniyormu hiç denemedim)

Bunlardan birisini seçersen kodun optimize edilmesini istiyorsun demektir.

Yukarıdaki mesajımda şöyle demişim.

Alıntı YapConditional komut seti üzerine breakpoint gelirse şart gerçekleşsin gerçekleşmesin her hal ve karda işlemci durur.

Şart gerçekleşsin gerçekleşmesin bu satırda hiç durulmayabilir de. İşte böyle durumlarda C satırlarına breakpoint koymak yerine asm satırlarına breakpoint koymak gerekebilir. Gene de optimize yazılmış kodları debug etmek çok zorlaşır hatta sırf debug edebilmek adına daha sonra silmek şartıyla aralara kod yazmak gerekebilir.




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