![]() |
Görevci by Kozmotronik v2.1.1
Küçük gömülü sistemler için çoklu görev (multi-tasking) yönetimi uygulaması
|
Dosyalar | |
dosya | uckuyruk.c |
Makrolar | |
#define | NULL |
Typedef'ler | |
typedef struct uckuyruk | uckuyruk_t |
Kolaylık sağlaması için uckuyruk tür tanımı. | |
typedef uckuyruk_t * | puck_t |
uckuyruk_t yapısı için başvuru türü (okunaklılığı iyileştirmek için) | |
Fonksiyonlar | |
void | uckuyrukIlkle (const unsigned char kapasite, puck_t kuyruk, unsigned char *tampon) |
char | uckuyrukKuyrukla (puck_t kuyruk, const unsigned char deger) |
unsigned char | uckuyrukCokluKuyrukla (puck_t kuyruk, const unsigned char *kaynak, const unsigned char nicelik) |
unsigned char | uckuyrukBastakiOge (puck_t kuyruk) |
unsigned char | uckuyrukKuyruktanAl (puck_t kuyruk) |
unsigned char | uckuyrukCokluAl (puck_t kuyruk, unsigned char *hedef, const unsigned char nicelik) |
char | uckuyrukKuyrugaAktar (puck_t kaynak, puck_t hedef) |
unsigned char | uckuyrukKuyrugaCokluAktar (puck_t kaynak, puck_t hedef, const unsigned char nicelik) |
char | uckuyrukKuyrugaKopyala (puck_t kaynak, puck_t hedef) |
unsigned char | uckuyrukKuyrugaCokluKopyala (puck_t kaynak, puck_t hedef, const unsigned char nicelik) |
void | uckuyrukBosalt (puck_t kuyruk) |
void | uckuyrukNBosalt (puck_t kuyruk, unsigned char n) |
unsigned char | uckuyrukDoldur (puck_t kuyruk, const unsigned char deger, const unsigned char nicelik) |
unsigned char | uckuyrukOgeSayimi (puck_t kuyruk) |
char | uckuyrukDolu (puck_t kuyruk) |
unsigned char | uckuyrukKalanKapasite (puck_t kuyruk) |
char | uckuyrukBos (puck_t kuyruk) |
unsigned char | uckuyrukKapasite (puck_t kuyruk) |
Görevci için ardışıl (serial) FIFO modelinde bir kuyruk kütüphanesi.
uckuyruk unsigned char kuyruk kısaltması olarak kullanılmıştır. Bu modülün amacı statik olarak tanımlanacak unsigned char türünde bir dizinin referansını tutup o dizi üzerinde FIFO (İlk giren ilk çıkar) türünde bir kuyruk yönetimi yapmaktır. Modül, uckuyruk_t türünde bir yapıya sınırlı kapasiteye (en fazla 255) sahip statik bir unsigned char dizisi bağlamak koşuluyla, tek bir uygulama içerisinde birden çok FIFO kuyruğu yönetimi yapabilecek şekilde yazılmıştır. Özellikle seri portlar veya LCD ekranlar gibi görece yavaş çalışan donanımlara birden çok ardı ardına veri yazılması gereken durumlarda bu kuyruğu kullanmak çok avantajlıdır. Bu FIFO kuyruğu kullanıldığı takdirde, bu tür yavaş aygıtların veriyi byte-byte göndermesini beklemek yerine kuyruğa yazıp sonra ilgili donanım göndermeye her müsait olduğunda, kuyruktan alınıp ilgili donanıma verilebilir. Böylece CPU zamanı yavaş donanımların işini bitirmesini beklemek için boşuna harcanmaz.
Kullanımı oldukça basittir:
Eğer kuyrukta char türünde veriler saklanmak istenirse tek yapılması gereken; veriyi kuyruktan alırken char türüne dönüştürmektir (type casting). Önceki örneği char türü için güncellemek istersek yalnızca kuyruktan alma işleminde değişiklik yapmamız gerekir:
Basit tekli kuyruklama ve kuyruktan almaya ek olarak çoklu kuyruklama ve çoklu kuyruktan alma API'leri de vardır. Bunlar:
Bu kadarla da sınırlı değil! Çeşitli ardışıllaştırma (serializing) teknikleri kullanarak byte ırmağına dönüştürülmüş daha büyük türde ve yapıda veriler de kuyruklanabilir. Aynı kuyruktan veri eski haline döndürmek için; kuyruklamadan önce uygulanan ardışıllaştırma tekniğinin tersi bir teknik ile istenen tür ve yapıdaki veri byte ırmağı halinde kuyruktan alınıp özgün yapısına dönüştürülebilir.
#define NULL |
include sorunlarına önlem olarak NULL tanımlaması.
unsigned char uckuyrukBastakiOge | ( | puck_t | kuyruk | ) |
Bir kuyruğun en başındaki veriyi gösterir (peek).
Gösterilen veri kuyruktan çıkarılmaz, veriyi kuyruktan çıkarıp almak için uckuyrukKuyruktanAl() işlevini kullanınız. kuyruk parametresi NULL verilirse bu işlev hep 0 değerini döndürecektir. 0 Değeri de unsigned char türünden kuyruklanabilir bir değerdir. Dönen değerin doğrulanması veya ayrımının yapılması programcının sorumluluğudur. Bunu yapmanın en kolay yolu bu işlevi kullanmadan önce kuyruğu; uckuyrukBos() işlevini kullanarak yoklamaktır.
[in] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
char uckuyrukBos | ( | puck_t | kuyruk | ) |
Bir kuyruğun boş olup olmadığını yoklar.
[in] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
void uckuyrukBosalt | ( | puck_t | kuyruk | ) |
Bir kuyruğu tamamen boşaltır (flush).
Bu işlem önce tamponu 0 değeri ile doldurur ve ardından kuyruk yönetim değişkenlerini sıfırlar.
[in] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
unsigned char uckuyrukCokluAl | ( | puck_t | kuyruk, |
unsigned char * | hedef, | ||
const unsigned char | nicelik ) |
Bir kuyruktan istenen nicelikte veri alır.
Kuyruğun başındaki verileri kuyruktaki sırasıyla, hedef belleğe belirtilen, nicelikte alır. Kuyruktan alınan veriler kuyruktan çıkarılır. Kuyruktan alınacak veriyi saklayacak kadar yere sahip bir hedef sağlamak programcının sorumluluğudur. Aksi takdirde veriler kaybolabilir veya gereken kapasiteye sahip bir yer sağlanmamışsa verilerin hedefe sığan bölümü alınırken kalanı kaybolabilir. Hedefe aktarma işlemi başarılıysa aktarılan veri niceliği döndürülür. Diğer yandan; kuyruk veya hedef parametrelerinin biri NULL ise veya nicelik 1'den küçükse veya kuyrukta istenen nicelikte veri yoksa 0 değeri döndürülür.
[in] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
[out] | hedef | Kuyruktan alınan verilerin saklanmak istediği konuma referans. |
[in] | nicelik | Başlangıcı verilen veriden kaç tanesinin kuyruğa alınacağı. |
unsigned char uckuyrukCokluKuyrukla | ( | puck_t | kuyruk, |
const unsigned char * | kaynak, | ||
const unsigned char | nicelik ) |
Bir kuyruğa belirtilen nicelikte veri ekler.
Veriler kuyruğun en sonuna eklenir ve kuyruklanan verinin niceliği döndürülür. kuyruk veya kaynak parametreleri NULL verilirse veya nicelik 1'den küçükse veya kuyrukta; kuyruklanmak istenen verileri alacak kadar yer yoksa işlem sürdürülmez ve kuyruklamanın başarısız olduğunu ifade eden bir 0 değeri döndürülür.
[in,out] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
[in] | kaynak | Veriyi içeren dizideki verinin başlangıç adresine referans. |
[in] | nicelik | Başlangıcı verilen veriden kaç tanesinin kuyruğa alınacağı. |
unsigned char uckuyrukDoldur | ( | puck_t | kuyruk, |
const unsigned char | deger, | ||
const unsigned char | nicelik ) |
Bir kuyruğu belirtilen sayıda aynı veri ile doldurur.
İşlem başarılıysa kuyruğa doldurulan nicelik döndürülür. kuyruk NULL ise veya kuyrukta doldurulacak nicelikte yer yoksa veya nicelik 1'den küçükse hep 0 değeri döndürülür.
[in,out] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
[in] | deger | Kuyruğa doldurulacak unsigned char türünde veri. |
[in] | nicelik | Verilen verinin kuyruğa çoğaltılma sayısı. |
char uckuyrukDolu | ( | puck_t | kuyruk | ) |
Bir kuyruğun dolu olup olmadığını yoklar.
[in] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
void uckuyrukIlkle | ( | const unsigned char | kapasite, |
puck_t | kuyruk, | ||
unsigned char * | tampon ) |
Bir kuyruğu ilk kullanıma hazırlar.
Kuyruk veya tampon parametrelerinin biri NULL ise işlem sürdürülmez.
[in] | kapasite | Kuyruğun 1 - 255 aralığında kapasitesi, sizeof ile unsigned char türüne cast edilerek verilebilir. |
[in] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
[in] | tampon | Uygulamada tanımlanan bir unsigned char türünde dizi. |
unsigned char uckuyrukKalanKapasite | ( | puck_t | kuyruk | ) |
Bir kuyruğun kalan kapasitesini verir.
Kuyruğun kapasite niceliğini yani kuyruğun daha kaç öğe alabileceğinin sayısının bilgisini verir.
[in] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
Kaynak kuyruğun başındaki ögeyi hedef kuyruğa kuyruklar.
Kuyruktan kuyruğa bir öge aktarımı başarılı olursa 1 değeri döndürülür. Kaynak veya hedef kuyrukların referanslarının herhangi birinin NULL olması durumunda işlem sürdürülmez ve 0 değeri döndürülür. Kaynak kuyrukta hiçbir öge yoksa işlem sürdürülmez ve 0 değeri döndürülür. Hedef kuyrukta 1 öge alacak kadar yer yoksa işlem sürdürülmez ve 0 değeri döndürülür.
[in] | kaynak | Kaynak kuyruğa referans. |
[in,out] | hedef | Hedef kuyruğa referans. |
unsigned char uckuyrukKuyrugaCokluAktar | ( | puck_t | kaynak, |
puck_t | hedef, | ||
const unsigned char | nicelik ) |
Kaynak kuyruktan hedef kuyruğa birden çok öge aktarır.
Kuyruktan kuyruğa aktarım başarılı olursa aktarılan ögelerin sayımı döndürülür. Kaynak veya hedef kuyrukların referanslarının herhangi birinin NULL olması durumunda işlem sürdürülmez ve 0 değeri döndürülür. Kaynak kuyrukta aktarılmak istenen nicelik kadar öge yoksa işlem sürdürülmez ve 0 değeri döndürülür. Hedef kuyrukta aktarılmak istenen nicelik kadar öge yoksa işlem sürdürülmez ve 0 değeri döndürülür. Aktarılmak istenen nicelik değeri 0 verilirse işlem sürdürülmez ve 0 değeri döndürülür.
[in] | kaynak | Kaynak kuyruğa referans. |
[in,out] | hedef | Hedef kuyruğa referans. |
[in] | nicelik | Aktarılmak istenen öge sayısı. |
unsigned char uckuyrukKuyrugaCokluKopyala | ( | puck_t | kaynak, |
puck_t | hedef, | ||
const unsigned char | nicelik ) |
Kaynak kuyruğun başından itibaren nicelik kadar ögeyi hedefe kopyalar.
uckuyrukKuyrugaCokluAktar() İşlevinden farkı kaynak kuyruktan hedef kuyruğa kopyalanan ögelerin kaynak kuyruktan silinmemesidir. Böylece aynı ögeler hem kaynak kuyrukta hem de hedef kuyrukta bulunur. Kopyalama işlemi başarılı olursa hedef kuyruğun sayımı nicelik kadar (kopyalanan ögeler kadar) artarken, ögeler kaynak kuyruktan çıkarılmadığı için kaynak kuyruğun sayımı olduğu gibi kalır ve baştaki öge değişmez. Kuyruktan kuyruğa aktarım başarılı olursa aktarılan ögelerin sayımı döndürülür. Kaynak veya hedef kuyrukların referanslarının herhangi birinin NULL olması durumunda işlem sürdürülmez ve 0 değeri döndürülür. Kaynak kuyrukta aktarılmak istenen nicelik kadar öge yoksa işlem sürdürülmez ve 0 değeri döndürülür. Hedef kuyrukta aktarılmak istenen nicelik kadar öge yoksa işlem sürdürülmez ve 0 değeri döndürülür. Aktarılmak istenen nicelik değeri 0 verilirse işlem sürdürülmez ve 0 değeri döndürülür.
[in] | kaynak | Kaynak kuyruğa referans. |
[in,out] | hedef | Hedef kuyruğa referans. |
[in] | nicelik | Aktarılmak istenen öge sayısı. |
Kaynak kuyruğun başındaki ögeyi hedef kuyruğa kopyalar.
uckuyrukKuyrugaAktar() İşlevinden farkı kaynak kuyruktan hedef kuyruğa kopyalanan ögenin kaynak kuyruktan silinmemesidir. Böylece aynı öge hem kaynak kuyrukta hem de hedef kuyrukta bulunur. Kopyalama işlemi başarılı olursa hedef kuyruğun sayımı bir artarken, öge kaynak kuyruktan çıkarılmadığı için kaynak kuyruğun sayımı olduğu gibi kalır ve baştaki öge değişmez. Kuyruktan kuyruğa bir öge kopyalama başarılı olursa 1 değeri döndürülür. Kaynak veya hedef kuyrukların referanslarının herhangi birinin NULL olması durumunda işlem sürdürülmez ve 0 değeri döndürülür. Kaynak kuyrukta hiçbir öge yoksa işlem sürdürülmez ve 0 değeri döndürülür. Hedef kuyrukta 1 öge alacak kadar yer yoksa işlem sürdürülmez ve 0 değeri döndürülür.
[in] | kaynak | Kaynak kuyruğa referans. |
[in,out] | hedef | Hedef kuyruğa referans. |
char uckuyrukKuyrukla | ( | puck_t | kuyruk, |
const unsigned char | deger ) |
Bir kuyruğa veri ekler.
Veri kuyruğun en sonuna eklenir ve kuyruklamanın başarılı olduğunu belirten 1 degeri döndürülür. kuyruk parametresi NULL verilirse veya kuyruk doluysa işlem sürdürülmez ve kuyruklamanın başarısız olduğunu ifade eden bir 0 değeri döndürülür.
[in,out] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
[in] | deger | Kuyruğa alınacak unsigned char türünde veri. |
unsigned char uckuyrukKuyruktanAl | ( | puck_t | kuyruk | ) |
Bir kuyruğun en başındaki veriyi alır.
Kuyruktan alınan veri kuyruktan çıkarılır. Kuyruğun en başındaki değere onu kuyruktan çıkarmadan bakmak için uckuyrukBastakiOge() kullanılır. kuyruk parametresi NULL verilirse bu işlev hep 0 değerini döndürecektir. 0 Değeri de unsigned char türünden kuyruklanabilir bir değerdir. Dönen değerin doğrulanması veya ayrımının yapılması programcının sorumluluğudur. Bunu yapmanın en kolay yolu bu işlevi kullanmadan önce kuyruğu; uckuyrukBos() işlevini kullanarak yoklamaktır.
[in] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |
void uckuyrukNBosalt | ( | puck_t | kuyruk, |
unsigned char | n ) |
Bir kuyruktan n kadar veriyi boşaltır.
Boialtılmak istenen miktar n parametresi ile verilir. Boşaltma işlemi başarılı olursa; en baştaki ögeden itibaren n kadar öge kuyruktan silinir, silinen ögelerin konumları 0 değeri ile doldurulur. Kuyruk parametresi NULL ise veya kuyrukta silinmek istenenden daha az öge varsa veya n değeri 0 verilirse işlem sürdürülmez.
[in,out] | kuyruk | İşlem yapılacak kuyruğa referans. |
[in] | n | Boşaltma miktarı. |
unsigned char uckuyrukOgeSayimi | ( | puck_t | kuyruk | ) |
Bir kuyrukta bekleyen öğe niceliğini döndürür.
[in] | kuyruk | Uygulamada tanımlanan bir uckuyruk_t yapısına referans. |