Optimizasyon programı bellek kullanımı için genel olarak uygulanan yöntemler nelerdir?
(nb. Edgar'ın yorumuna göre bunun PROGMEM'i daha verimli kullanmakla ilgili olduğunu vurguluyorum.)
-
Kodu, boyutu lines kod satırları olan bir tabloyla değiştirebiliyorsanız, yapın.
- Bir ifs dizisi kullanmak yerine, prosedürü bir tabloya indirgemenin bir yolunu bulun
- Mantıklıysa, işlev işaretçileri tablolarını kullanın
- Bazen AVR'den çok daha yoğun bir mini dil bulabilirsiniz. talimatlar, örneğin robot mantığını 16 komuta kodlama ve ardından bayt başına iki komut paketleyebilirsiniz. Bu, bellek kullanımınızı 50 kat daraltabilir.
- Tekrarlanan kod yerine işlevleri kullanın — bu apaçık görünebilir, ancak genellikle kodu yeniden yazmanın ince yolları vardır (ancak bu işlev çağrılarının ek yükü vardır)
- Büyük boşluklara sahip tablolar yerine karma tablolar kullanın
- Kayan nokta yerine sabit nokta kullanın (örneğin, bir bayt alıp değerini, 4 baytlık kayan nokta kullanmak yerine 0,00 ila 2,55)
Değişken global veya yerel olarak bildirilmişse bellek kullanımında herhangi bir fark var mı?
Yığından bahsedelim.
void A () {byte a [600]; ...} void B () {bayt b [400]; ...} boşluk döngüsü () {bayt xxx [1000]; ...}
Bu program öncelikle her zaman en az 1000 bayt RAM kullanacaktır. Global olarak xxx bildirmekle karşılaştırıldığında gerçek bir fark yoktur. Ama o zaman kritik olan, hangi işlevi çağırdığıdır.
Eğer loop () A () 'yı çağırırsa ve sonra loop () B ()' yi çağırırsa, program hiçbir zaman 1600'den fazla kullanmayacaktır. Bununla birlikte, eğer A () B () 'yi çağırırsa veya tersi olursa, program 2000 kullanır. Göstermek için:
loop () [1000] └── ── A () [1600] │ [1000] └──── B () [1400] └──── A () [1600] └──── B () [1400]
ile
loop () [1000] └──── A () [1600]
└──── B () [2000] │ [1000] └──── A () [1600] └──── B () [2000]
Kontrol ifadesinin / seçim ifadelerinin ne olduğu önemli mi (if, switch gibi)
Az sayıda durum için pek bir fark yok. Aksi takdirde kodunuza bağlıdır. En iyi yol, ikisini birden denemek ve hangisinin daha iyi olduğunu görmektir. Ancak:
anahtar
ları genellikle, bir aralıktaki neredeyse her durumu (0,1,2,3,4, .., 100) kapsıyorsanız oldukça kompakt olan atlama tabloları kullanır. ). if
'ler genellikle, bir atlama tablosu girişinden daha fazla bayt ve döngü alan bir dizi talimat kullanır, ancak ardışık bir vakaya sahip değilseniz bu daha anlamlıdır.
Seri monitör kullanımı. Serial.print ()
Bunun pek fark yarattığına inanmıyorum. Seri tamponlar çok küçüktür (daha büyük bir pano için 64 bayt veya 128 diyelim) ve Seri kullansanız da kullanmasanız da tahsis edildiğine inanıyorum.
Elbette "bunun gibi birebir dizgiler" ve char [] tamponları hafızayı tüketir. İhtiyaç duymadığınız zamanlarda yorum yapabilir (veya #ifdef
’leri kullanabilirsiniz).