IAR RAM optimizasyonu ve Hafıza Bölgesi hakkında

Başlatan mistek, 10 Aralık 2014, 17:32:18

mistek

Tarla gibi hafızası olan işlemcilerden bi anda 8KB flash memory ve 1KB ram'e sahip olan işlemciye geçince çuvalladım. Kod optimizasyonu yapmam lazım.
Daha doğrusu şuradaki ifadelerin ne anlama geldiğini merak ediyorum.



readonly code memory
readonly data memory
readwrite data memory

ifadeleri benim işlemcimin içerisinde nerelere karşılık geliyor?

Toplamda 8kb flash memory bunların toplamı mı  ?

Benim ROM = 8kb mı ?


RAM optimizasyonuna ihtiyaç var sanırım program düzgün çalışmıyor kendini kaybediyor. Debug modda falanca hafızaya ulaşamıyor hatası veriyor.

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

CLR

readonly code memory     // code (Flash'a yazılır)
readonly data memory     // const olan datalar (Flash'a yazılır)
readwrite data memory   // Normalde ram'e yazılır ama initialized(ilk değer verdiğin) data çok ise hem rom'dan hemde ram'den yer.

Kullanılan flash boyutu için üçünüde toplaman lazım


Tabi burada en önemli şey optimize edilmiş program yazmak ve compiler'ın optimizasyon levelini yüksek tutmak gerekir. Bu konuda bir sıkıntı yoksa.

Programda initialized(ilk değer verdiğin) data çok ise bunu manuel olarak sen program başında bir fonksiyon içinde girersen kullandığın flash boyutu o oranda düşer. Böyle bir durumda yoksa o işlemci o proje için
küçük diyebiliriz.   

Knowledge and Experience are Power

mistek

#2
Alıntı yapılan: CLR - 10 Aralık 2014, 18:58:29
readonly code memory     // code (Flash'a yazılır)
readonly data memory     // const olan datalar (Flash'a yazılır)
readwrite data memory   // Normalde ram'e yazılır ama initialized(ilk değer verdiğin) data çok ise hem rom'dan hemde ram'den yer.

Bu durumda yukarıda resimdeki değerler bi sorun oluşturmuyor hepsi belirlenen alana sığacak şekilde yerleşmiş doğru mu?


Alıntı Yap
Tabi burada en önemli şey optimize edilmiş program yazmak ve compiler'ın optimizasyon levelini yüksek tutmak gerekir. Bu konuda bir sıkıntı yoksa.

Derleyicinin optimizasyon seviyesi en yüksekte. Balanced ayarlı.

Alıntı Yap
Programda initialized(ilk değer verdiğin) data çok ise bunu manuel olarak sen program başında bir fonksiyon içinde girersen kullandığın flash boyutu o oranda düşer. Böyle bir durumda yoksa o işlemci o proje için
küçük diyebiliriz.   

Burayı biraz dahar açabilir misiniz?

Programın başında main fonksiyonunun dışında.

int16_t A=10;

şeklinde tanımlamalar bir hayli fazla.

Nasıl düzenlemem gerektiğini anlamadım?

mesaj birleştirme:: 10 Aralık 2014, 20:29:23

Bir Sorun var!

Yazdığım kodu optimizasyon High -Balanced ayarlayarak derliyorum programım düzgün çalışmıyor en basitinden butona basınca led yak diyorum yapmıyor. (Program uzun)

Aynı kodu optimizasyon Low ayarlayıp derliyorum olması gerektiği gibi çalışıyor.

Sorunu kendimden sonra nerede aramalıyım?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

CLR

Evet, program sığıyor görünüyor ama az kalmış sanırık 1K civarı.

int16_t A=10; 

A global ise  ve bunun gibi çok fazla ilk değer verdiğin registerler varsa  (0 değeri hariç) mümkünse bu registerleri program içinde tanımlamaya çalış ama global kullandığın için tabii programında modifiye gerekecektir.

Ama muhtemelen anlattığın probleme göre, sorun yazdığın programla alakalı, C keywordlerini yerinde kullanamamışsın olarak algıladım ben. Özellikle volatile kullanman gereken yerlerde kullanmamış olabilirsin dolayısıyla compiler high optimizeye aldığında yazdığın bazı kodu gereksiz olarak görüp compile etmemiş, pass geçmiştir. Low yaptığında ise kodu sıkıştırması gerekmediği için codu derler.
Knowledge and Experience are Power

mistek

Program içerisinde değer atama değişikliğini yaptım optimizasyon High ayarlı olduğunda data memory yazan yerden yaklaşık 100byte kadar yer açılıyor. Optimizasyonu Low yapınca garip bir şekilde daha kötü sonuç verdi. Programın boyutu büyüdü.

Volatile kullanmadım evet. Şimdi tekrardan yazdığım programı gözden geçiriyorum.

boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

Standart kütüphanede Flash Lock fonksiyonu yazılı.
void FLASH_Kilit_Kapat(void)
{
  FLASH_Lock(FLASH_MEMTYPE_DATA);
}


Bende fonksiyonu anlaşılır olması için bu şekilde çağırıp kullanıyorum. Fonksiyon içinde fonksiyon.

Flash Lock içerisinde şunlar var.
void FLASH_Lock(FLASH_MemType_TypeDef FLASH_MemType)
{
    /* Check parameter */
    assert_param(IS_MEMORY_TYPE_OK(FLASH_MemType));

  /* Lock memory */
  FLASH->IAPSR &= (uint8_t)FLASH_MemType;
}


Bu kaliyle derleme yaparsam Flash hafıza bölgesinde toplam alan 6 661 byte.

Eğer ki fonksiyonu aşağıdaki gibi fonksiyon içinde fonksiyon olarak değilde direk yapı elemanlarına ulaşacak şekilde kullanırsam kod boyutu 6 622 byte.
void FLASH_Kilit_Kapat(void)
{
  assert_param(IS_MEMORY_TYPE_OK(FLASH_MEMTYPE_DATA));
  FLASH->IAPSR &= (uint8_t)FLASH_MEMTYPE_DATA;
}


Optimizasyon Seviyesi: Medium

Fazladan kullanılan byteların sebebi nedir ki?
Bir fonksiyonu çağırmak bu kadar yer kaplayan bişey olmaması gerekir diye düşünüyorum.

Derleyicinin buna etkisi ne kadardır?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

Hocam assert_param'ı ben yazmadım ST Standart peripheral library içerisine yazmış bende farkı görmek için direk o şekilde kullandım. Gördüğüm tek farklılık Fonksiyon içerisinde fonksiyon çağırınca 40byte fazladan yer kaplıyor.

IAR'da direk F7 basıp derliyorum Debug moddan nasıl çıkacağım yada ne için derlediğim nerede yazıyordur? ?

mesaj birleştirme:: 04 Ocak 2015, 01:01:19

Birde hocam şurayı anlamadım

"hem senin metodda assert_param lık bir şey yok, durup duruken runtime da patlama.."

Ne gibi bir zararı var ?
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R

mistek

#7
Gerbay hoca sen çok yaşa.

Kod boyutu 1kb azaldı neredeyse. Release/Debug ayrımına hiç dikkat etmemiştim bilmiyordum.

Debug mod olunca fazladan kod derleniyordu öyle mi?



mesaj birleştirme:: 04 Ocak 2015, 01:53:08

Yalnız yukarıda bahsettiğim durum halen geçerli. Fonksiyon olarak çağırırsam flash kullanımı artıyor. Yapı elemanlarını doğrudan yazarsam azalıyor. Bunu anlamadım.
boş işlerin adamı ---- OHM Kanunu: I = V/R ---- Güç Formülü: P = V*I = I^2*R = V^2/R