Cache ve DMA ile yazılım geliştirmek
Ön bellek (cache), bellek hızının işlemci hızına yetişememesi nedeniyle icat edilmiş, işlemci ile bellek arasında yer alan özel bir bellek çeşididir. Kabaca çalışması şu şekildedir; işlemci gereken veriye ulaşmak için ön belleğe erişir. Eğer veri burada bulunuyorsa çok hızlı bir şekilde bu veriye ulaşır ve kullanır. Aksi durumda ön bellek kontrolcüsü istenilen veriye ulaşmak için ana belleğe başvurur ve veriyi ana bellekte arar. Bu işlem ön bellek erişimine göre oldukça uzun sürer (kabaca 300 – 400 saykıl). Bu yüzden ana belleğe erişim sırasında olası kullanılabilecek (birkaç kb ekstra gibi) diğer veri kümeleriyle birlikte geri döner ve bu yeni veriler istenilen veriyle birlikte önbelleğe kaydedilir.
Doğrudan bellek erişimi (DMA – Direct Memory Access) işlemciden bağımsız olarak veri transferi için kullanılır. Uygun ayarlamalar yapıldıktan sonra işlemci gereksimi duymadan veriyi bir yerden diğerine taşır. İstenirse işlem bitiminde işlemci için kesmede üretebilir. Ardından gerekli kesme programı çağırılarak veri kullanılabilir, diye düşünsek de ön belleğin yeni taşınan veriden bi-haber olması nedeniyle veriyi hemen kullanmak mümkün değildir.
Şöyle bir örnekle durumu açıklayalım. Diyelim ki video işleme yeteneği olan ARM bir işlemci var elimizde. Video işlenmek üzere işlemciye giriyor ve bir kısım donanımsal işlemden sonra DMA ile DRAMe yazılır. İşlem bitince CPU için bir kesme üretilir. Kesme alt programında ise video verisi ethernetten gönderilmek üzere TCP/IP protokolüne aktarılır.
Böyle bir sistemde etkili şekilde kod yazmak için DMA ve cache ikilisinden en iyi şekilde yararlanmak gerekiyor. Öncelikle DMA için DRAM de gözünüze bir yer kestirin ve burayı malloc ile ayırın ki derleyici bu bölgeyi kullanmasın. Bu alan için veya bütün uygulama için kesinlikle ön bellek kontrolcüsünü devre dışı bırakmayın. Tamamen kontrolcüyü devre dışı bırakmak uygulamayı oldukça yavaşlatacaktır. Ayrılan bölge için kontrolcüyü kapatmak ise TCP/IP protokolünü bu alandan veri alırken yavaşlamasına neden olacaktır. Bu durumda en verimli çalışma şekli; işlemci için kesme alındıktan sonra ilk iş olarak ön bellekte, ayrılmış bölgeyle alakalı ne kadar veri varsa boşaltmak olacaktır. Bu veri TCP/IP protokolüne aktarılırken ön bellek kontrolcüsü bir seferde birden fazla veriyle geri döneceğinden ön bellek kısa zamanda ve çok az gecikmeyle yeni verilerle doldurulacaktır. Bu andan itibaren TCP/IP protokolü yeni veriye ön bellek üzerinden ulaşacağından protokolün çalışmasıda yavaşlamayacaktır.