Bir evrenin çalışmasını anlamanın en iyi yolu, bir gerçek zamanlı programı izlemektir. Örneğin, aşağıda görünen program her saniye bir kez çalışacak ve her bir yineleme sırasında 'Merhaba Dunya' yazacak.
- Örnek 12.1. hello.c dosyası
#include <rtl.h>
#include <time.h>
#include <pthread.h>
pthread_t evre;
void * evre_kodu(void)
{
pthread_make_periodic_np(pthread_self(), gethrtime(), 1000000000);
while (1)
{
pthread_wait_np ();
rtl_printf("Merhaba Dunya\n");
}
return 0;
}
int init_module(void)
{
return pthread_create(&evre, NULL, evre_kodu, NULL);
}
void cleanup_module(void)
{
pthread_delete_np(evre);
}
Şöyle init_module() ile başlayalım. init_module(), pthread_create() işlevini çağırır. Bu, çağrılan evre ile aynı anda çalışan yeni bir evre oluşturmak içindir. Bu işlev sadece Linux çekirdek evresinden çağrılabilir (init_module() kullanılarak).
int pthread_create(pthread_t *evre,
pthread_attr_t *oznitelik,
void * (*evre_kodu)(void *),
void *arg);
Oluşturulan yeni evre pthread.h başlık dosyasında tanımlanan pthread_t türündedir. Bu evre, evre_kodu() işlevini, argümanını arg ile aktararak çalıştırır. oznitelik değişkeni yeni evreye uygulanacak evre özniteliklerini belirler. Eğer oznitelik NULL ise, öntanımlı öznitelikler kullanılır.
Bundan dolayı burada, evre_kodu() argümansız çağrılır. evre_kodu üç bileşenden (ilklendirme, çalışma ve sonlandırma) oluşur.
İlkllendirme aşamasında pthread_make_periodic_np() çağrısı yapılır.
int pthread_make_periodic_np(pthread_t evre,
hrtime_t başlatma_anı,
hrtime_t süre);
pthread_make_periodic_np evre'yi çalışmaya hazır olarak imler. Evre başlatma_anı'nda çalışmasına başlayacak ve nanosaniyelerle belirlenmiş bir süre'yle çalışacaktır.
gethrtime işlevi sistemin başlamasından beri geçen zamanı nanosaniyeler cinsinden döndürür.
hrtime_t gethrtime(void);
Bu zaman asla sıfırlanamaz ya da ayarlanamaz. gethrtime, daima monoton artan değerler verir. hrtime_t türü, 64 bitlik işaretli tamsayı belirtir.
pthread_make_periodic_np() çağrısıyla evre, işlemci zamanlayıcısına bu evreyi bir saniyede bir çalıştırmasını söyler. Bu, evre için ilklendirme bölümünün sonudur.
while() döngüsü, çalışmakta olan gerçek zamanlı evreyi sonraki süre'nin başlamasına kadar beklemeye alacak pthread_wait_np() işlevine bir çağrı ile başlar. Bu evre önceki bir pthread_make_periodic_np çağrısını ile devreye alınır. Evre tekrar çağrılır çağrılmaz, başka bir pthread_wait_np() çağrısıyla karşılaşana kadar while döngüsünde kalanlar çalıştırılır.
Bizim döngüden çıkmamızı sağlayacak bir yol olmadığından bu evre 1Hz'lik sıklıkla çalıştırılmaya devam edecektir. Programı sonlandırmanın tek yolu rmmod komutu ile onu çekirdekten ayırmaktır. Bu, evreye ayrılan özkaynakları serbest bırakarak evrenin iptal edilmesini sağlayan pthread_delete_np() işlevini çağıracak olan cleanup_module() işlevini çağıracaktır.