STM32F103 Flash Hafıza Kullanımı

Başlatan esdevhk, 05 Nisan 2020, 20:46:44

esdevhk

Merhaba arkadaşlar,

Bitirme projemde STM32F103C8T6 mikrodenetleyicisi kullanmaktayım. 64kb'lık flash hafızaya sahip. Projemde otopilot tasarımı ile uğraştığımızdan sensör okumaları, sensör verilerini işleme ve UART üzerinden veri alışverişi gibi türlü kütüphaneler kullanılmaktadır. Çoğu çevre birimini kullanıyorum diyebilirim yani. Fakat bugün bir şey dikkatimi çekti. Optimizasyon kapalıyken flash hafıza kullanımının %94 olduğunu farkettim. Daha sonra optimizasyon ayarlarından "Optimization for size" seçerek derlediğimde %66'e indiğini gördüm. Burada kafama takılan bazı soruları siz değerli arkadaşlara sormak istiyorum.

1) 64Kb'lık bir hafızayı %94 kadar kullanacak kod yazdığımı düşünmek beni biraz tereddüte düşürüyor. Ben mi çok kötü kod yazdım? , MCU'nun flash hafızası mı çok düşük? , Projemin kaplaması gereken boyut gerçekten bu mu? sorularını aklıma getirdi. Fakat sadece basit bir GPIO kodu bile yazsam bu 5Kb'lık bir alan kaplamakta.

2) Optimizasyon ayarlarını "Optimization for size" yapmam projemde bir sıkıntıya sebep olur mu? Genelde optimizasyon ayarları kapalı bir şekilde geliştirme yapılması öneriliyor.

3) Eğer "Kardeşim 64Kb'lık hafıza gayet süper bir hafıza ne yaparsan yap bu seviyedeki bir çalışamada hafızayı kolay kolay dolduramazsın." diyorsanız. Kodumda incelemem, dikkat etmem gereken tanımlama,yazım kuralları nelerdir?

NOT : HAL kütüphanesi kullanmaktayım.

Teşekkürler iyi çalışmalar.

Cemre.

32K hafızalı STM32F030K8x işlemcide HAL kütüphanesi ile sığdıramadığım uygulamayı sadece LL kütüphanesine geçerek (büyük oranda yaptığım tek şey kütüphaneyi değiştirip ilgili fonksiyonların yerine muadillerini kullanmak) ciddi bir değişim sağladığımı hatırlıyorum. Denemekte fayda var...

esdevhk

Alıntı yapılan: Cemre. - 05 Nisan 2020, 21:03:3432K hafızalı STM32F030K8x işlemcide HAL kütüphanesi ile sığdıramadığım uygulamayı sadece LL kütüphanesine geçerek (büyük oranda yaptığım tek şey kütüphaneyi değiştirip ilgili fonksiyonların yerine muadillerini kullanmak) ciddi bir değişim sağladığımı hatırlıyorum. Denemekte fayda var...

Hocam aslında HAL kullandığımı o yüzden belirttim. Map dosyasına baktığımda HAL_I2C_MemRead fonksiyonunun 1.4Kb yer kapladığını gördüm. Ki projemde I2C, SPI, 2xUART, ADC DMA, 2x TIM genel kullandıklarım. Bu sıkıntının sebeplerinden biri de HAL sanırım.

brandice5

Hız ve boyut ters orantılıdır. Boyuta göre optimize edersen hızdan kaybedersin. Hıza göre optimize edersen boyuttan kaybedersin. Derleyici muhtemelen hıza öncelik verdiğinden programın boyutu büyümüş.

Yani özetle %94 boyut kaplayan program %66 boyut kaplayan programdan daha hızlı çalışacaktır. Bu hız farkı senin için önemli değil ise %66 olanı kullanabilirsin.

z

Alıntı yapılan: huseyink - 05 Nisan 2020, 21:10:48Hocam aslında HAL kullandığımı o yüzden belirttim. Map dosyasına baktığımda HAL_I2C_MemRead fonksiyonunun 1.4Kb yer kapladığını gördüm. Ki projemde I2C, SPI, 2xUART, ADC DMA, 2x TIM genel kullandıklarım. Bu sıkıntının sebeplerinden biri de HAL sanırım.

1.4 KB nedir yahu. Register kodlamaya gecin. Tas catlasin 128 Byte olur. Hele bir de ASM kodlarsaniz daha da altina dusersiniz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

bsenguler

Alıntı yapılan: z - 10 Nisan 2020, 09:55:251.4 KB nedir yahu. Register kodlamaya gecin. Tas catlasin 128 Byte olur. Hele bir de ASM kodlarsaniz daha da altina dusersiniz.

Bülent Hocam yerden göğe kadar haklı, hazır kütüphaneler arka tarafta birçok kontrol gerçekleştirirler, dolayısıyla programın şişmesine neden olurlar, eğer asm biliyorsanız ve vaktinizde varsa kesinlikle tercih edilmeli ama dediğim gibi vaktiniz varsa  8-)

z

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

bsenguler

Yazmak için hocam:) en basiti ve en kısası or lamak diye düşündüm, and leme işlemi için birkaç satır daha eklenmesi gerekiyordu galiba(uzun zaman oldu asm yazmayalı), zaten kolay olsaydı herkes asm yazardı hocam

c de ki kod                  asm deki karşılığı
if(x==6 || x==10)        CMP r0, #6
z=1;                             CMPNE r0, #10
                                    MOVEQ r1, #1

z

Kod alanindaki sisme seni rahatsiz ediyorsa tamam ASM yaz demiyorum ama registerlere ulasarak kod yaz.



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

bsenguler

Alıntı yapılan: z - 10 Nisan 2020, 13:19:03registerlere ulasarak kod yaz.

Ona lafımız yok, zaten öyle olmalı 8-)

esdevhk

Alıntı yapılan: brandice5 - 10 Nisan 2020, 09:30:20Hız ve boyut ters orantılıdır. Boyuta göre optimize edersen hızdan kaybedersin. Hıza göre optimize edersen boyuttan kaybedersin. Derleyici muhtemelen hıza öncelik verdiğinden programın boyutu büyümüş.

Yani özetle %94 boyut kaplayan program %66 boyut kaplayan programdan daha hızlı çalışacaktır. Bu hız farkı senin için önemli değil ise %66 olanı kullanabilirsin.


Hocam aslında şöyle garip bir olaydan bahsedeyim. Loop döngümün süresini Timer ile ölçmekteyim. Optimizasyon kapalı iken ~2.6ms loop sürem olmakta. Fakat optimizasyonu boyut için açtığımda loop sürem ~2.0ms düşmekte :) Dediğiniz hız konusu buysa eğer biraz garip değil mi?