STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

CLR

Alıntı yapılan: gerbay - 04 Kasım 2011, 11:57:34
önemli olan kodlama tekniğini iyi bilmek, "veri yapıları ve algoritmalar" konusuna hakim olmak.. kodlama tekniğiniz çok iyi ise, 2 cycle az olmuş çok olmuş artık bir önemi kalmadı..

Düşüncene aynen katılıyorum.

Bit banding olayını 2 yıl önce kendi testlerimle sonlandırmıştım zaten. Artık bit banding hakkında yazmıyacağım.
 
Knowledge and Experience are Power

z

@eemkutay dur kaçma işin aslını yanlış öğrenmişsin ve konuyu 2 sene önce yanlış sonlandırmışsın.

@Gerbay, başlık cortex şamatası başlığı. Bu konuların tartışıldığı bir başka Türkçe sayfa biliyorsan yazmayalım.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

eemkutay hocam yazdıklarımız neredeyse aynı ama sizinki nasıl bu kadar az yer kaplıyor merak ettim,
sizin kodlarıda derledim benimkiyle aynı sonuç çıkardı (optimizasyon seviyesi farketmiyor hep aynı kod çıkıyor),
acaba IAR'ın compiler'ı bu konuda daha mı iyi?

z

@Ersinerce

Soruda değişiklik yapmam gerekiyor demiştim.

Port adındaki 8 bitlik Portumuzun P7, P5, P3 ve P1 bitleri interrupt rutinleri tarafından update edilmektedir.

Geriye kalan P6, P4, P2 ve P0 bitlerini ise biz main rutininden biz update edeceğiz.

char A değişkenimizdeki verinin;

A7 biti Portun P6 bitine yüklenecek,    P0 High ardından Low yapılacak Ardından A0 biti P2 bitine yüklenecek, P0 High ardından Low yapılacak Ardından A3 biti P4 bitine yüklenecek, P0 High ardından Low yapılacak

Bu program parçacığına uğraşırmısın?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

CLR

#409
Alıntı yapılan: bunalmis - 04 Kasım 2011, 12:30:02
@eemkutay dur kaçma işin aslını yanlış öğrenmişsin ve konuyu 2 sene önce yanlış sonlandırmışsın.

@Gerbay, başlık cortex şamatası başlığı. Bu konuların tartışıldığı bir başka Türkçe sayfa biliyorsan yazmayalım.

Bunalmış,

Kaçmak mı? Ben senin gibi değilim, ben haksız olduğuma inansaydım haklısın diyebilme erdemine sahibim. Ama sen bundan yoksunsun. Seni şahsen tanımıyorum ama forumda iyi tanıyorum. Hiçbirşeyi kabullenmeyen, öğrenmeye kapalı bir yapın var. Daha önceleri seninle asm ve c tartışmamız olmuştu. C'yi kötüleyip duruyordun, o zamanlar şimdiki gibi ns saniye hesabı yapıyordun. Ne oldu? Aradan zaman geçti daha yeni benim dediğime geldin. Şimdide aynısı olacak. Yakında C'de benim yazdığım gibi yazmayı öğreneceksin. Herzaman senin 3-5 adım önünde olacağım. Bu meslekte ve bu forumda tek çalışkan ve başarılı insan kendin sanıyorsun galiba.   

Başlangıçta bitbanding için sen 1 cycle'da çalışıyor dedin, ben 3 dedim. Sonra baktın yanlışsın lafı çevirdin, "en iyi ihtimalle 1 cycle" "en kötü ihtimalle 3 cycle" demeye başladın. Maksat "evet haklısın diyememek". Sonra bazı arkadaşlar netten kaynak falan çıkardılar, bu defa maskelemeden daha verimli olur demeye başladın. Hala da konuşabiliyorsun ve bana kaçma gibi bir laf söylüyorsun.

Seninle bu konu hakkında konuşmam için önce yukarıda bana sorduğun soruyu bitbanding ile yaz ve asm sonucunu buraya koy ve benim yukarıda yazdığım programla karşılaştıralım. Hem C formatını hemde asm formatını. Bana sözlü olarak bişeyler söylemen anlamsız, asm sonuçlarına bakarım. Asm çıktıda ezici üstünlük sağla, sonra konuşma hakkın olsun.


Alıntı yapılan: ErsinErce - 04 Kasım 2011, 15:17:11
eemkutay hocam yazdıklarımız neredeyse aynı ama sizinki nasıl bu kadar az yer kaplıyor merak ettim,
sizin kodlarıda derledim benimkiyle aynı sonuç çıkardı (optimizasyon seviyesi farketmiyor hep aynı kod çıkıyor),
acaba IAR'ın compiler'ı bu konuda daha mı iyi?

@ErsinErce
Asm çıktısı olarak genelde yakın sonuçlar çıkarıyorlar ama sonuçta ikiside farklı profesyonel derleyici, asm çıktılarında biraz fark olması normal.
Ben j-linkle birlikte keil ve IAR kullanıyorum. Uzun programlarda da ikisini test ettim 40k'lık programda 1-2k fark oluyor. Benim karşılaştırdığım programda IAR biraz daha iyiydi ama her ikisinide kullanıyorum. Her ikisininde kendince iyi özellikleri var, keil'in ansi c formatına göre macro ve program yazımları daha esnek. Iar ise daha dikkatli program yazmayı gerektiriyor. Ansi C kurallarında tam uyum istiyor, yani kurallarda daha katı. Keil biraz kolaylıklar tanıyor, toleransı var.
Knowledge and Experience are Power

z

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

ErsinErce

struct{
	volatile unsigned P0:1;
	volatile unsigned P1:1;
	volatile unsigned P2:1;
	volatile unsigned P3:1;
	volatile unsigned P4:1;
	volatile unsigned P5:1;
	volatile unsigned P6:1;
	volatile unsigned P7:1;
}Port __attribute__((at((unsigned long)&GPIOD->ODR)));
struct{
	volatile unsigned A0:1;
	volatile unsigned A1:1;
	volatile unsigned A2:1;
	volatile unsigned A3:1;
	volatile unsigned A4:1;
	volatile unsigned A5:1;
	volatile unsigned A6:1;
	volatile unsigned A7:1;
}A;
int main(void){
	while(1){
		Port.P6=A.A7;
		Port.P0=1;
		Port.P0=0;
		Port.P2=A.A0;
		Port.P0=1;
		Port.P0=0;
		Port.P4=A.A3;
		Port.P0=1;
		Port.P0=0;
	}                                         
}
    36:                 Port.P6=A.A7; 
0x0800027A 4917      LDR           r1,[pc,#92]  ; @0x080002D8
0x0800027C 4817      LDR           r0,[pc,#92]  ; @0x080002DC
0x0800027E 680A      LDR           r2,[r1,#0x00]
0x08000280 F3C213C0  UBFX          r3,r2,#7,#1
0x08000284 6802      LDR           r2,[r0,#0x00]
0x08000286 F3631286  BFI           r2,r3,#6,#1
0x0800028A 6002      STR           r2,[r0,#0x00]
    37:                 Port.P0=1; 
0x0800028C 6802      LDR           r2,[r0,#0x00]
0x0800028E F0420201  ORR           r2,r2,#0x01
0x08000292 6002      STR           r2,[r0,#0x00]
    38:                 Port.P0=0; 
0x08000294 6802      LDR           r2,[r0,#0x00]
0x08000296 F0220201  BIC           r2,r2,#0x01
0x0800029A 6002      STR           r2,[r0,#0x00]
    39:                 Port.P2=A.A0; 
0x0800029C 680A      LDR           r2,[r1,#0x00]
0x0800029E 6803      LDR           r3,[r0,#0x00]
0x080002A0 F3620382  BFI           r3,r2,#2,#1
0x080002A4 6003      STR           r3,[r0,#0x00]
    40:                 Port.P0=1; 
0x080002A6 6802      LDR           r2,[r0,#0x00]
0x080002A8 F0420201  ORR           r2,r2,#0x01
0x080002AC 6002      STR           r2,[r0,#0x00]
    41:                 Port.P0=0; 
0x080002AE 6802      LDR           r2,[r0,#0x00]
0x080002B0 F0220201  BIC           r2,r2,#0x01
0x080002B4 6002      STR           r2,[r0,#0x00]
    42:                 Port.P4=A.A3; 
0x080002B6 680A      LDR           r2,[r1,#0x00]
0x080002B8 F3C203C0  UBFX          r3,r2,#3,#1
0x080002BC 6802      LDR           r2,[r0,#0x00]
0x080002BE F3631204  BFI           r2,r3,#4,#1
0x080002C2 6002      STR           r2,[r0,#0x00]
    43:                 Port.P0=1; 
0x080002C4 6802      LDR           r2,[r0,#0x00]
0x080002C6 F0420201  ORR           r2,r2,#0x01
0x080002CA 6002      STR           r2,[r0,#0x00]
    44:                 Port.P0=0; 
0x080002CC 6802      LDR           r2,[r0,#0x00]
0x080002CE F0220201  BIC           r2,r2,#0x01
0x080002D2 6002      STR           r2,[r0,#0x00]
0x080002D4 E7D3      B             0x0800027E


Böyle çıkıyor bunalmis hocam,

Alıntı yapılan: eemkutay - 04 Kasım 2011, 17:04:32
@ErsinErce
Asm çıktısı olarak genelde yakın sonuçlar çıkarıyorlar ama sonuçta ikiside farklı profesyonel derleyici, asm çıktılarında biraz fark olması normal.
Ben j-linkle birlikte keil ve IAR kullanıyorum. Uzun programlarda da ikisini test ettim 40k'lık programda 1-2k fark oluyor. Benim karşılaştırdığım programda IAR biraz daha iyiydi ama her ikisinide kullanıyorum. Her ikisininde kendince iyi özellikleri var, keil'in ansi c formatına göre macro ve program yazımları daha esnek. Iar ise daha dikkatli program yazmayı gerektiriyor. Ansi C kurallarında tam uyum istiyor, yani kurallarda daha katı. Keil biraz kolaylıklar tanıyor, toleransı var.

Anladım hocam teşekkürler,
IAR'da MISRA C denetleyicisi vardı hatırladığım kadarıyla, bir yandan iyi gibi aslında bug oluşmasının önüne geçilmek isteniyor.
Kodlarken ne tarz sorunlar çıkartığına dair bir fikir oluşturması için aklınızda kalan ufak bir kaç örnek  varsa bilgilendirebilir misiniz hocam?

z

@Ersinerce,

Aralara birer tane de dint ve eint gibi fonksiyon koyman gerekmez mi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

Şöyle bir sorum var hocam,  Interrupt Set-pending Registers sadece beklemede olduğunu mu gösteriyor yoksa beklemeye de alıyor mu?

z

Dokumandan anladığım kadarıyla; Register açıklamasında bekleyen interruptları gözleyebiliyorsun. İstersen int olmadığı halde int gelmiş gibi NVIC'ı dürtebiliyorsun.

İstersen ona hiç girme ve fonksiyon çağırarak int enable ve disable ediyormuş gibi yap.

Her defasında Port un 0 bitini 1 ardından da 0 yaparken araya minikte olsa bir delay koymamız gerektiğini böylece çok yüksek frekanslı clk üretmeyeceğimizi, bu delayler nedeniyle mainin hemen başında int disable, en sona da da int enable koymanın yakışı kalmayacağını, bu sebeple portta her bit modifikasyonunda int enable int disable yapmanın daha profosyonel fikir olduğunu hatırlatayım.





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

ErsinErce

void SystemInit(){
}
volatile unsigned long intstate[2];
void dint(void){
	intstate[0]=NVIC->ISER[0];
	intstate[1]=NVIC->ISER[1];
	NVIC->ICER[0]=0xFFFFFFFF;
	NVIC->ICER[1]=0xFFFFFFFF;
}
void eint(void){
	NVIC->IABR[0]=intstate[0];
	NVIC->IABR[1]=intstate[0];
}
struct{
	volatile unsigned P0:1;
	volatile unsigned P1:1;
	volatile unsigned P2:1;
	volatile unsigned P3:1;
	volatile unsigned P4:1;
	volatile unsigned P5:1;
	volatile unsigned P6:1;
	volatile unsigned P7:1;
}Port __attribute__((at((unsigned long)&GPIOD->ODR)));
struct{
	volatile unsigned A0:1;
	volatile unsigned A1:1;
	volatile unsigned A2:1;
	volatile unsigned A3:1;
	volatile unsigned A4:1;
	volatile unsigned A5:1;
	volatile unsigned A6:1;
	volatile unsigned A7:1;
}A;
int main(void){
	int i;
	while(1){
		dint();
		Port.P6=A.A7;
		Port.P0=1;
		eint();
		for(i=0;i<0x10;i++);
		dint();
		Port.P0=0;
		Port.P2=A.A0;
		eint();
		for(i=0;i<0x10;i++);
		dint();
		Port.P0=1;
		eint();
		for(i=0;i<0x10;i++);
		dint();
		Port.P0=0;
		Port.P4=A.A3;
		eint();
		for(i=0;i<0x10;i++);
		dint();
		Port.P0=1;
		eint();
		for(i=0;i<0x10;i++);
		dint();
		Port.P0=0;
		eint();
		for(i=0;i<0x10;i++);
	}
}

     5: void dint(void){ 
0x080001D0 4770      BX            lr
     6:         intstate[0]=NVIC->ISER[0]; 
0x080001D2 4840      LDR           r0,[pc,#256]  ; @0x080002D4
0x080001D4 6802      LDR           r2,[r0,#0x00]
0x080001D6 4940      LDR           r1,[pc,#256]  ; @0x080002D8
0x080001D8 600A      STR           r2,[r1,#0x00]
     7:         intstate[1]=NVIC->ISER[1]; 
0x080001DA 6842      LDR           r2,[r0,#0x04]
0x080001DC 604A      STR           r2,[r1,#0x04]
     8:         NVIC->ICER[0]=0xFFFFFFFF; 
0x080001DE F04F31FF  MOV           r1,#0xFFFFFFFF
0x080001E2 F8C01080  STR           r1,[r0,#0x80]
     9:         NVIC->ICER[1]=0xFFFFFFFF; 
0x080001E6 F8C01084  STR           r1,[r0,#0x84]
    10: } 
    11: void eint(void){ 
0x080001EA 4770      BX            lr
    12:         NVIC->IABR[0]=intstate[0]; 
0x080001EC 493A      LDR           r1,[pc,#232]  ; @0x080002D8
0x080001EE 680A      LDR           r2,[r1,#0x00]
0x080001F0 483A      LDR           r0,[pc,#232]  ; @0x080002DC
0x080001F2 6002      STR           r2,[r0,#0x00]
    13:         NVIC->IABR[1]=intstate[0]; 
0x080001F4 6809      LDR           r1,[r1,#0x00]
0x080001F6 6041      STR           r1,[r0,#0x04]
    14: } 
0x080001F8 4770      BX            lr
    45:                 Port.P2=A.A0; 
0x080001FA 4C37      LDR           r4,[pc,#220]  ; @0x080002D8
    44:                 Port.P0=0; 
0x080001FC 4B38      LDR           r3,[pc,#224]  ; @0x080002E0
0x080001FE 1F24      SUBS          r4,r4,#4
    37:         while(1){ 
    38:                 dint(); 
    39:                 Port.P6=A.A7; 
    40:                 Port.P0=1; 
    41:                 eint(); 
0x08000200 E055      B             0x080002AE
    42:                 for(i=0;i<0x10;i++); 
0x08000202 F1000001  ADD           r0,r0,#0x01
0x08000206 2810      CMP           r0,#0x10
0x08000208 DBFB      BLT           0x08000202
    43:                 dint(); 
    44:                 Port.P0=0; 
0x0800020A F7FFFFE2  BL.W          dint (0x080001D2)
0x0800020E 6818      LDR           r0,[r3,#0x00]
0x08000210 F0200001  BIC           r0,r0,#0x01
0x08000214 6018      STR           r0,[r3,#0x00]
    45:                 Port.P2=A.A0; 
0x08000216 6820      LDR           r0,[r4,#0x00]
0x08000218 6819      LDR           r1,[r3,#0x00]
0x0800021A F3600182  BFI           r1,r0,#2,#1
0x0800021E 6019      STR           r1,[r3,#0x00]
    46:                 eint(); 
0x08000220 F7FFFFE4  BL.W          eint (0x080001EC)
    47:                 for(i=0;i<0x10;i++); 
0x08000224 F04F0000  MOV           r0,#0x00
0x08000228 F1000001  ADD           r0,r0,#0x01
0x0800022C 2810      CMP           r0,#0x10
0x0800022E DBFB      BLT           0x08000228
    48:                 dint(); 
0x08000230 F7FFFFCF  BL.W          dint (0x080001D2)
    49:                 Port.P0=1; 
0x08000234 6818      LDR           r0,[r3,#0x00]
0x08000236 F0400001  ORR           r0,r0,#0x01
0x0800023A 6018      STR           r0,[r3,#0x00]
    50:                 eint(); 
0x0800023C F7FFFFD6  BL.W          eint (0x080001EC)
    51:                 for(i=0;i<0x10;i++); 
0x08000240 F04F0000  MOV           r0,#0x00
0x08000244 F1000001  ADD           r0,r0,#0x01
0x08000248 2810      CMP           r0,#0x10
0x0800024A DBFB      BLT           0x08000244
    52:                 dint(); 
0x0800024C F7FFFFC1  BL.W          dint (0x080001D2)
    53:                 Port.P0=0; 
0x08000250 6818      LDR           r0,[r3,#0x00]
0x08000252 F0200001  BIC           r0,r0,#0x01
0x08000256 6018      STR           r0,[r3,#0x00]
    54:                 Port.P4=A.A3; 
0x08000258 6820      LDR           r0,[r4,#0x00]
0x0800025A F3C001C0  UBFX          r1,r0,#3,#1
0x0800025E 6818      LDR           r0,[r3,#0x00]
0x08000260 F3611004  BFI           r0,r1,#4,#1
0x08000264 6018      STR           r0,[r3,#0x00]
    55:                 eint(); 
0x08000266 F7FFFFC1  BL.W          eint (0x080001EC)
    56:                 for(i=0;i<0x10;i++); 
0x0800026A F04F0000  MOV           r0,#0x00
0x0800026E F1000001  ADD           r0,r0,#0x01
0x08000272 2810      CMP           r0,#0x10
0x08000274 DBFB      BLT           0x0800026E
    57:                 dint(); 
0x08000276 F7FFFFAC  BL.W          dint (0x080001D2)
    58:                 Port.P0=1; 
0x0800027A 6818      LDR           r0,[r3,#0x00]
0x0800027C F0400001  ORR           r0,r0,#0x01
0x08000280 6018      STR           r0,[r3,#0x00]
    59:                 eint(); 
0x08000282 F7FFFFB3  BL.W          eint (0x080001EC)
    60:                 for(i=0;i<0x10;i++); 
0x08000286 F04F0000  MOV           r0,#0x00
0x0800028A F1000001  ADD           r0,r0,#0x01
0x0800028E 2810      CMP           r0,#0x10
0x08000290 DBFB      BLT           0x0800028A
    61:                 dint(); 
0x08000292 F7FFFF9E  BL.W          dint (0x080001D2)
    62:                 Port.P0=0; 
0x08000296 6818      LDR           r0,[r3,#0x00]
0x08000298 F0200001  BIC           r0,r0,#0x01
0x0800029C 6018      STR           r0,[r3,#0x00]
    63:                 eint(); 
0x0800029E F7FFFFA5  BL.W          eint (0x080001EC)
    64:                 for(i=0;i<0x10;i++); 
0x080002A2 F04F0000  MOV           r0,#0x00
0x080002A6 F1000001  ADD           r0,r0,#0x01
0x080002AA 2810      CMP           r0,#0x10
0x080002AC DBFB      BLT           0x080002A6
    38:                 dint(); 
0x080002AE F7FFFF90  BL.W          dint (0x080001D2)
    39:                 Port.P6=A.A7; 
0x080002B2 6820      LDR           r0,[r4,#0x00]
0x080002B4 F3C011C0  UBFX          r1,r0,#7,#1
0x080002B8 6818      LDR           r0,[r3,#0x00]
0x080002BA F3611086  BFI           r0,r1,#6,#1
0x080002BE 6018      STR           r0,[r3,#0x00]
    40:                 Port.P0=1; 
0x080002C0 6818      LDR           r0,[r3,#0x00]
0x080002C2 F0400001  ORR           r0,r0,#0x01
0x080002C6 6018      STR           r0,[r3,#0x00]
    41:                 eint(); 
0x080002C8 F7FFFF90  BL.W          eint (0x080001EC)
    42:                 for(i=0;i<0x10;i++); 
0x080002CC F04F0000  MOV           r0,#0x00
0x080002D0 E797      B             0x08000202
0x080002D2 0000      MOVS          r0,r0
0x080002D4 E100      B             0x080004D8
0x080002D6 E000      B             0x080002DA


Bu tarz birşey çıkıyor  :o , bit işlemlerinde oluşan asm kodları hep aynı, dint ve eint içeriklerini de direk aralara yazıyım mı?

Andromeda

Çok kısa olarak Bit Banding nedir..?
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"

z

#417
Alıntı Yap
Bu tarz birşey çıkıyor  (Resim gizlendi görmek için tıklayın.) , bit işlemlerinde oluşan asm kodları hep aynı, dint ve eint içeriklerini de direk aralara yazıyım mı?

Benim mantığım her bir manüplasyonuna başlangıçta interruptın disable, manüplasyon bitiminde de enable edilmesi gerektiği söylüyor.

Fakat dersenizki ben kodların tepesinde int disable edeceğim, en sonunda da açacağım anlayış gösteririm. Fakat delayler uzun süreli ise intteruptın da bizim kodlarımıza göre önceliği olduğunu varsayarsak her kod arasında enable disable işleminin yapılması gerekir.

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

z

#418
Alıntı yapılan: elek - 04 Kasım 2011, 18:58:22
Çok kısa olarak Bit Banding nedir..?

Yaşşa. Şimdi herkez söylesin kendi anladığını. Özellikle de eemkutay.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Andromeda

ben masumum yahu...
öğrenmek için sordum... :)
" Tanrı, iradesini hakim kılmak için yeryüzündeki iyi insanları kullanır, yeryüzündeki kötü insanlar ise kendi iradelerini hakim kılmak için Tanrı'yı kullanırlar." ..." Tanrı'dan mesaj gelmiyor, biz Tanrı'ya mesaj gönderiyoruz"