Ynt: STM32F100RB Clock Ayarları.

Başlatan muhittin_kaplan, 23 Ekim 2012, 22:18:48

Mucit23

Debug ekranında görebilirsin

muhittin_kaplan

debug anında pencereyi wiev/disassembly ile açabilirsiniz

camby

   100:                 GPIOC->ODR= 0x00000200; 
0x080002F8 0040      LSLS     r0,r0,#1
0x080002FA 60C8      STR      r0,[r1,#0x0C]
   101:                 GPIOC->ODR= 0x00000100;  
0x080002FC 1040      ASRS     r0,r0,#1
0x080002FE 60C8      STR      r0,[r1,#0x0C]


Bu şekilde bir kod çıktı , tek asm komutunda yapmamasının nedeni nedir ? = ile atama yaptım direk.

camby

Alıntı yapılan: XX_CİHAN_XX - 30 Ekim 2012, 14:22:04
Aynen öyle hocam tamamen derleyici marifeti.
Fakat = yerine &= yada |= gibi operatörler işin içine girince asm komut sayısı tek olmuyor.
Ancak yukarıdakilerin hepsini denedim hepsinde de en yüksek hızda tek asm komutuyla aynı işi yapabildiğini gördüm.

Benim üstte yazdıklarımda neden bu şekilde oluyor sizce , komut setini bilmiyorum ancak bunlar 2 ASM , 2 işlem süresi değil mi ?

Acaba derleyici optimizasyonunda mı bir eksiklik var. Sizde üretilen ASM kodu nedir ?

F100RB'den kaynaklı olabilir mi bu fark ?


|= ve &= işlemleri de hep 4 ASM ksatırı olmuş..

XX_CİHAN_XX

Keil mi kullanıyorsun?
CM3 ile CM4 arasında farklılıklar olabilir.
Çünkü ben denemelerimi STM32F4 ile yapıyorum
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Klein

Arm mimarisi nedeniyle.
Bu mimaride  iki hafıza hücresi arasında doğrudan işlem yapılamıyor. Önce işlem yapılacak iki  hücre registerlere alınıyor. bu registerler üzerinde işlem yapılıp, tekrar hafızaya yazılıyor.
Bu sebeple birden fazla komut sürüyor.  Derleyici optimizasyonuna bağlı olarak daha da fazla komut olabilirdi.

Çipin birden fazla registeri olduğu için , derleyici daha sonra lazım olacak veriyi registerde saklayıp, sonraki bir işlemde veriyi tekrar registere yükleme gereksinimi olmadan işlem yapabiliyor.  Bu da aynı kodun,  kod bloğu içerisinde bulunduğu yere yere göre , işletilecek adımların farklı olabileceği anlamına gelir.
Bu yüzden, derleyicinin ürettiği asm koda bakarak, bu işlem şu kadar asm satırı , şu işlem bu karak kod gibi kesin bir yargıya varmak her zaman mümkün olmaz.

muhittin_kaplan

Arm mimarisinde ASM Komutlarının işlenme süreside aynı değil.

camby

@Cihan,

Evet keil kullanıyorum. F4 ile oluşan kod nedir sence ?

@Muhittin,

Sen bakabildinmi çıkan kodlara , durum aynı mı 32F100RB ile. Tek asm yada benimki gibi mi ?

muhittin_kaplan

#38
CooCox Derleyicide

38     GPIOC->ODR= 0x00000200;
0800032c:   mov.w r3, #4096 ; 0x1000
08000330:   movt r3, #16385 ; 0x4001
08000334:   mov.w r2, #512  ; 0x200
08000338:   str r2, [r3, #12]


36        		GPIOC->ODR&= 0x00000000;
0800030c:   mov.w r3, #4096 ; 0x1000
08000310:   movt r3, #16385 ; 0x4001
08000314:   ldr r3, [r3, #12]
08000316:   mov.w r3, #4096 ; 0x1000
0800031a:   movt r3, #16385 ; 0x4001
0800031e:   mov.w r2, #0
08000322:   str r2, [r3, #12]


KEIL 4.60


    38:              GPIOC->ODR= 0x00000200;
0x0800029A F44F7000  MOV      r0,#0x200
0x0800029E 4908      LDR      r1,[pc,#32]  ; @0x080002C0
0x080002A0 60C8      STR      r0,[r1,#0x0C]


    36:                GPIOC->ODR&= 0x00000000;
0x08000288 480D      LDR      r0,[pc,#52]  ; @0x080002C0
0x0800028A 68C0      LDR      r0,[r0,#0x0C]
0x0800028C 2000      MOVS     r0,#0x00
0x0800028E 490C      LDR      r1,[pc,#48]  ; @0x080002C0
0x08000290 60C8      STR      r0,[r1,#0x0C]

camby

STM32F100RB ile ,

ASM tarafında, bir kerelik adres ve değerler registerlara alınsın. Ardından sırayla STR ile aynı adrese farklı yüklemeler yapıldığında sanırım maksimum clock sinyalini görmüş oluruz çıkışlardan.


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

Derleyicinin neden hep 3 komut ürettiğine gelince , optimizasyon seviyesini 3'e çıkardım ve derledim bu durumda istediğim derleme oldu. Fakat farklı durumlarda aynı derlemeyi yapamayabilir belki.

0x080002C4 60E0      STR      r0,[r4,#0x0C]
   109:                 GPIOC_ODR= 0x00000200;   
0x080002C6 60E1      STR      r1,[r4,#0x0C]
   110:                 GPIOC_ODR= 0x00000100;   
0x080002C8 60E0      STR      r0,[r4,#0x0C]
   111:                 GPIOC_ODR= 0x00000200;   
0x080002CA 60E1      STR      r1,[r4,#0x0C]
   112:                 GPIOC_ODR= 0x00000100;   
0x080002CC 60E0      STR      r0,[r4,#0x0C]
   113:                 GPIOC_ODR= 0x00000200;   


@Cihan, sendeki kodlar da buna benzer sanırım.

@Muhittin, ürettiğin kodlarda optimizason var mı ? Coocox'da optimizasyon var mı ?

muhittin_kaplan


XX_CİHAN_XX

Alıntı yapılan: camby - 04 Kasım 2012, 15:44:44

@Cihan, sendeki kodlar da buna benzer sanırım.


Evet. (CM3-CM4) Mimari farkından oluşan bir durum diye düşünüyorum.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

camby

Alıntı yapılan: XX_CİHAN_XX - 05 Kasım 2012, 08:36:04
Evet. (CM3-CM4) Mimari farkından oluşan bir durum diye düşünüyorum.

Yok hayır , yukarıdaki mesajda çıkan kodlara bakarsan , Keil optimizasyon level 3'de CM3'de de , tek ASM komutunda işleniyor.

XX_CİHAN_XX

Hmm evet benimki de Level3 olarak ayarlı. Olay buymuş demek ki...
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

muhittin_kaplan

bende işkillendim bak. keil i tekrar kontol edeyim.