0 beğenilme 0 beğenilmeme
66 kez görüntülendi
STMicroelectronics kategorisinde (190 puan) tarafından

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.

3 Cevaplar

3 beğenilme 0 beğenilmeme
(670 puan) tarafından
tarafından seçilmiş
 
En İyi Cevap

Cube ve HAL altyapısı gereğinden fazla ROM tüketiyor gibi geldi bana. Bunlarla ilgili pek bir deneyimim yok ama sadece yeni oluşturulmuş boş bir projeyi derlemeyi denediğimde bile birkaç kB yer kapladığını gördüm.

64 kB gayet geniş bir alan bence ama tabi ihtiyaçlar projeye göre değişebilir. Proje bileşenleri bilinirse ne kadar yer kaplayacağı ile ilgili daha rahat yorum yapılabilir. 1 MB ROM'u olan mikrodenetleyiciler bile var. Demek ki daha geniş alana ihtiyaç olabiliyor. Ben genelde projelerimde ROM değil RAM sıkıntısı yaşıyorum daha çok. USART buffer'ı, USB buffer'ı falan derken RAM dolup gidiyor...

GCC'de optimizasyon seviyeleri O0, O1, O2, O3 ve Os diye biliyorum. O0'da optimizasyon yok. O1 ve O2 gittikçe artan seviyelerde optimizasyon yapıyor. O3 ve Os ise biraz farklı. İkisi de O2'yi daha da ileri götürüyor ancak O3 daha yüksek hız için kod boyutundan feda edebiliyor. Os ise kodun daha az yer kaplaması için hızdan feda edebiliyor. Genel olarak optimizasyon seviyesi arttıkça debug imkanları azalıyor.

Ben şahsen özellikle gömülü sistemlerde fazla agresif optimizasyon taraftarı değilim. Projelerimde O1 kullanıyorum. O0'dan O1'de geçişte belirgin bir fark oluyor. Ama ondan ötesi bence riske girmeye değmez.

(190 puan) tarafından

Hocam projemde I2C, SPI, 2x UART, 2x TIM, ADC DMA kullanmaktayım.
Aslında HAL kütüphaneleri gerçekten oldukça yer kaplamakta.

3 beğenilme 0 beğenilmeme
(2,620 puan) tarafından

HAL kütüphanesinin kullanmadığınız kısmını derleme dışı bırakmanız yararlı olabilir. Derleyiciniz GCC ise "-ffunction_sections" komutu ile adı sanı kodunuz hiçbir yerinde geçmeyen fonksiyonları derleme aşamasında dışarı alabilirsiniz.

(670 puan) tarafından

Diğer IDE'lerdeki durumu bilmiyorum ama TrueStudio'da bu ayar varsayılan olarak etkin durumda. Optimizasyon sekmesinde "Prepare dead code removal" adı altında geçiyor.

Aslında derleme değil bağlama (linking) aşamasında kullanılmayan kodlar dışarıda bırakılıyor.

(2,620 puan) tarafından

-ffunction-section aslında tam olarak kastettiğiniz gibi çalışmıyor. Sizin bahsettiğiniz linkera geçilen -flto yani link-time optimization. -ffunction-section temelinde derleyicininin linkera bunları derlerken kullanmadım o yüzden bunları kullanılmayan sectionlara yönelttim diye verdiği bir opsiyon. Linker tarafında ise -gc-section yani çöp sectionları silebilirsin opsiyonu açıldığında bu kodlar çıktıya linklenmeden pas geçiliyor.
Yani bu olayı compile ve linker diye ayıramayız her ikisi de işin içine giriyor. Optimizasyonu daha efektif hale getirmek istediğinizde bu olay geriye sayıyor ki o zaman bunlar yerine -Os daha makul olacaktır.

-flto opsiyonu ise aşırı agresif bir optimizasyon bu konuda yanılıyor olabilirim ama GCC 4 te bile stabil değil kullanmayın deniyordu.

Kaynak:GCC manpage
ARM manpage
Stackoverflow

1 beğenilme 0 beğenilmeme
(3,700 puan) tarafından

Burada Bir cevap için kodları görmemiz lazım. Tabi bir şekilde 64K yazılmış olabilir. Yada spagetti çoktur. Ayrıca HAL biraz kaba bir kütüphane ondan da olabilir.

(190 puan) tarafından

Hocam HAL'in sıkıntı yaratabildiği konusu kafamı kurcalıyor. I2CMemRead fonksiyonu bile 1.3Kb kaplıyor. Birçok çevre birimi kullandığımı varsayarsak HAL de hali hazırda kaplıyor gibi.
Dediğim gibi basit bir GPIO kodu bile 4-5Kb kaplıyor.

Ayrıca Muhittin hocam, Varsaydım ki ben çok kötü kod yazdım. Sensör okumaları, işlemeleri ve UART paket çözme fonksiyonlarımı vs kaldırdım. Yine de %60 yer kaplıyor. Zaten projemin kemik kısmı yukarı yazdığım metodlar.

...