![]() |
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 | gorev.c |
Veri Yapıları | |
struct | GorevKontrolBlogu |
struct | SureKontrolBlogu |
Makrolar | |
#define | NULL |
#define | grvCALISMA_KIPI 1 |
Görev çalışma kipi tanımlanmamışsa varsayılan normal kip. | |
#define | grvTIK_SURESI_uS 1000u |
Varsayılan tik süresi 1 ms. | |
#define | grvTIK_SURESI_MS (grvTIK_SURESI_uS / 1000u) |
Tik süresinin milisaniye türünden değeri. | |
#define | grvILKLE(g) |
#define | grvBASLA(g) |
#define | grvBITIR(g) |
#define | grvGECIK_MS(g, s, gecikme) |
#define | grvKOSULLU_GECIK_MS(g, s, gecikme, kosul) |
#define | grvKOSUL_BEKLE(g, kosul) |
#define | grvBU_KOSULDA_BEKLE(g, kosul) |
#define | grvSIFIRLA(g) |
#define | grvCIK(g) |
#define | grvVAZGEC(g) |
#define | grvKOSULA_DEK_VAZGEC(g, kosul) |
Typedef'ler | |
typedef void * | gorevTutucu_t |
Görevin işlevinin kendisine referansı (handle for function). | |
typedef char(* | is_t) (gorevTutucu_t) |
Görevin işlev türü (function pointer type). | |
typedef struct GorevKontrolBlogu | gorev_t |
Kolaylık sağlamak için GorevKontrolBlogu tür tanımı. | |
typedef gorev_t * | pgkb_t |
GKB için referans türü (pointer). | |
typedef struct SureKontrolBlogu | sure_t |
Kolaylık sağlamak için SureKontrolBlogu tür tanımı. | |
Fonksiyonlar | |
unsigned int | grvTikSayimi (void) |
void | grvTikKesmeIsleyici (void) |
pgkb_t | grvOlustur (is_t is) |
void | grvGorevciyiBaslat (void) |
pgkb_t | grvKimlikIleGorevBlogunuAl (const unsigned char kimlik) |
void | grvBaslat (const unsigned char kimlik) |
void | grvDurdur (const unsigned char kimlik) |
Süre Birimi Dönüştürücüleri | |
Mikrosaniye <-> tik; milisaniye <-> tik süre dönüşümleri | |
#define | grvuS_TIK_CEVIR(us) (us / grvTIK_SURESI_uS) |
Mikrosaniye süre değerini tik süre değerine dönüştürür. | |
#define | grvMS_TIK_CEVIR(ms) (ms / grvTIK_SURESI_MS) |
Milisaniye süre değerini tik süre değerine dönüştürür. | |
#define | grvTIK_uS_CEVIR(tik) (tik * grvTIK_SURESI_uS) |
Tik süre değerini mikrosaniye süre değerine dönüştürür. | |
#define | grvTIK_MS_CEVIR(tik) (tik * grvTIK_SURESI_MS) |
Tik süre değerini milisaniye süre değerine dönüştürür. | |
Görevlerin yönetimini gerçekleştiren API.
#define grvBASLA | ( | g | ) |
Görev başlangıç noktası.
Görevlerin içinde sonsuz döngüye girmeden önce çağrılmalıdır. Bu yapılmazsa derleme hatalarıyla karşılaşılabilir veya görev çalışmaz. Her görevin parametresi olan gorevTutucu_t parametresi verilerek çağrılır:
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
#define grvBITIR | ( | g | ) |
Görev bitiş noktası.
Görevlerin içinde sonsuz döngünün bitiminden sonra çağrılmalıdır. Bu yapılmazsa derleme hatalarıyla karşılaşılabilir veya görev çalışmaz. Her görevin parametresi olan gorevTutucu_t parametresi verilerek çağrılır:
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
#define grvBU_KOSULDA_BEKLE | ( | g, | |
kosul ) |
Koşul sağlanıyorken görevi bloklar.
Verilen bir koşul sağlandığı sürece görevi bloklar. Koşul başka bir görev tarafından değiştirilip artık sağlanmadığında bloklanan görev kaldığı yerden çalışmayı sürdürür. Örneğin bir kuyruk API'si olduğunu varsayalım ve aşağıdaki işlev prototipi basitçe kuyruk doluysa true değilse false döndürüyor.
Bu durumda kuyrukDolumu() işlevi false döndürene dek, yani kuyruk boşalana dek görev bloklanacaktır.
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
kosul | O anda sağlanan ve sağlanmaması için beklenecek bir koşul belirten ifade. |
#define grvCIK | ( | g | ) |
Bir görevden çıkar.
Bir kez çıkış yapıldı mı artık bu görev çalıştırılmak için çağrılmaz. Yeniden çağrılması için görevin gorevOlustur() API'si ile yeniden çalışacak görevler listesine eklenmesi gerekir. Her görevin parametresi olan gorevTutucu_t parametresi ve koşul ifadesi verilerek çağrılır:
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
#define grvGECIK_MS | ( | g, | |
s, | |||
gecikme ) |
Bir görevi verilen milisaniye gecikme süresi kadar geciktirir.
Görevlerin içinde görevin ertelenmesi, geciktirilmesi veya belli bir süre sonra çalıştırılması gereken durumlarda çağrılır. Bu makro çağrıldığında görev, verilen süre kadar bloklanır (artık çalışmaz). Her görevin parametresi olan gorevTutucu_t parametresi, süre takibini yapmak için kullanılacak sure_t türünden değişkenin başvurusu ve milisaniye türünden gecikme süresi verilerek çağrılır:
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
s | sure_t türünde bir süre tutucu değişkene başvuru. |
gecikme | Milisaniye türünden gecikme süresi. |
#define grvILKLE | ( | g | ) |
Görevleri ilkler, ilk kullanım için hazırlar.
Görevler çalışmaya başlamadan önce bu makro ile ilklenmelidir. Bu yapılmazsa görevler beklendiği gibi çalışmayabilir. Dahili olarak Görevci tarafından kullanılır. Uygulama katmanından direk çağrılmamalıdır.
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
#define grvKOSUL_BEKLE | ( | g, | |
kosul ) |
Koşul gerçekleşene dek görevi bloklar.
Her görevin parametresi olan gorevTutucu_t parametresi ve koşul ifadesi verilerek çağrılır:
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
kosul | Gerçekleşmesi beklenecek bir koşul belirten ifade. |
#define grvKOSULA_DEK_VAZGEC | ( | g, | |
kosul ) |
Bir görevin sırasını bir koşul sağlanana dek diğer görevlere vermek için kullanılır.
Bir görev yaptığı işlemde belli bir aşamaya gelip bir koşul beklemesi gerekiyorsa grvKOSUL_BEKLE'ye alternatif olarak bu makroyu kullanabilir. Bu durumda görev; belirtilen koşul sağlanana dek CPU kontrolünü diğer görevlere gönüllü olarak verecektir. Her görevin parametresi olan gorevTutucu_t parametresi ve koşul ifadesi verilerek çağrılır:
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
kosul | Sağlanması gereken koşul ifadesi. |
#define grvKOSULLU_GECIK_MS | ( | g, | |
s, | |||
gecikme, | |||
kosul ) |
Bir görevi koşullu geciktirir.
Görevlerin içinde bir koşula bağlı olarak görevin ertelenmesi, geciktirilmesi veya belli bir süre sonra çalıştırılması gereken durumlarda çağrılır. Bu makro çağrıldığında belirtilen koşul sağlandıkça görev, verilen süre kadar bloklanır (artık çalışmaz). Herhangi bir gecikme aşamasında koşulun sağlanmadığı saptanır saptanmaz gecikme iptal edilir ve görev kaldığı yerden çalışmayı sürdürür.
Her görevin parametresi olan gorevTutucu_t parametresi, süre takibini yapmak için kullanılacak sure_t türünden değişkenin başvurusu, milisaniye türünden gecikme süresi ve son olarak gecikmenin bağlı çalışacağı koşul verilerek çağrılır:
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
s | sure_t türünde bir süre tutucu değişkene başvuru. |
gecikme | Milisaniye türünden gecikme süresi. |
kosul | Gecikmenin bağlı çalışacağı koşul. |
#define grvSIFIRLA | ( | g | ) |
Bir görevi sıfırlar (yeniden başlatır).
Görevi sıfırlar (yeniden başlatır). Dolayısıyla görev bir sonraki çalışmada kaldığı yerden değil, en baştan çalışmaya başlar. Her görevin parametresi olan gorevTutucu_t parametresi ve koşul ifadesi verilerek çağrılır:
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
#define grvVAZGEC | ( | g | ) |
Bir görevin sırasını başka bir göreve vermek için kullanılır.
Bazen bir görev bir işlemi tamamlayıp başka önemli zaman kısıtı olan bir işlem yapmayacaksa, bu makroyu çalıştırarak CPU kontrolünü çalışmak için bekleyen diğer görevlere gönüllü olarak verir. Bu makro diğer sistemlerdeki yield işlevine benzer çalışır. Her görevin parametresi olan gorevTutucu_t parametresi verilerek çağrılır:
g | gorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur. |
#define NULL |
include sorunlarına önlem olarak NULL tanımlaması.
void grvBaslat | ( | const unsigned char | kimlik | ) |
Kimliği verilen görevi uyandırır / çalıştırır.
Verilen kimliğe sahip GKB bulunamazsa işlem sürdürülmez.
[in] | kimlik | GKB kimliği. |
void grvDurdur | ( | const unsigned char | kimlik | ) |
Kimliği verilen görevi uyutur / durdurur.
Verilen kimliğe sahip GKB bulunamazsa işlem sürdürülmez.
[in] | kimlik | GKB kimliği. |
void grvGorevciyiBaslat | ( | void | ) |
Görevlerin çalışacağı sonsuz döngüyü başlatır.
Listedeki herbir görev sırasıyla çalıştırılır. Görevler işbirlikçi (cooperative) olarak çalışırlar, çalışan göreve, kendisi kontrolü teslim edinceye dek müdahale edilmez.
pgkb_t grvKimlikIleGorevBlogunuAl | ( | const unsigned char | kimlik | ) |
Kimliği verilen görev kontrol bloğuna referans döndürür.
[in] | kimlik | GKB kimliği. |
Görev işlevini alıp bir Görev Kontrol Bloğu (GKB) oluşturur.
Görev olarak tanımlanmış işlev referansını alıp yeni bir görev olarak görevler listesine ekler. Görevler uygulamanın main bölümünde bu işlev kullanılarak oluşturulmalıdır.
[in] | is | İşi yapacak görev kodu bloğu (bir function pointer). |
void grvTikKesmeIsleyici | ( | void | ) |
Sistem tik işleyicisi.
Görevlerin süre takibi yapabilmesi için bu işlevin bir sistem tik timer kesmesi tarafından çağrılması gereklidir.
Bu işlev sistem sürevcisi kesmesinden çağrılır.
unsigned int grvTikSayimi | ( | void | ) |
Anlık sistem tiki değerini verir.
Normalde Görevci tarafından süre takibi yapmak için kullanılır. Nitekim istendiği takdirde bu başlık dosyasını ekleme koşulu ile uygulama içinden de anlık sistem tiki sayımını almak için kullanılabilir. Sistem tiki sayımını atomik olarak okuyup döndürür. Sistem tiki geçen sürenin milisaniye türünden değeri değil, gorevciypl.h dosyasında tanımlanan SISTEM_TIK_SURESI_uS süre değerinin kaç kez oluştuğunu sayan bir birimdir. Diğer bir deyişle sistemin kalp atışının sayısıdır. Ancak mikrosaniye ve milisaniye birimlerine kolayca dönüştürülebilir.