Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => RTOS Uygulamaları => Konuyu başlatan: mcan - 11 Mart 2012, 12:32:06

Başlık: keil rtx delay problemi
Gönderen: mcan - 11 Mart 2012, 12:32:06
Deneme amaçlı 2 taskdan oluşan şu şekilde bir kod yazdım,


/*----------------------------------------------------------------------------
*   Task 1:  RTX Kernel starts this task with os_sys_init (task1)
*---------------------------------------------------------------------------*/
__task void task1 (void) {
  /* Obtain own system task identification number */
// id1 = os_teşekkür_self ();
  /* Assign system identification number of task2 to id2 */
  id2 = os_teşekkür_create (task2, 1);
 
  os_tmr_create(100,33);   
  for (;;) {
temp_cycle++;
  }
}

/*----------------------------------------------------------------------------
*   Task 2:  RTX Kernel starts this task with os_teşekkür_create (task2, 1)
*---------------------------------------------------------------------------*/
__task void task2 (void) {
  for (;;) {

os_dly_wait (256);//delay_ms(500);

if(timer_exp==33)
{
  os_tmr_create(100,33);
temp_cycle = 0;
timer_exp = 0 ;
}
  }
}


ayrıca şu kodu ekledim
/*--------------------------- os_tmr_call -----------------------------------*/

void os_tmr_call (U16 info) {
  /* This function is called when the user timer has expired. Parameter   */
  /* 'info' holds the value, defined when the timer was created.          */
  cycle = temp_cycle;
  temp_cycle = ((8727024-cycle)/87270);
  printf("Cycle =%%%u , %u\r\n",temp_cycle,cycle);
  timer_exp = 33;
  /* HERE: include optional user code to be executed on timeout. */
}

Sıstem frekansı 72mhz , user timer 1 adet tanımlandı, diğer herşey default (10ms tick,50ms round robin..)
Sorun şu os_dly_wait (256); komutunda 255 e kadar ki değerlerde program normal gibi çalışıyor ancak 256 dan sonra task 2 içerisindeki saydığı sayı sabitleşiyor. Asıl sorun daha düşük bir değerde sabitlenmesi.Mesela 250 ye set edildiğinde 20 milyona kadar sayarken 256 set edildiğinde 7 milyona kadar sayıyor. Oysaki task1 daha az kesintiye uğrayacağından daha çok sayması gerekirdi 255 e kadar bu şekilde davranıyor.7 milyon 9 milyon 12 milyon.... Ancak 255 den sonra işler değişiyor. Bunun nedeni ne olabilir? Ayrıca 72mhz de hiç bir kod yokken 20 milyona kadar sayması bana biraz az gibi geldi.Yani en iyi ihtimalle 1 saniyede teorik olarak 72milyona kadar sayacağını varsaysak mevcut duruma göre işlemcinin %72 zamanı başka işlere gidiyor gibi.

Ayrıca düşük değerlerde  os_dly_wait (2) gibi task2 içinde temp_cycle = 0; kodu ile değişken sıfırlansa bile task 1 içinde toplama işlemi sonucu değişken hiç sıfırlanmıyor.temp_cycle global volatile unsigned int olarak tanımlı.Sorun ne olabilir? global değişkenler ile tasklar arası veri aktarılmazmı? Global değişken üzerinde kullandığım kod atomik gibi duruyor biri temp_cycle = 0 diğeri ise temp_cycle++ bunlar atomik değilmi acaba?