timerla geciktirilmiş program çağırımı ?

Başlatan piedos, 15 Eylül 2006, 01:53:52

piedos

Arkadaşlar ANSIC de şunu yapmak istiyorum


böyle bir fonksiyona ihtiyacım var, aşağıdaki gibi bir protottip düşündüm,
bütün parametreler ve geri dönüş değerleri global

void islem()
{

gerekli_islemleri_yap();

geciktirilmis_cagrim( islem_onayi = islem_kontrolu(parametre1, parametre2, ...), ne_kadar_sonra_çağrılacak );

}


geciktirilmis_cagrim( func_type cagrilacak_fonksiyon, int gecikme)
{

cagrilacak_fonksiyon;

}



void islem();  dışardaki sisteme komut gönderiyor, sistem geç tepki verdiği için sistem çalıştı mı diye beklemek istemiyorum, bu arada diğer işleri yapmak istiyorum, belirlenen gecikme kadar sonra konteol fonksiyonu timer interruptı yardımıyla çağrılıyor.  Bunu timer içinde if else
gibi yapıyla çağırabilirdim ama ben genel ve dinamik bir fonksiyon kullanmak istiyorum, çünkü kod geliştikçe yeni gecikmeli kontroller gerekebiliyor bu durumda sürekli timer rutinine kod eklemek zaman ve ROM kaybına neden oluyor.

Aslında bu bir threade benziyor ama ben bunu ANSIC de oluşturmaya çalışıyorum.

Aslında
geciktirilmis_cagrim( func_type cagrilacak_fonksiyon, int gecikme)
fonksiyonunun argümanı olan  "func_type" gibi bir değişken oluşturabilirsem bu iş çözülür, ancak her türlü fonksiyona uyabilmeli
örneğin printf fonksiyonu değişen sayida ve türde parametre alabiliyor, acaba bunu nasıl yapmışlar?

printf("%s","merhaba");
printf("SICAKLIK: %d, NEM: %d",sicaklik,nem);

void timer_int()
{

if( cagrilmak_icin_bekleyen_fonksiyon_varmi() )
    cagir(global_fonksiyon_kutusu);

create_tick();

global_counter++;

}



Umarım ne yapmak istediğimi anlatabilmişimdir, olay biraz karışık, benim kafamda bazi çözümler uçuşuyor ama henüz başaramadım.

İlgineceklere teşekkürler
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

piedos

Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."

picusta

Dedigin gibi
Aslında bu bir threade benziyor ama ben bunu ANSIC de oluşturmaya çalışıyorum.

ANSI C'de o zaman kendi SCHEDULER'ini yazacaksin. Bunun için FreeRTOS'taki kodlara (veya Linux kernel) bakabilirsin. Aktiflenecek threadlerin bi listesini tutmalisin, her tickte (timer interrupt) bu scheduler devreye girecek.

Klein

ya da..!

araya assembly kodlar girilecek. bir adrese çağırılacak fonksiyonun adresi , geri dönüş adresi atanacak.  Interrupt geldiğinde yine bir assembly kod çalışıp ilgili adrese dallanacak. fonksiyon işini bitirdiğinde dönüş değeri yine bir registere aktarılıp , sonra dönüş adresine gidilecek.
vs.... vs....

piedos

Alıntı yapılan: "Klein"ya da..!

araya assembly kodlar girilecek. bir adrese çağırılacak fonksiyonun adresi , geri dönüş adresi atanacak.  Interrupt geldiğinde yine bir assembly kod çalışıp ilgili adrese dallanacak. fonksiyon işini bitirdiğinde dönüş değeri yine bir registere aktarılıp , sonra dönüş adresine gidilecek.
vs.... vs....


Bunu düşünmüştüm ama Assembly olarak müdahale edemiyorum, picusta nın yöntemini deneyeceğim,

teşekkürler
Einstein: "Only two things are infinite, the universe and human stupidity, and I'm not sure about the former."