Bir bilgisayarda belirtilen 'hafıza adresine' yazıyorsunuz. Bu adres sistem tarafından bir donanım adresi olarak tanınır ve uygun donanım uygun değeri alır veya gönderir.
Çoğu donanım sisteminde ayarlanabilen veya okunabilen birçok farklı kayıt vardır. Bazılarında birkaç, bazılarında birçok olabilir. Bu kayıtlar sürekli bir aralıkta gruplandırılacaktır. Bir temel işaretçi aralıktaki birinciyi gösterir ve örneğin base_pointer + 1 ile ikinci bağlantı noktasına yazarsın. Zorunda değilsiniz, doğrudan işaretçiye yazabilirsiniz, ancak ofset kullanmak işlerin daha kolay yapılmasını sağlar.
Ahududu Pi, 0x20000000 adresinde çok çeşitli donanım kayıtlarını tanımaktadır. Saat sistemlerini kontrol eden çeşitli kayıtlara BCM2708_PERI_BASE + 0x101000 adresinden erişilebilir. I2S saatini kontrol eden kayıtlar BCM2708_PERI_BASE + 0x101000 + 0x26 ve 0x27 kullanılarak yazılmış olan bu bloktaki 38 ve 39. kayıtlardır.
Ancak saat değerlerini değiştiremezsiniz, saati devre dışı bırakmanız, değerleri değiştirmeniz ve yeniden başlatmanız gerekir.
Bu cevap çok basitse, özür dilerim. Bu durumda sorunuz gerçekten sert, iyi şanslar. Bu bağlantıyı yararlı bulabilirsiniz
Güncelleme: Neden mmap kullanıyor ve doğrudan belleğe yazmıyorsunuz?
Bir program hafıza adreslerini çalıştırırken, gerçek adres olmadığını düşünüyor, hafıza yöneticisi tarafından gerçek adreslerle eşleştiriliyor. Bu, bir programın diğerini etkilemesini önler. İki işlem kendi başlarına (1234) mükemmel bir şekilde okuyabilir ve yazabilir ve bellek yöneticisi iki yeri tamamen ayrı tutacaktır.
Ancak donanım portları mutlak fiziksel adreslerdedir. Ancak doğrudan onlara yazamazsınız, çünkü hafıza yöneticisi adresinizi alacak ve kişisel hafıza alanınızla eşleyecektir.
Linux'ta / dev / mem ' bilgisayarın ana belleğinin bir görüntüsü olan bir karakter cihazı dosyasıdır '
Bunu bir dosya gibi açarsanız, o zaman bir dosya gibi okuyabilir ve yazabilirsiniz. Verilen örnekte mem_fd, / dev / mem açılışından kaynaklanan bir dosya tanıtıcısıdır.
Hayatı daha kolaylaştırabilen diğer bir sistem, bir dosyayı hafızaya eşleme ve ona hafıza gibi yazma yeteneğidir. Bu nedenle, farklı belirli bitleri okumak veya yazmak istediğiniz bir dosyanız varsa, dosya işaretçisini ileri ve geri hareket ettirmek yerine, bellekteki bir konuma eşleyebilir ve ardından doğrudan hafızadaymış gibi yazabilirsiniz.
Bu nedenle, bu örnekte kod, fiziksel bellekte bir disk oluşturuyormuş gibi bir tutamaç oluşturuyor ve sistemden onu bellekteki gibi işlemesini istiyor. Biraz sarsılmış, ancak sanal bellek yöneticisini dolaşmak ve gerçek bir fiziksel adrese yazmak için gerekli. Görünüşe göre, 0x20000000 değeri biraz kırmızı ringa balığı. Kod, bu adresi bir ipucu olarak öneriyor, sistemin burada / dev / mem ile eşleşmesine gerek yok, muhtemelen. Normalde null değeri iletilir ve sistem dosya tanıtıcısını en iyi düşündüğü adresle eşleştirir.
Şimdi fiziksel bellek, süreçlerin sanal belleğiyle eşleştirilir ve okuduğunuz ve yazdığınız yere gittiğinizi yazar.
Referanslar:
http://www.kernel.org/doc/man-pages/online/pages/man2/mmap.2.html
http://www.raspberrypi.org/phpBB3/viewtopic.php?f=44&t=8496&p=104359
https://superuser.com/questions/71389/what-is-dev-mem