Başlangıç > Freelance > Multitasking 2

Multitasking 2

Daha önce yazdığım Multitasking konusunda, multitasking denilen işlemin ne demek olduğunu ve nasıl yapılabileceğini açıklamıştım. İşin özünde mikrokontrolcünün PC değerini değiştirmek ve task dan task a atlamasını sağlamak yatıyordu. Multitasking 2 konusunda ise tasklar arasındaki geçiş işlemini daha farklı bir şekilde yapacağız.

Bunun için yine bir timer kuracağız ve timer ile task sürelerini belirleyeceğiz. Her task ın kendisine ait bir sayacı olacak ve bu sayaç geri doğru sayacak. Sayaç sıfırlandığında ise task ın süresi gelmiş olacak ve task ı aktif edecek bayrağı set edeceğiz.

Bu durumda main fonksiyonu aşağıdaki gibi olacaktır.


void main(void)
{
 vInitializeTimer1();
 while(1)
 {
 //====================================================================
 if(Tasks.Task1 == TRUE)
 {
 Tasks.Task1 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 //====================================================================
 if(Tasks.Task2 == TRUE)
 {
 Tasks.Task2 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 //====================================================================
 if(Tasks.Task3 == TRUE)
 {
 Tasks.Task3 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 //====================================================================
 if(Tasks.Task4 == TRUE)
 {
 Tasks.Task4 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 //====================================================================
 if(Tasks.Task5 == TRUE)
 {
 Tasks.Task5 = FALSE;
/* task işlemleri bu satırın altında yer almalı*/
 }
 }
}

Yukarıda verilen task lar timer kesmesi içinde zamanlanır. Bu durumda timer kesmesi aşağıdaki gibi olacaktır.


#define TASK_PERIOD_TASK1 1000
#define TASK_PERIOD_TASK2 2000
#define TASK_PERIOD_TASK3 3000
#define TASK_PERIOD_TASK4 4000
#define TASK_PERIOD_TASK5 5000
void vTaskScheduler(void)
{
 if(Tasks.Task1Counter > 0) Tasks.Task1Counter--;
 if(Tasks.Task2Counter > 0) Tasks.Task2Counter--;
 if(Tasks.Task3Counter > 0) Tasks.Task3Counter--;
 if(Tasks.Task4Counter > 0) Tasks.Task4Counter--;
 if(Tasks.Task5Counter > 0) Tasks.Task5Counter--;
 if(Tasks.Task1Counter == 0)
 {
 Tasks.Task1Counter = TASK_PERIOD_TASK1;
 Tasks.Task1 = TRUE;
 }
 if(Tasks.Task2Counter == 0)
 {
 Tasks.Task2Counter = TASK_PERIOD_TASK2;
 Tasks.Task2 = TRUE;
 }
 if(Tasks.Task3Counter == 0)
 {
 Tasks.Task3Counter = TASK_PERIOD_TASK3;
 Tasks.Task3 = TRUE;
 }
 if(Tasks.Task4Counter == 0)
 {
 Tasks.Task4Counter = TASK_PERIOD_TASK4;
 Tasks.Task4 = TRUE;
 }
 if(Tasks.Task5Counter == 0)
 {
 Tasks.Task5Counter = TASK_PERIOD_TASK5;
 Tasks.Task5 = TRUE;
 }
}

void Timer1IntHandler(void)
{
 vClearTimerFlag();
 vTaskScheduler();
}

Timer kesmesinin her 1ms yede bir kez oluştuğunu düşünürsek TASK_PERIOD_TASKx değeri 1000 olduğunda x taskı her bir saniyede bir kez çalıştırılacaktır. Verilen örnekte de timer kesmesini 1ms olarak kabul edersek sırasıyla task lar 1, 2, 3, 4 ve 5 saniye de 1 kez çalıştırılacaklardır.

 

 

 

Reklamlar
  1. melih
    10 Şubat 2012, 11:53

    Mail atmıştım cevap gelmeyince meraklandım.Hasta falan mı diye.Sonra Şubat eklentinizi görünce buradan meraba deyim dedim.

    Dostum malum projede buraya çok yakışır.Toggle veya momentary 8 kanal ir devre.
    Ne durumda bilemiyorum tabi.Sizi sıkıştırıyormuşum gibi algılamayın lütfen.

    Bu arada üstad c kodu en pratik hex koda nasıl çevirebilirim.Hangi programla

    Kolay gelsin.

  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: