11 Ağustos 2022 Perşembe

Circular Buffer (Dairesel Buffer)

Gömülü sistemlerde veri toplama, kaydetme veya depolama için çeşitli veri yapıları kullanmak gerekir. Bu uygulamanın tipine göre farklılık gösterebilir. Özellikle gateway ve benzeri projelerde circular buffer tercih edilebilir. RAM kaynağı sınırlı olduğu için en verimli yöntem ile bu kaynağı kullanmak gerekir. FIFO, LIFO şeklinde davranış gösteren farklı veri yapıları vardır. Bu yazı, circular buffer nedir, nasıl çalışır, hangi durumlarda kullanılmalı gibi konular üzerine olacak.

Circular buffer adından da anlaşılacağı gibi hafızayı dairesel bir formatta kabul ederek/soyutlaştırarak hafıza alanını kullanmaya imkan sunan bir veri yapısıdır. Dairesel bufferın özelliklerinden biri veri yazma ile veri okuma indexlerinin bağımsız kontrolüdür. Tüm bufferın boyutu sabittir.

Görsel üzerindeki end()/item n yazma pointerını ifade eder. begin()/item 1 okuma pointerını ifade eder. Okuma ve yazma pointerları birbirine eşit olduğunda buffer empty flagi set olur. Bu bufferın tamamen boş olduğunu ifade eder. Yazma pointerı okuma pointerının bir eksiğine eşit olduğunda ise buffer full flagı set olur. Bu bufferın tamamen dolu olduğunu ifade eder. Bu yapının kullanıldığı yerin gereksinimlerine göre half full gibi farklı seviyeler için de flag tanımlanabilir.

Circular buffer rutin bir çalışma durumunda full durumuna gelmeyecek şekilde kurgulanmalıdır. Bunun için okuma hızı/sıklığı her zaman yazma okuma hızı/sıklığından daha yüksek olmalıdır. Böylece bufferda saklanan verinin belli bir değeri geçmeyeceği garanti edilir. Yine de beklenmedik durumlar ortaya çıkabilir. Bu durumlarda circular bufferlarda farklı stratejiler uygulanabilir. Birincisi üzerine yazma, ikincisi ise bloklama yaklaşımıdır.

Üzerine yazma yaklaşımında circular buffer full olsa bile yeni gelen veri bir sonraki yazma adresine yazılır. Bu durumda bir önceki data kayıp olmuş olur.

İkinci yöntem olan bloklama yaklaşımında da eğer circular buffer full ise yeni gelen veri olsa bile en sondaki veri okunmadan yeni bir yazmaya geçilmez.

Örnek bir repository olarak https://github.com/Roen-Ro/CircularBuffer incelenebilir.

Referanslar:

  1. https://www.boost.org/doc/libs/1_78_0/doc/html/circular_buffer.html

Hiç yorum yok:

Yorum Gönder

CAN Bus Frame Tipleri

Yazıya başlamadan önce CAN Bus temelleri ve mesaj yapısının temellerini incelemek için bu linkte yer alan blog yazısını inceleyebilirisiniz ...