Multitasking
Birden çok işlemi aynı zamanda yapıyormuş gibi (multitasking) göstermenin yolları bu yazıda |
Multitasking, birbirinden bağımsız birden çok görevin, eş zamanlı çalıştırılıyormuş gibi görüntülenme yeteneğidir. “Çalıştırılıyormuş gibi” kısmının altını çizmek gerekir çünki birden çok işlemcinin olmadığı bir yerde aynı anda birden çok görevin icrası mümkün değildir. Fakat görevlerin aynı anda icra ediliyormuş gibi gösterilmesi mümkündür. Eğer işlemci zamanı görevler için bölünürse ve görevler arasındaki geçiş hızlı bir şekilde anahtarlanırsa, işlemci birden çok görevi aynı anda yapıyormuş gibi görünür.
Daha rahat anlaşılması için şöyle bir örnek verelim. Diyelimki 3 adet arabamız ve bir motorumuz var. Arabaların oldukları yerden bir noktaya gitmesini istiyoruz. Sırayla ilk arabaya motoru takıyor ve t sürede ilk arabayı hedefine ulaştırıyoruz. Daha sonra motoru diğer arabaya ve sonra diğer arabaya takıp yaklaşık 3t zamanında 3 arabayıda teker teker hedefine ulaştırıyoruz. Kısaca özetlersek bir araba hedefine ulaşmadan diğer araba hareket ettirilmedi.
3 arabayı aynı anda hedefe ulaştırmak içinse t/x kadar bir süre motoru ilk araca sonra t/x kadar bir süre için motoru diğer araca sonra t/x kadar süre için de motoru son araca takmak süretiyle bu işlemi x kere tekrarladığımızda 3t süresi sonunda yine 3 araç da hedefine ulaşmış olacaktır fakat bu sefer 3 üde aynı anda ve 3 üde aynı sürede hedeflerine ulaşmış olacaklardır. Dışarıdan 3 arabaya bakıldığında 3üde aynı anda hareket ediyormuş gibi görülür işte buna multitasking denir. Multitasking çalışan bir işlemci, belirli bir süre belirli bir görevi icra edip, bu göreve ara verir ve diğer göreve geçer. Tüm görevler belirli bir süre icra edilir ve son görevden sonra yeniden başa dönülüp ara verilen göreve kaldığı yerden devam edilir. Bu şekilde tüm görevler aynı anda yaplıyormuş gibi görünür.
8051 için basit bir örnek verelim:
#include <AT89X52.H>
#include <intrins.h>
#define TASK_COUNT 3
unsigned char x,y,z;
unsigned char osOnStartSP;
unsigned char osOnIntSP;
unsigned char osTaskNumber=1;
unsigned short osTaskAddress[TASK_COUNT+1];
void (*osTaskPointer)(void);
void osTask1(void)
{
while(1)
{
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
x++;
x–;
}
}
void osTask2(void)
{
while(1)
{
y++;
y–;
y++;
y–;
}
}
void osTask3(void)
{
while(1)
{
z++;
z–;
z++;
z–;
}
}
void main(void)
{
//Init Task Scheduler
TMOD &= 0xF0;
TH0 = 0×00;
TL0 = 0×00;
ET0=1;
EA=1;
TR0=1;
osTaskPointer=&osTask1;
osTaskAddress[1]=*osTaskPointer;
osTaskPointer=&osTask2;
osTaskAddress[2]=*osTaskPointer;
osTaskPointer=&osTask3;
osTaskAddress[3]=*osTaskPointer;
osOnStartSP=SP;
while(1);
}
void osTaskScheduler(void) interrupt TF0_VECTOR
{
TF0 = 0;
osOnIntSP=SP;
SP=osOnStartSP+2;
_pop_(DPL);
_pop_(DPH);
osTaskAddress[–osTaskNumber]=(DPL<<8)|DPH;
DPL=osTaskAddress[++osTaskNumber]>>8;
DPH=osTaskAddress[osTaskNumber]&0xFF;
_push_(DPH);
_push_(DPL);
SP=osOnIntSP;
osTaskNumber++;
if(osTaskNumber>TASK_COUNT) osTaskNumber=1;
}
Not: Tasklar içerisinde yapılan işlemler göstermeliktir!
Yukarıdaki programda while(1) sonsuz döngüsü ile oluşturulmuş 3 görev (task) vardır. Ana program içerisinde de görev zamanlayıcısı olarak bir timer kurulur.
Timerın her kesmesinde interrupt alt programına girilir ve stack pointer a kesmeden önce hangi program counter adresi yazılmışsa o geri alınır, kaydedilir ve bir sonraki görevin kaldığı adres daha önce kaydedilmiş bir değişken içerisinden çekilerek stack pointer a geri yüklenir ve intterupt alt programından çıkılır. Otomatik olarak işlemci interrupttan çıkışta stack pointer değerini geri yüklediği için bir sonraki göreve atlanmış olur.
Her görev,
void osTask(void)
{
while(1)
{ }
}
şeklinde yazıldığından, sonsuz döngü nedeniyle hiçbir görevden geri dönülemez.
Her görevin icra süresi ise timer süresi kadardır. Herbir görevin timerın belirlediğ süre aralıklarında parça parça işlenmesinden dolayı tüm görevler aynı andan icra ediliyormuş gibi görünür, dolayısı ile multitasking yapılmış olur.
Bu linkteki dosyayi keil projesinde simulasyon yapıp tasklar arasında nasıl geçiş yapıldığını ve aynı taska gelindiğinde nasıl kalındığı yerden devam edildiğini görebilirsiniz
T. Yücel Mayadağlı