STM32F407 Cortex M4 şamataları

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

CLR

Alıntı yapılan: bunalmis - 02 Kasım 2011, 23:36:52
Bir dakika tek cycle demedik. Nerden cikti bu.  Adres tablosundan adresi okuyup gelmek zaten bir kac cycle alir.
Adresleri de bitbanding adres yerlestirmeme izin vermeyip fiziksel port adresi kullan dedin. Bit band adresleri olusturmam bile bir kac cycle alir.
10 nolu bitleri set edecektim simdi de set reset cikti.

Yok yok saka bu. Yada kabus.

@Bunalmış
Yok sorudaki gibi olacak, reset olmayacak. Ama diziden adresi okuduktan sonra her registerin bitini set etmen için bit banding kullancaksın ve bit banding bir cycle bunları nasılsa biliyorsun, sen söylemiştin. Şimdi bunu gerçeklemeni istiyorum.

Öyle derleyicinin yerine herşeyi sen hesaplayıp bitin doğrudan adresini define ederek olmaz. Gerçek uygulamalarda veriler anlıktır ve ne olduğu belirsizdir. Burada da registerlerin adresleri belirsiz(yani derleyici bilmiyor) ve anlık olarak okuyup bit banding yapacak tümü bu.

Böyle test etmek gerçek performansını verecektir çünkü gerçek uygulamalar da adresler ve bitler değişkendir.
Knowledge and Experience are Power

mcan

#361
Çok fazla bilemediğimden tartışmaya katılamıyorum ancak okuduğum kadarıyla ;
Alıntı YapBit-banding maps a complete word of memory onto a single bit in the bit-band region. For example, writing to one of the alias words sets or clears the corresponding bit in the bit-band region. This enables every individual bit in the bit-banding region to be directly accessible from a word-aligned address using a single LDR instruction. It also enables individual bits to be toggled without performing a read-modify-write sequence of instructions.

Ayrıca okuduğum dökümanın birinde de bir örnek vermiş ;

http://www.scribd.com/doc/61618474/19/Bit-Banding
Alıntı YapFor a practical example,  the GPIO output data register is
written to in  order to set and clear individual IO lines. The physical address of the Port B output register is
0x40010C0C. In this example we want to be able to set and clear bit eight of this word using the above formula.

Word address         = 0x40010C0C
Peripheral bit band base       = 0x40000000
Peripheral bit band Alias base     = 0x42000000 
Byte offset from bit band base     = 0x40010c0c – 0x40000000 = 10c0c
Bit word offset         = (0x10c0c x 0x20) +(8x4) = 0x2181A0
Bit Alias address                     = 0x42000000 + 0x2181A0 = 0x422181A0

We can now create a pointer to this address using the following line of C:

#define PortBbit8   (*((volatile unsigned long *) 0x422181A0 ))

This pointer can then be used to set and clear the IO port bit:

PB8 = 1;        //led on 

Which generates the following assembly instructions:

MOVS     r0,#0x01
LDR      r1,[pc,#104] 
STR      r0,[r1,#0x00]

Switching the LED off:

PB8 = 0;  //led off 

Generates the following assembly instructions:

MOVS     r0,#0x00
LDR      r1,[pc,#88]   
STR      r0,[r1,#0x00]

Both the set and clear operations take three 16-bit instructions and on the STM32 running at  72 MHz  these
instructions are executed in 80nsec. Any word in the peripheral and SRAM bit band regions can also be directly
addressed word-wide so we could perform the same set and clear using the more traditional AND and OR
approach:

GPIOB->ODR |= 0x00000100;         //LED on 
LDR      r0,[pc,#68]     
ADDS     r0,r0,#0x08
LDR      r0,[r0,#0x00]
ORR      r0,r0,#0x100
LDR      r1,[pc,#64]   
STR      r0,[r1,#0xC0C]   

GPIOB->ODR &=!0x00000100;         //LED off 
LDR      r0,[pc,#40] 
ADDS     r0,r0,#0x08
LDR      r0,[r0,#0x00]
MOVS     r0,#0x00
LDR      r1,[pc,#40]   
STR      r0,[r1,#0xC0C]

Now each set and clear operation takes a mixture of 16 and 32-bit operations, which take a minimum of 14 bytes
for each operation and at the same clock frequency take a minimum of 180 nSec. If you consider the impact of bit
banding on a typical embedded application that sets and clears lots of bits in the peripheral registers and uses
semaphores and flags in the SRAM, you are very clearly going to make significant savings in both code size and
execution time and it is all handled in the STM32 header file for you.

Şimdi burada açık olarak daha hızlı olduğunu yazıyor, acaba bizim başlıkda yazılan kodlar daha mı optimize ? ve yaklaşık aynı hızda çıkıyor yoksa komutların 16-32 bit olduğunu  hesaplamıyor muyuz?Belkide döküman hatalıdır,ya da eski.

z

while()
{
     Tablo[0] dan_GPIOA_ODR adresini oku bundan yararlanip 10. biti high yap. (Diger bitler bilinmiyor ve ayni kalsin)
     Tablo[0] dan_GPIOA_ODR adresini oku bundan yararlanip 10. biti low yap.  "
     Tablo[1] dan_GPIOB_ODR adresini oku bundan yararlanip 10. biti high yap. "
     Tablo[1] dan_GPIOB_ODR adresini oku bundan yararlanip 10. biti low yap.  "
     Tablo[2] dan_GPIOC_ODR adresini oku bundan yararlanip 10. biti high yap. "
     Tablo[2] dan_GPIOC_ODR adresini oku bundan yararlanip 10. biti low yap.  "
     Tablo[3] dan_GPIOD_ODR adresini oku bundan yararlanip 10. biti high yap. "
     Tablo[3] dan_GPIOD_ODR adresini oku bundan yararlanip 10. biti low yap.  "
}

Sonra 10 nolu bitlerin karsi geldigi pinlerden herhangi birinden scopla frekansi olc.

Ancak bu sartlarda bitbanding i klasik maskeleme metoduna gore mukayese edebilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

#363
Alıntı yapılan: eemkutay - 02 Kasım 2011, 23:51:57
@Bunalmış
Yok sorudaki gibi olacak, reset olmayacak. Ama diziden adresi okuduktan sonra her registerin bitini set etmen için bit banding kullancaksın ve bit banding bir cycle bunları nasılsa biliyorsun, sen söylemiştin. Şimdi bunu gerçeklemeni istiyorum.

Öyle derleyicinin yerine herşeyi sen hesaplayıp bitin doğrudan adresini define ederek olmaz. Gerçek uygulamalarda veriler anlıktır ve ne olduğu belirsizdir. Burada da registerlerin adresleri belirsiz(yani derleyici bilmiyor) ve anlık olarak okuyup bit banding yapacak tümü bu.

Böyle test etmek gerçek performansını verecektir çünkü gerçek uygulamalar da adresler ve bitler değişkendir.

Olmaz boyle sey. Bitbandingin ne zaman 1 ne zaman 3 cycle olacagini soylemistim zaten. Fakat bindbandingle senin klasik yolla yapacagin manuplasyondan daha hizli manuplasyon yaparim bunda iddialiyim.

Dikkat ettiysen ilk bastaki sorun her defasinda degisti de degisti. Simdi de 10 nolu bitin de degisebilecegini ima ediyorsun.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ilhan_mkp

hocam şu anki konuyla alakalı değil ama kafama takılan iki soru var
1 noktalı sayılar float işlemler
2 c de bölme işleminde kalan

yani en basitinden kök almak için bir fonksiyon gibi bişi yazmak istesek yanlış hatırlamıyorsam kalanı kullanmamız gerekir

CLR

Alıntı yapılan: bunalmis - 03 Kasım 2011, 00:07:00

Olmaz boyle sey. Bitbandingin ne zaman 1 ne zaman 3 cycle olacagini soylemistim zaten. Fakat bindbandingle senin klasik yolla yapacagin manuplasyondan daha hizli manuplasyon yaparim bunda iddialiyim.

Dikkat ettiysen ilk bastaki sorun her defasinda degisti de degisti. Simdi de 10 nolu bitin de degisebilecegini ima ediyorsun.

Soru aynı değişen bişey yok. Bu soruda benim amacım derleyicinin bilmediği adreslerde bit banding'i kullanmasıydı ama sorunun cevabını yazmana gerek yok çünkü senin define için kullandığın tüm matematiği derleyici her bir register için yapmak zorunda bu da nerden baksan herbir biti set etmek için yaklaşık 10 cycle harcayacak demektir.

Sanırım anlaşamıyacağız, en güzeli herkes kendi bildiği yoldan yapsın.
Knowledge and Experience are Power

mcan

Hocalar-ustalar verdiğim dökümanda yazan doğrumu yanlışmı?

z

@mcan Yazdiklarin dogru.

Herhangi bir adresin herhangi bir bitini herhangi bir zamanda hic bir kurala bagli kalmaksizin bitband yontemi ile degistirmek icin 3 cpu komutu gerekiyor ve klasik maskeleme yontemine gore daha hizli.

Ancak bunun icin malesef kullanacagin her bir bitin bitband alandaki adresini define ile tanimlaman gerekiyor.
Aynen header dosyalarda her bir register adresinin define ile sayfalar dolusu tanimlandigi gibi.

Fakat ben bit tanimlama yapmam dersen de bu hizlara da cikamazsin. Cunku adres hesabini yazilima yaptirmak zaman kaybettirir.

Gerektigi yerde uygun olani secilir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

gambit1244

artık kitler gelsede şu sessizlik bozulsa :D
[email]tufan_ozbek@hotmail.com[/email] Yesterday is history. Tomorrow is a mystery. Today is a gift aslında bütün mesele bu.

z

#369
Kotu fakat guzel tecrube.

Ne kadar tezat değilmi.

eemkutayin yazmami istedigi programi yazarken daha once sizlere onerdigim SystemInit() fonksiyonunun hemen girisindeki delay rutinini koymayi unutup paldir kultur
programi yazdim.

Kodlar startup fonksiyonuna girer girmez port clock sinyallerini aciyor ve GPIOA, GPIOB, GPIOC, GPIOD nin 10. bitini output geri kalanlari da input tanimliyordu.

Bu inanilmaz affedilemez bir hata.

Cunku bu GPIOA PA14 ve PA13 u input moduna ceviriyor. http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/DM00039084.pdf dokumaninin 31. sayfasindan bakarsaniz bu pinlerin SWD yani software debugging yani karta program yuklemeye ve debug etmeye yarayan pinler oldugunu goreceksiniz. (Cipimiz flashdan boot edince hatali yazdigim systeminit den dolayi derhal Port A yi I/O tanimlayarak SWD yi kapiyordu.)

Haliyle kartima program yukleyemez oldum ve Keil debug moduna sokuldugunda Kart bulunamiyor benzeri mesaj vermeye basladi.

Bunun uzerine https://www.picproje.org/index.php/topic,35721.0.html basliginda bahsettigim BOOT0 ve BOOT1 pinleri aklima geldi ve  Boot0 pininin konumunu degistirmeye karar verdim. Boylece karti flashdan değil de diger kaynaklardan boot edebilecektim. Ramda sacma sapan cop bilgiler olsada bu kodlar SystemInitteki kodlardan daha kotu olamazdi.

Kartimizda BOOT0 pini lowda. BOOT1 pini 1 de. Bu cipin flashdan boot edecegi anlamina geliyor.

Kartin arkasindaki SB18 olarak gosterilen direnci sokunce BOOT0 pinini High yaptim. Yanlis olan ve bu hataya neden olan SystemInit rutinini duzeltip derledim ve karta bu vaziyette  program yuklemeyi denedigimde SWD den program atildi. Daha sonra da kartimin SB18 jumperini eski haline getirdim ve kartimi tekrardan kullanabilir hale getirdim.

Bence kotu ve bir okadar da guzel bir tecrube oldu.

Aman dikkat.Bu hataya dusmeyin. Cozumu olsa da adami telaslandiriyor.

Yalniz bu yaptigim kurtarma islemi Flashi nasil sildi bilmiyorum. Flash harici kaynaklardan  boot edince PCdeki SWD yazilimi flashi siliyor olabilir. (?)
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mcan

@Eemkutay ,size bir sorum olacak,normalde yazdiginiz programlarda bit set etmek icin bit band kullanmiyormusunuz yada sizin kullandiginiz genel yapi nasil ? Verdiginiz h dosyasinin icerigine bakarak anladigim kadariyla structure yapisinda registerlarin bitleri tanimlanmis dogru mu? Birde nokta isaretinden sonra derleyici otomatik icerik seceneklerini gosteriyor dogru mu?

CLR

Alıntı yapılan: bunalmis - 03 Kasım 2011, 01:35:53
Kotu fakat guzel tecrube.

Ne kadar tezat değilmi.

eemkutayin yazmami istedigi programi yazarken daha once sizlere onerdigim SystemInit() fonksiyonunun hemen girisindeki delay rutinini koymayi unutup paldir kultur
programi yazdim.

Kodlar startup fonksiyonuna girer girmez port clock sinyallerini aciyor ve GPIOA, GPIOB, GPIOC, GPIOD nin 10. bitini output geri kalanlari da input tanimliyordu.

Bu inanilmaz affedilemez bir hata.

Cunku bu GPIOA PA14 ve PA13 u input moduna ceviriyor. http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/DM00039084.pdf dokumaninin 31. sayfasindan bakarsaniz bu pinlerin SWD yani software debugging yani karta program yuklemeye ve debug etmeye yarayan pinler oldugunu goreceksiniz. (Cipimiz flashdan boot edince hatali yazdigim systeminit den dolayi derhal Port A yi I/O tanimlayarak SWD yi kapiyordu.)

Haliyle kartima program yukleyemez oldum ve Keil debug moduna sokuldugunda Kart bulunamiyor benzeri mesaj vermeye basladi.

Bunun uzerine https://www.picproje.org/index.php/topic,35721.0.html basliginda bahsettigim BOOT0 ve BOOT1 pinleri aklima geldi ve  Boot0 pininin konumunu degistirmeye karar verdim. Boylece karti flashdan değil de diger kaynaklardan boot edebilecektim. Ramda sacma sapan cop bilgiler olsada bu kodlar SystemInitteki kodlardan daha kotu olamazdi.

Kartimizda BOOT0 pini lowda. BOOT1 pini 1 de. Bu cipin flashdan boot edecegi anlamina geliyor.

Kartin arkasindaki SB18 olarak gosterilen direnci sokunce BOOT0 pinini High yaptim. Yanlis olan ve bu hataya neden olan SystemInit rutinini duzeltip derledim ve karta bu vaziyette  program yuklemeyi denedigimde SWD den program atildi. Daha sonra da kartimin SB18 jumperini eski haline getirdim ve kartimi tekrardan kullanabilir hale getirdim.

Bence kotu ve bir okadar da guzel bir tecrube oldu.

Aman dikkat.Bu hataya dusmeyin. Cozumu olsa da adami telaslandiriyor.

Yalniz bu yaptigim kurtarma islemi Flashi nasil sildi bilmiyorum. Flash harici kaynaklardan  boot edince PCdeki SWD yazilimi flashi siliyor olabilir. (?)

@Bunalmış böyle bir sonuç olmasına üzüldüm ama problemini çözmüşsün bu iyi,

@mcan

evet, register blocklarını gösteriyorum mesela RccRegs,GpioaRegs,CanRegs gibi, sonra registere ulaşan ve register içine bits/b8/b16/b32 olarak erişim sağlayan yapılar kurdum. B16 için low ve hi olarak düşük ve yüksek mertebeli 16bite erişen bir yapı, bits için ise aynı registerlerde isimleri kullandım, 8bit için ise dizi şeklinde yapılar kurdumki indexle istediğim gibi yazabileyim. Ayrıca istediğim donanım modulu cinsinden type'lar tanımladım mesela DMA,CAN,USART,TMR,GPIO...vs. kanallarından birini hazırlayacağım diyelim DMAxInit, CANxInit.vb diye tek fonksiyon var ve bu tüm DMA kanallarını hazırlayabiliyor. Kendi sitemde de dediğim gibi bu yaklaşık 15 günümü aldı ama şimdi rahatım. Zaman geçtikçede daha fazla konfor getiriyorum. Problemler çıkmadı mı? çıktı tabii ki, çünkü pointerlerle uğraşıyorsun ama nerdeyse tüm donanım modüllerini pratik uygulamalarda denedim, sorunsuz çalışıyor, çıkan problemleride düzelttim.

İstersem st library'de benim library'ye entegre edebiliyorum, hatta öyle hazırladım ki yapıyı, istersem bit bit yazarım istersem doğrudan 1-32bit arası yazarım , istersem bu kadar biti maskeleyip yazarım. Çok fonksiyonel oldu, çok zamanımı aldı fakat bu beni nerden baksan 5yıl götürür.

ST'nin diğer güzel yanı, register yapılarını ve isimlerini değiştirmiyor az modifiye ile STM32f2xx, stm32f4xx serine kolayca adapte debilirim ve daha önce yazdığım programlar kolaylıkla çalışacaktır.

Knowledge and Experience are Power

memo333

Alıntı yapılan: bunalmis - 03 Kasım 2011, 01:35:53
Kotu fakat guzel tecrube.

Ne kadar tezat değilmi.

eemkutayin yazmami istedigi programi yazarken daha once sizlere onerdigim SystemInit() fonksiyonunun hemen girisindeki delay rutinini koymayi unutup paldir kultur
programi yazdim.

Kodlar startup fonksiyonuna girer girmez port clock sinyallerini aciyor ve GPIOA, GPIOB, GPIOC, GPIOD nin 10. bitini output geri kalanlari da input tanimliyordu.

Bu inanilmaz affedilemez bir hata.

Cunku bu GPIOA PA14 ve PA13 u input moduna ceviriyor. http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/USER_MANUAL/DM00039084.pdf dokumaninin 31. sayfasindan bakarsaniz bu pinlerin SWD yani software debugging yani karta program yuklemeye ve debug etmeye yarayan pinler oldugunu goreceksiniz. (Cipimiz flashdan boot edince hatali yazdigim systeminit den dolayi derhal Port A yi I/O tanimlayarak SWD yi kapiyordu.)

Haliyle kartima program yukleyemez oldum ve Keil debug moduna sokuldugunda Kart bulunamiyor benzeri mesaj vermeye basladi.

Bunun uzerine https://www.picproje.org/index.php/topic,35721.0.html basliginda bahsettigim BOOT0 ve BOOT1 pinleri aklima geldi ve  Boot0 pininin konumunu degistirmeye karar verdim. Boylece karti flashdan değil de diger kaynaklardan boot edebilecektim. Ramda sacma sapan cop bilgiler olsada bu kodlar SystemInitteki kodlardan daha kotu olamazdi.

Kartimizda BOOT0 pini lowda. BOOT1 pini 1 de. Bu cipin flashdan boot edecegi anlamina geliyor.

Kartin arkasindaki SB18 olarak gosterilen direnci sokunce BOOT0 pinini High yaptim. Yanlis olan ve bu hataya neden olan SystemInit rutinini duzeltip derledim ve karta bu vaziyette  program yuklemeyi denedigimde SWD den program atildi. Daha sonra da kartimin SB18 jumperini eski haline getirdim ve kartimi tekrardan kullanabilir hale getirdim.

Bence kotu ve bir okadar da guzel bir tecrube oldu.

Aman dikkat.Bu hataya dusmeyin. Cozumu olsa da adami telaslandiriyor.

Yalniz bu yaptigim kurtarma islemi Flashi nasil sildi bilmiyorum. Flash harici kaynaklardan  boot edince PCdeki SWD yazilimi flashi siliyor olabilir. (?)

Kafam karıştı.

Normalde boot0'ı 1 yapıp reseti attığınız zaman F1xxx ler http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00167594.pdf deki belgeden görüleceği üzere dahili bootloaderını kullanıp seri porttan veya USBden *.hex kod yüklemeye izin veriyordu.

Bu belgede maalesef f4ler için birşey yazılmamış. ama pek bişeyin değişeceğini zannetmem.

Ki başka bir konuda şu: bahsettiğiniz pinler ilk açılışta "jtag/swd" pinleri. bunları remap yapmadan i/o olarak kullanamazsınız.
Gömülü Linux Notları --> http://linuxedu.xyz/

z

#373
Bizim cipte bootloader yok diye biliyorum(?). Cipi kullanilmaz durume geciren katil kod.

void SystemInit()
{
volatile int i;   
    RCC->AHB1ENR |= 0x0000000F;  // GPIO A-B-C-D donanýmýnýn clock sinyallerini uygulayalým
    GPIOA->MODER =  0x00100000;  // GPIOD 10 Output
    GPIOA->OSPEEDR= 0x00300000;  // GPIOD 10 Fast Out
    GPIOB->MODER =  0x00100000;  // GPIOD 10 Output
    GPIOB->OSPEEDR= 0x00300000;  // GPIOD 10 Fast Out
    GPIOC->MODER =  0x00100000;  // GPIOD 10 Output
    GPIOC->OSPEEDR= 0x00300000;  // GPIOD 10 Fast Out
    GPIOD->MODER =  0x00100000;  // GPIOD 10 Output
    GPIOD->OSPEEDR= 0x00300000;  // GPIOD 10 Fast Out
}

Ayni kodlari bir daha denemek istemiyorum ama birimizden birinin basina bu durum kesin gelecektir.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

z

Çipimizde embedded bootlader varmış.

Rehber Sayfa 59.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com