Görev Durumları

Görevleri (task) senkronize etmek için sistem olayları (event) kullanır. Örneğin; iki aktif görevimiz (task) olsun (bunlar OS_Task_Create ile yaratılmış olsunlar): bir tanesi sıcaklık ölçsün ve diğeri de bu değeri ekrana bassın. İkinci görev (task) bir ölçüm değeri yoksa ekrana bir şey basamayacaktır. Bu durumda birinci görev (task) ölçümü yaparken, ikinci görev (task) bekleyecektir. Sıcaklık ölçümünden sonra (diğer bir deyişle, olay (event) gerçekleştiğinde), ikinci görev (task) işlemeye hazır olur. Daha sonra da ikinci görev (task) işleme alınır.

Bu yüzden tüm görevler (task) beş farklı duruma sahip olabilirler:

aktif değil (not active) görev (task) oluşturulmamış ya da silinmiş
beklemede (waiting) görev (task) bir olay gerçekleşmesini bekliyor
hazır (ready) istenilen olay gerçekleşmiş fakat görev (task) kontrolü eline almamış
çalışıyor (running) görev (task) işletiliyor
duraklamış (paused) görev (task) duraklatılmış. Hâlâ aktif fakat kontrolü eline alamamış

Görevin (task) kontrolü ele alabilmesi için iki koşulu yerine getirmesi gerekir:

  1. Görevin (task) beklediği olay (event) gerçekleşmelidir (görev hazır (ready) durumuna geçmelidir);
  2. Görevin (task) önceliği diğer hazır görevlerden (task) büyük olmalıdır.

Olaylar

OSA da olaylar (event) aşağıdaki şekilde ayrılırlar:

  1. semafor (binary veya counting);
  2. message (bir mesaj gövdesi veya basit bir bayt mesaj göstericisi );
  3. bayrak kombinasyonları;
  4. timeout (zaman aşımı);
  5. herhangi boolean tanımlaması.

Yukarıdaki ilk 4 tip, kendi bölümlerinde açıklanacaklardır. 5. tip opsiyonel ve görevlerin (task) bazı sistem dışı beklemeleri kabul etmesini sağlar. Örneğin;

// TMR1'in taşması bekleiyor
OS_Wait(TMR1IF);
or
OS_Wait_TO(ReadADC(0)
>  128);
// Giriş geriliminin Vdd/2'den büyük olması bekleniyor

Bu iki servis sistem servisleri kısmında açıklanmıştır.

Öncelik

Tüm görevler (task) 0′dan (en yüksek) 7′ye (en düşük) kadar değişik önceliklere sahiptir.

Üç adet öncelik seviyesi vardır:

  • disabled priorities (öncelikler deaktif) – tüm işaretlenmiş öncelikler reddedilecektir. Bu en hızlı ve kompakt moddur: fakat bu yüksek öncelikli önemli görevleri önceliksiz kılar.
  • normal priorities (normal öncelik sırası) – her görev (task) kendi önceliğine sahiptir. Eğer birden fazla hazır (ready) görev (task) varsa, önceliği yüksek görev (task) kontrolü ele alır. Eğer bir kaç hazır (ready) görev (task) aynı önceliğe sahipse, bunlar round-robin modunda çalıştırılırlar. Bu modun iki dezavantajı vardır:
    1. Eğer sürekli hazır görev (task) yüksek öncelikliğe sahipse, hiç bir düşük öncelikli görev (task) kontrolü eline alamaz;
    2. Eğer iki ya da daha fazka görev (task) aynı önceliğe sahipse ve her ikisi de aynı olayı (event) bekliyorlarsa, sadece bir tanesi kontrolü ele alacaktır;
  • extended priorities (geliştirilmiş öncelikler) (YENİ) – her görev (task) önceliklerine göre kontrolü eline alacaktır. Örneğin, elimizde iki tane, öncelikleri sırasıyla 3 ve 4 olan görev (task) bulunsun. Bir tanesi %55-60 ile kontrülü ele alırken (önceliği 4 olan) diğeri %40-45 ile kontrolü ele alacaktır. Bu modun avantajı tüm görevlerin (task) kontrolü mutlaka ele alacağını garanti etmesidir. Fakat bu modda sistem her görev (task) için RAM’de 2 ayrı byte bölgesine ihtiyaç duyar.

Görev düzenleyiciler (scheduler) hakkında daha fazla bilgi için Hız Karakteristiği bölümünü okuyunuz.

Öncelik modları bir kez osacfg.h içerisinde OS_PRIORITY_LEVEL ile tanımlanırlar:

#define OS_PRIORITY_LEVEL    OS_PRIORITY_DISABLE    // Öncelikle deaktif
#define OS_PRIORITY_LEVEL    OS_PRIORITY_NORMAL     // Normal öncelik sıralaması açık
#define OS_PRIORITY_LEVEL    OS_PRIORITY_EXTENDED   // Geliştirilmiş öncelik sırası açık

Öncelik sıralaması varsayılan olarak OS_PRIORITY_NORMAL ayarlanmıştır.

Öncelik Çekişmesi (Priority Competition)

Bazı durumlarda farklı görevler (task) aynı olayı (event), örneğin bazı iç kaynakları (UART, ADC, SPI) ya da bazı dış kaynakları (EEPROM, LCD vb) bekleyebilirler. Peki sistem bu şekilde nasıl davranır?

Olay (event) gerçekleştikten sonra, bu olayı (event) bekleyen tüm görevler (task) hazır (ready) konumu alırlar. Kernel daha sonra en yüksek öncelikli görevi (task) bulur ve bunu işletir. Bu görev (event) işletildikten sonra, bu olay (event) temizlenir (örneğin tüm görevler semaforu bekler ve olayın (task) işletilmesi bunu resetler) ve tüm görevler (task) tekrar bekleme (waiting) moduna geçerler.

Extended priorities (geliştirilmiş öncelikler) modunda çalışmada ise, hazır fakat daha yüksek önceliğe sahip görev (task), olayı (event) resetlediği için kontrolü eline alamamış görevlerin (task) önceliği arttırılacaktır. Böylelikle düşük öncelikli görevlere (task) bir dahaki çevrimde kontrolü ele alma şansı tanınır.