Görevci by Kozmotronik v2.1.1
Küçük gömülü sistemler için çoklu görev (multi-tasking) yönetimi uygulaması
Yüklüyor...
Arıyor...
Eşleşme Yok
Görev Yönetimi

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_tpgkb_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örev Durum Kodları

Görevlerin işletimdeki durumlarını belirten kodlardır.

#define grvBEKLIYOR   0
 Görev bir olayın gerçekleşmesini bekliyor.
 
#define grvCIKTI   1
 Görev işlemin herhangi bir noktasında çıktı (çalışmasını sonlandırdı).
 
#define grvBITTI   2
 Görev işlemi tamamlayarak bitti.
 
#define grvVAZGECTI   3
 Görev işlemin herhangi bir noktasında gönüllü olarak vazgeçti.
 

Ayrıntılı tanımlama

Görevlerin yönetimini gerçekleştiren API.

Makro Dokümantasyonu

◆ grvBASLA

#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:

grvBASLA(tutucu);
#define grvBASLA(g)
Definition gorev.h:187
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.

◆ grvBITIR

#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:

grvBITIR(tutucu);
#define grvBITIR(g)
Definition gorev.h:206
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.

◆ grvBU_KOSULDA_BEKLE

#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.

bool kuyrukDolumu(void)

Bu durumda kuyrukDolumu() işlevi false döndürene dek, yani kuyruk boşalana dek görev bloklanacaktır.

grvBU_KOSULDA_BEKLE(gorevTutucu, kuyrukDolumu());
#define grvBU_KOSULDA_BEKLE(g, kosul)
Definition gorev.h:327
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.
kosulO anda sağlanan ve sağlanmaması için beklenecek bir koşul belirten ifade.

◆ grvCIK

#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:

grvCIK(gorevTutucu);
#define grvCIK(g)
Definition gorev.h:369
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.

◆ grvGECIK_MS

#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:

static sure_t sureTutucu;
// ...
grvGECIK_MS(tutucu, &sureTutucu, 1000);
#define grvGECIK_MS(g, s, gecikme)
Definition gorev.h:236
Definition gorev.h:132
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.
ssure_t türünde bir süre tutucu değişkene başvuru.
gecikmeMilisaniye türünden gecikme süresi.

◆ grvILKLE

#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.

Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.

◆ grvKOSUL_BEKLE

#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:

int miktar = 0;
//...
grvKOSUL_BEKLE(tutucu, miktar > 0);
#define grvKOSUL_BEKLE(g, kosul)
Definition gorev.h:297
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.
kosulGerçekleşmesi beklenecek bir koşul belirten ifade.

◆ grvKOSULA_DEK_VAZGEC

#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:

bool mesajAlindi; // Global bir değişken
//...
grvKOSULA_DEK_VAZGEC(gorevTutucu, mesajAlindi == true);
#define grvKOSULA_DEK_VAZGEC(g, kosul)
Definition gorev.h:417
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.
kosulSağlanması gereken koşul ifadesi.

◆ grvKOSULLU_GECIK_MS

#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:

static sure_t sureTutucu;
static int a;
// ...
// a değişkeni 0'dan farklı bir değer aldığında gecikme hangi
// aşamada olursa olsun görev, bekleme durumundan çıkıp
// çalışma durumuna geçecek ve kaldığı yerden devam edecektir.
grvKOSULLU_GECIK_MS(tutucu, &sureTutucu, 1000, a == 0);
#define grvKOSULLU_GECIK_MS(g, s, gecikme, kosul)
Definition gorev.h:275
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.
ssure_t türünde bir süre tutucu değişkene başvuru.
gecikmeMilisaniye türünden gecikme süresi.
kosulGecikmenin bağlı çalışacağı koşul.

◆ grvSIFIRLA

#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:

grvSIFIRLA(gorevTutucu);
#define grvSIFIRLA(g)
Definition gorev.h:349
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.

◆ grvVAZGEC

#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:

grvVAZGEC(gorevTutucu);
#define grvVAZGEC(g)
Definition gorev.h:390
Parametreler
ggorevTutucu_t türünde bir tutucu (handle) alır. Bu, görev kontrol bloğuna bir başvurudur.

◆ NULL

#define NULL

include sorunlarına önlem olarak NULL tanımlaması.

Fonksiyon Dokümantasyonu

◆ grvBaslat()

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.

Parametreler
[in]kimlikGKB kimliği.

◆ grvDurdur()

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.

Parametreler
[in]kimlikGKB kimliği.

◆ grvGorevciyiBaslat()

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.

Uyarı
Bu işlev main işlevinden doğrudan çağrılmamalıdır. Bunun yerine hangi platform için geliştirme yapılıyorsa, o platformun portGorevciyiBaslat() işlevi ile görevci başlatılmalıdır. portGorevciyiBaslat() işlevi platforma özel gereken ilklemeleri yapacak ve ardından grvGorevciyiBaslat işlevini çağıracaktır. Doğru uygulama bu şekildedir. Aksi takdirde beklenmedik sonuçlar elde edilebilir.
Ayrıca Bakınız
portGorevciyiBaslat().

◆ grvKimlikIleGorevBlogunuAl()

pgkb_t grvKimlikIleGorevBlogunuAl ( const unsigned char kimlik)

Kimliği verilen görev kontrol bloğuna referans döndürür.

Parametreler
[in]kimlikGKB kimliği.
Döndürdüğü değer
gorev_t türünde görev kontrol bloğuna referans, yoksa NULL.

◆ grvOlustur()

pgkb_t grvOlustur ( is_t is)

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.

Parametreler
[in]isİşi yapacak görev kodu bloğu (bir function pointer).
Döndürdüğü değer
gorev_t türünde görev kontrol bloğuna referans, yoksa NULL.

◆ grvTikKesmeIsleyici()

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.

◆ grvTikSayimi()

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.

Döndürdüğü değer
Anlık sistem tiki değeri.