BSRR ve Kod optimizasyonu hakkında sorun ?

Başlatan camby, 06 Ocak 2013, 00:45:38

camby

F4 discovery üzerinde koşan şu şekilde bir kodum var :

#define WR_0	GPIOE->ODR &=~ (1<<13);		// WR : 0
#define	WR_1	GPIOE->BSRRL = (1<<13);		// WR : 1

	for(i=0;i<(240*320);i++)
	{
			WR_0							// WR : 0 , Write 
			GPIOE->BSRRH = 0xFF;
			GPIOE->BSRRL = R;
			WR_1
			
			WR_0							// WR : 0 , Write 
			GPIOE->BSRRH = 0xFF;
			GPIOE->BSRRL = G;
			WR_1
			
			WR_0							// WR : 0 , Write 
			GPIOE->BSRRH = 0xFF;
			GPIOE->BSRRL = B;
			WR_1
	}



Optimizasyon açık iken sadece en üstteki GPIOE->BSRRH = 0xFF; satırı derlenmiyor. Ve program düzgün bir şekilde çalışmıyor.

Optimizasyon kapalı iken derleniyor.


GPIO ve BSRR ' ler hepsi header dosyalarında volatile olarak tanımlanmış , derleyici neden bu satırları atlıyor ?

camby

hangi dosya oluyor ? .o uzantılı dosyalar mı ?

camby

proje parça parça , sorunun olduğu .c dosyasının object dosyası yeterli mi ?

.o dosyaları nasıl görüntüleniyor , not defterinde düzgün görüntüleyemedim


z

debug penceresinde

for(i=0;i<(240*320);i++) satırından bir kac satır oncesinden başlayacak şekilde asm kodların fotosunu koyabilirmisin?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

camby

Durum yukarıdaki şekilde :

WR_0 satırı , yukarıdaki 4 asm satırdan oluşuyor. STRH olan son satır işlenince 293'e atlıyor.





1. bölüm de kendini tekrarlamış 3 kere . ( parçaları 1-2-3 diye işaretledim )


z

    for(i=0;i<(240*320);i++)
    {
            WR_0                     // WR : 0 , Write
            GPIOE->BSRRH = 0xFF;
            GPIOE->BSRRL = R;
            WR_1
           
            WR_0                     // WR : 0 , Write
            GPIOE->BSRRH = 0xFF;
            GPIOE->BSRRL = G;
            WR_1
           
            WR_0                     // WR : 0 , Write
            GPIOE->BSRRH = 0xFF;
            GPIOE->BSRRL = B;
            WR_1
    }


for(i=0;i<(240*320);i++) bu satırın bir kaç hatta 5..6 asm satır üstünü,
en alttaki     }   satırının da 5..6 satır altını da görmek lazım.

Optimizasyon işlemine daha C satırına gelinmeden başlanıyor.

Yani C satırlarla ASM satırlar tam örtüşmüyor. Bu nedenle derlenmediğini söylediğin C satırı gözden kaçıyor olabilir.

optimizasyonu kapadiğında sen ne yazdıysan ona ait çıplak kod C satırlarla örtüşüyor.

Sendeki Keil'in versiyonu nedir? Bendeki ile aynı ise yazıp makinemde görmem daha pratik olacak.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

camby

MDK-lite : 4.53.00

compiler vs. : v4.1.0.894(evaluation)

Yeni versiyonu da indiriyorum şimdi , deneme sürümünde kod  uzunluğu dışında kısıtlama yok diye biliyordum..

Hocam yazmaya uğraşmayın , proje dosyasını yollayabilirim direk.

z

#8
MDK Lite 4.60.0.0
Diğerleri 5.02.0.28

32K limitli.

sorunsuz derleniyor ve 3. optimizasyonda her hangi bir eksiklik yok.

Dediğim gibi C kodlarla Asm kodlar kayık. Adımlama işlemini C de değilde ASm de yaparsanız sorun olmadığını göreceksin.

Bu durumda sorunun nerede olduğuna sen karar vereceksin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

camby

#9
programı güncel versiyonlarına getirdim.

optimizasyon açık ve lvl3 , döngüye girmeden önce ve döngüye girdikten sonra derlenmeyip atlanan kodlar var , çözümü bulamadım hala.




mesaj birleştirme:: 06 Ocak 2013, 22:22:43

Ek:
Direk donanım ile debug yapıyorum :

For döngüsü ilk turundada içindeki kodlar derlenmiyor , ilk turdan sonra satır satır işlemeye başlıyor.

camby


camby

hocam az önce ilaçladım sonuç aynı

camby

hocam ne yaptıysam optimizasyon açıkken düzgün kodu üretemedim.

son olarak yukarıda define olarak tanımladığım WR_0 , WR_1 gibi kullanımları kaldırdım , düzeldi . Şimdi sorunsuz çalışıyor. Acaba define kullanım sayısında sınır mı var diye de düşündüm .
Yardımlarınız için teşekkürler.

Optimizasyonlar kapalı iken aldığım kayıt : )  :

https://www.picproje.org/index.php/topic,44424.new.html#new