UART devreleri TX ve RX port’larına konumlandırılmış bir tampona (bellek) sahiptirler. Bir UART arabirimi veri aldığında onu küçük bir bellek alanında depolar. Benzer şekilde gönderilmeden önce de küçük bir bellek alanında sıraya alınır. Bunun asıl nedeni UART’ın asenkron bir iletişim gerçekleştirmesidir. Eğer bir tampon bellek olmasaydı gönderilen veri hedefine ulaştığı anda (sıradaki veri gelmeden) ilgili program tarafından acilen işleme koyulması gerekecekti. Bu da veri alımını gerçekleştiren programın kodlanmasını güçleştiren (zaman kritik kontrollerin eklenmesi) ve çok daha fazla CPU işlem gücü kullanılmasına neden olan bir sonuç doğuracaktı. Genel olarak UART tamponunun var oluşu, veriyi alacak ya da gönderecek cihazda koşan programın tam olarak hazır durumda olması gerekliliğini bir nebze olsun esnetir. Programlamayı kolaylaştırır. Burada bahsedilen programlama kısmı çoğu zaman programcıların ilgilenmesi gerekmeyen düşük seviyedeki program parçalarıdır. Programcı genellikle hazır kütüphane ve alt programlar vasıtasıyla UART verisini gönderir veya alır.
Yani, asenkron iletişimde verinin hangi anda geleceği belli olmadığından ilgili program sürekli olarak verinin gelip gelmediğini kontrol etmesi gerekir. Bu nedenle asenkron iletişim gerçekleştiren arabirimler gelen ve giden verileri biriktirmek için ufak boyutlu bir tampon kullanır. Port’u dinleyen program da, tamponda biriken veriyi belli zaman aralıklarıyla okur ve tamponu boşaltır. Böylece UART’ın diğer ucundaki gönderim hızı ile aynı hızda port’u okumaya çalışan programlar yazmak gerekmez. Programın okuduğu ya da programa talep ettiğinde sunulan ilk veri, tampona giriş yapmış olan ilk veridir. Bu tampon kullanım şekline bilgisayar literatüründe FIFO (First In Firs Out) “yani ilk giren ilk çıkar” adı verilir. Örneğin 16 byte’lık bir tampona giren 0xFF verisi port’u okuyan programın göreceği ilk veridir.
Raspberry Pi’ın UART tamponu Tx için 16×8 bit, Rx için ise 16×12 bit genişliğindedir. Esasında bunlar donanımsal tampon boyutlarıdır ve Raspberry Pi gibi mikroişlemcili bir sistem için düşük gibi gözükebilir. Eğer bu tampon yeterli sıklıkta okunup boşaltılmazsa sonra gelen veriler tampondaki verilerin üzerine yazar ve öncekileri yok eder. Bu, tüm tamponlu UART’larda ortak olan bir çalışma mekanizmasıdır. Bazı 1 byte’lık tampona sahip arabirimlerde her gelen byte için bir donanım kesmesi (interrupt) oluşturularak ilgili program haberdar edilir. Lakin bu durum da aşırı işlemci kullanımına neden olur. Aşırı işlemci kullanımına mahal vermeden tampondaki veriyi güvenli şekilde okumak okuyabilmek için UART tamponunun yeterince büyük olması gerekir. Tampon boyutunu donanım katmanında yükseltmek üretim maliyetini ve tasarımın karmaşıklığını artıran bir durumdur. Bu nedenle tampon boyutu sorununa, işletim sistemi (Linux çekirdeği) seviyesinde çözüm bulunmuştur. Linux çekirdeği bu donanımsal tamponları UART kesmesi gerçekleştiğinde okur ve bu veriler ile RAM bellek alanında oluşturduğu daha büyük boyutlu ikinci bir UART tamponunu besler. İkinci tamponun boyutu çekirdek yapılandırılırken ayarlanabilmesine rağmen birçok hız için oldukça uygun bir boyuttadır. Eğer bir USB to Serial dönüştürücüsü üzerinden bir UART arabirimi kullanılıyorsa, ek olarak dönüştürücünün kendi üzerinde yer alan bir UART tamponuna daha sahip olunur.
UART donanım tamponu dolduğunda ya da belli doluluk oranlarına ulaştığında bir donanım kesmesi oluşturulur ve çekirdek haberdar edilir. Bu kesmeler sayesinde çekirdek donanımsal tamponu okuyarak daha geniş bir tampon alanına taşır. Raspbian’ın (dolayısıyla Linux çekirdeğinin) UART tampon boyutu 256 Byte’tır. Yani, programınız UART port’unun hızına bağlı olarak belli sürelerde bu tamponu okumalıdır. Aksi takdirde yeni gelen veri, tampondaki verinin üzerine yazacaktır.
Kesmenin ne zaman tetikleneceğini belirleyen doluluk oranları FIFO TRL (Transmit Trigger Level) ve FIFO RRL (Receive Transmit Level) olarak yani FIFO gönderme (Tx) ve alma (Rx) tetiklenme seviyeleri ile tanımlanmıştır. Örneğin BCM2835 (Raspberry Pi 1’in sistem çipi) 1/8, 1/4, 1/2, 3/4 ve 7/8 FIFO tetiklenme seviyelerine sahiptir. Yani, donanımsal tampon 1/8, 1/4, 1/2, 3/4 ve 7/8 doluluk oranlarına ulaştığında bir kesme alt programı çağrılır ve çekirdeğin kendi tamponunu güncellemesi sağlanır. Bir diğer özellik de zaman aşımlarında oluşturulan kesmelerdir. Örneğin UART hattının ucundaki cihaz veri göndermeyi bıraktığında tampon doluluk oranı RRL/TRL değerlerine ulaşmamış olabilir. Bu durumda da çekirdeğin UART tamponunun güncellenmesi için aynı kesme alt programı çağrılır.
KULLANIM SARTLARI
Bu web sitesinin içeriginin tüm haklari saklidir. Kitabin/site içeriginin hiçbir bölümü, yazarinin yazili izni olmaksizin tekrar üretilemez, bir erisim sisteminde tutulamaz, herhangi bir biçimde elektronik, mekanik, fotokopi, ses kayit ya da diger yollarla iletilemez. Ancak istisna olarak; ticari olmayan amaçlar için yazara önceden bilgi vermek ve raspberrypikitabi.com adresini kaynak göstermek kaydiyla 10 sayfaya kadar kullanilabilir. Kitapta kullanilan logolar, firmalarin tescilli logolaridir. Raspberry Pi, Raspberry Pi Vakfi'nin ticari markasidir.
BILGILENDIRME
Bu kitapta Raspberry Pi, çesitli çevre birimleri ile düsük voltaj elektronik bilesenlerin bir arada kullanildigi uygulamalar yer almaktadir. Uygulamalarin tamami Raspberry Pi'in üzerinde kosan Linux çekirdegi ve açik kaynak kod özgür yazilimlar kullanilarak gerçeklestirilmistir. Uygulamalar gerçeklestirilirken ortaya çikabilecek elektriksel sorunlar veya kullanici hatalari nedeniyle cihazlar zarar görebilir veya veri kaybi yasanabilir. Ayrica, kitapta anlatilan konularin uygulanmasi sonucu ortaya çikabilecek her türlü lisans ihlali/kanuni ihlal ve zararin sorumlulugu uygulayan kisiye aittir. Olusabilecek herhangi bir zarardan yazar sorumlu tutulamaz.