Arduino'da dalsız programlama?
Bu yüzden kodu hızlandırmak için dalsız programlamaya bakıyordum ve Arduino'nun (veya daha doğrusu atmega328'in) makine talimatlarını tam olarak nasıl okuduğunu merak ediyorum. Bir önbelleği var mı yoksa flash bellekten her talimatı okuyor mu?
Branşsız programlama anlayışıma göre hesaplamayı hızlandırır çünkü CPU komutların içine atlamak zorunda değildir ve sırayla okuyabilir, bu nedenle yüklü olmayan bir konuma atlamak zorunda kalması durumunda yeni komutlar yüklemesine gerek yoktur.
Sorum şu, bu atmega328 için geçerli mi? Her talimatı bir önbellek kullanmadan doğrudan flaştan okursa, talimatlara atlaması gerekip gerekmediği önemli değildir, değil mi?
Yanıtlar
Önbellek yok, bu yüzden endişelenmenize gerek yok. Tüm talimatlar doğrudan flaştan alınır ve hemen yürütülür.
Yine de 2 aşamalı bir boru hattı var. Bu, bir saat döngüsünde bir komutun flaştan getirildiği ve bir sonraki saat döngüsünde çalıştırıldığı - ve bu yürütülürken bir sonraki komutun hazır getirildiği anlamına gelir.
Bu, bir dallanma meydana geldiğinde, AVR dallanma tahminine çok basit bir yaklaşım kullandığından (yani dalın alınmayacağını varsayar ve ne olursa olsun bir sonraki talimatı yüklediğinden), boru hattının içeriğini atması gerektiği ve sıfırdan başlamak.
Bu, yeni dallanmış talimatı yüklerken yalnızca bir saat cezası, ancak yine de bir ceza.
Önbellek yalnızca CPU çekirdeği belleğe erişilebildiğinden daha hızlı çalıştığında gereklidir. AVR yalnızca flaşın erişilebileceğinden önemli ölçüde daha yavaş olan 20MHz'e kadar çalıştığı için, önbellek eklemek tamamen anlamsız olacaktır. Diğer daha hızlı MCU'lar, 200MHz PIC32MZ gibi önbelleğe almayı kullanır, çünkü aksi takdirde, okumayı yavaşlatmak için "bekleme durumlarının" tanıtılması gerekir.