RTOS Öğrenmek İçin Bahane

Başlatan muhittin_kaplan, 25 Temmuz 2013, 02:28:21

z

#15
@Gerbay

Uzun zamandir sormak istedigim bir soru vardi. Keilin kendisininkinden baska,  multitasking yapan cekirdek kodlar kullaniyor olalim.

Tasklardan birisinde y=sin(x) gibi bir fonksiyon olsun.
Diger taskda da g=sin(x) olsun.

sin fonksiyonunu donanimsal değil de yazilimsal olarak cok uzun kodlardan olusan programla hesaplayan C komutunu kullanmis olalim.

1. task sin islemine baslayip bitiremedigi bir sirada task gecisi olsun ve 2. task gene sin islemini yapmaya calissin.

Keil sin isleminde sapitirmi? Keil'in C fonksiyonlari boyle durumlarin ustesinden gelecek sekilde mi yazilmistir?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

Alıntı YapKeil sin isleminde sapitirmi? Keil'in C fonksiyonlari boyle durumlarin ustesinden gelecek sekilde mi yazilmistir?

multithreaded/multitasking sistemlerde ortak kutuphanelerin re-entrant olmasi gerekir.

Bunu cesitli mekanizmalar ile garanti edebilirsiniz.

yani sin fonksiyonu iki ayri task tarafindan ayni anda kullanilabilir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

Keildeki durumu biliyormusunuz?

Keil'de multitasking uygulamalari yapilabiliyor. Bu durumda kendi cekirdegimizi yazdigimizi varsayarsak C fonksiyonlarinin tamamini gonul rahatligiyla kullanabilirmiyim?

Cesitli mekanizmalar derken ne demek istediniz?

Dos zamaninda bu buyuk problemdi. Dos mesgul ise DOS intlari kullanmiyor mesgul durumun bitmesini bekliyorduk.

Buna benzer bir yapidanmi bahsediyorsunuz? Evet ise Keil'de boyle bir flag varmi?
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mufitsozen

#18
Alıntı YapKeildeki durumu biliyormusunuz?

irrelevant (tam turkcesini yazmak zor, belki bu sorunuzun cevabinin konu ile alakasi yok denebilir)

Alıntı YapBu durumda kendi cekirdegimizi yazdigimizi varsayarsak

yazdiginiz cekirdeginizin her durumda calistigindan eminseniz o zaman konusuruz.

Alıntı YapCesitli mekanizmalar derken ne demek istediniz?

sayin @z prensip olarak kullanci adinda kendi gercek isim/soyadini kullanmayan/kullanmaktan cekinen ve de (ornegin) re-entrant denince bu ne imis diye arastirma yapmak yerine vaktim yok, senin vaktin cok/degersiz eseklik etmede cevap diyen arkadaslara vs cevap yazmiyorum. Ama yanlis tahmin etmiyorsam sizin yasiniza, tecrubenize ve bazi konularda yapmaya calistiginiz detayli ve derinlemesine calismalara olan saygimdan bu prensibimi bir kereye mahsus olarak bozuyorum.

http://en.wikipedia.org/wiki/Reentrancy_%28computing%29 bahsinden cimbizla cekersek:

genel tanim olarak:
Alıntı YapIn computing, a computer program or subroutine is called reentrant if it can be interrupted in the middle of its execution and then safely called again ("re-entered") before its previous invocations complete execution. The interruption could be caused by an internal action such as a jump or call, or by an external action such as a hardware interrupt or signal. Once the reentered invocation completes, the previous invocations will resume correct execution.

Rules for reentrancy basligindanda:
Alıntı Yap
Reentrant code may not hold any static (or global) non-constant data.
    Reentrant functions can work with global data. For example, a reentrant interrupt service routine could grab a piece of hardware status to work with (e.g. serial port read buffer) which is not only global, but volatile. Still, typical use of static variables and global data is not advised, in the sense that only atomic read-modify-write instructions should be used in these variables (it should not be possible for an interrupt or signal to come during the execution of such an instruction).
Reentrant code may not modify its own code.
    The operating system might allow a process to modify its code. There are various reasons for this (e.g., blitting graphics quickly) but this would cause a problem with reentrancy, since the code might not be the same next time.
    It may, however, modify itself if it resides in its own unique memory. That is, if each new invocation uses a different physical machine code location where a copy of the original code is made, it will not affect other invocations even if it modifies itself during execution of that particular invocation (thread).
Reentrant code may not call non-reentrant computer programs or routines.
    Multiple levels of 'user/object/process priority' and/or multiprocessing usually complicate the control of reentrant code. It is important to keep track of any access and or side effects that are done inside a routine designed to be reentrant.

Ingilizceden Turkceye tercume yapmak konusunda ise bir istisna yapmaya niyetim yok. Bilgisayar, electronic vb teknolojik konulara hakim olmak icin en az bir yabanci dili akici olarak bilmek zorundayiz.

Alıntı YapDos zamaninda bu buyuk problemdi. Dos mesgul ise DOS intlari kullanmiyor mesgul durumun bitmesini bekliyorduk.

DOS benim universiteden mezun olup profesyonel hayatima atildiktan 5 sene sonra tanistigim basit bir kontrol programi idi. O siralarda (uzun bir sure) PClere oyuncak gozuyle bakilmisti. O yuzden dedikleriniz dogrudur.

Alıntı YapBuna benzer bir yapidanmi bahsediyorsunuz?
Hayir, adinda OS(operating system) kelimesi gecmesine ragmen DOS bir isletim sistemi değildir.

DOS tek kullanici ve single-tasking non-reentrant bir kontrol programi/API dir.

Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

muhittin_kaplan

#19
Hocam Sıkıyorsam eğer Kusruma Bakmayın.

void myTaskA(void* pdata)
{
       mutexID = CoCreateMutex ( );
       CoEnterMutexSection(mutexID );   // enter the mutex section
       ...........                                            // critical codes
       CoLeaveMutexSection(mutexID );  // leave the mutex section
}
void myTaskB(void* pdata)
{ 
        CoEnterMutexSection(mutexID );   // enter the mutex section
        ...........                             // critical codes
        CoLeaveMutexSection(mutexID );   // leave the mutex section
}


örneğini vermiş. Tanımlanan yapını elemanlarına Ulaşmak İçin CoOS  CoLeaveMutexSection(mutexID ) yi görmek zorunda. Yoksa CoEnterMutexSection(mutexID ); de bekliyor ve sıradaki göreve devrediyor işlem sırasını. Böyle Anlıyorum.

Ekleme

Peki Mutexle yapacağım işlemi Flag ilede yapabiliyorken neden Mutex ?

z

Mufitsozen hocam,

Dos zamaninda evet multi tasking isler yoktu ama bir tusa basinca hereket etmeye baslayan tabiri yerindeyse o anki  taski tamamen durdurup bir diger taski baslatan kodlar yazabiliyorduk. O yuzden benzetme yaptim.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

muhittin_kaplan

veritabanı işlemlerinde bilgi güncellenirken diğer kullanıcılar için kilitleme işlemi yapılırdı, onun gibi birşey.

muhittin_kaplan

taskın içerisinden fonksiyon çağırabiliyor muyuz ?
çünki ne yaptıysam Usarttan Bilgi gönderemedim.

mufitsozen

Alıntı yapılan: z - 01 Ağustos 2013, 02:23:46
Mufitsozen hocam,

Dos zamaninda evet multi tasking isler yoktu ama bir tusa basinca hereket etmeye baslayan tabiri yerindeyse o anki  taski tamamen durdurup bir diger taski baslatan kodlar yazabiliyorduk. O yuzden benzetme yaptim.

TSR denilen, ve basa bela cikartmaktan baska bir ise yaramayan kucuk programlardan bahsediyorsunuz zannederim.

Bende rs232 den bilgi okuma, zamanla ilgili bir takim uygulamalar ve ozel I/O kartlarimi kullanmak icin TSR ve yuklenen programlarla haberlesmek icin  int 2f (multiplex) mekanizmasini kullanan 5-6 uygulama yazmistim. sonradan DESQview gibi bazi multitasking programlari cikmistida DOS altinda iki is yapacagiz diye sacimizi sakalimizi yolmaktan kurtulmustuk.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

vsalma

Keil in bir fonksiyonu var. Ve bunun thread safe olduğunu bilmiyorsanız illa da kullanacağım diyorsanız bunu da critical section içinde bir anda tek task kullanacak şekilde yazabilirsiniz.


MySinFunction(x)
{
    beginCritialSection
    sin(x);
    endCritialSection

}


Taslarınız içinde MySinFunction fonksiyonunu kullanınız.


Bu konularda benim kafama takılan bir soru var.
mutex ile binary semaphore arasında fark nedir?

 

muhittin_kaplan

Hocam adım adım gitmeyi planlıyorum, Önce Flasg, Mutex Semaphore ve diğer konular.

muhittin_kaplan

tasklar arası geçiş için
void taskB (void* pdata){


  for (;;) {
	CoWaitForSingleFlag(flagID,0);
	USART_puts(USART2,str);// "Init complete! Hello World!rn");
	CoTickDelay(1)
  }
}

de bekleme koymak zorundamıyız, eğer kaldırırsam diğer task a geçmiyor.

muhittin_kaplan

hocam flagla alakalı değil hiç flag olmasa dahi bekleme olmadığında task geçişi olmuyor.

mufitsozen

Alıntı yapılan: muhittin_kaplan - 02 Ağustos 2013, 16:49:30
hocam flagla alakalı değil hiç flag olmasa dahi bekleme olmadığında task geçişi olmuyor.



sayin @muhittin_kaplan bence cevap yazmadan once @gerbayin mesajini arada dusunerek 5 kere daha okuyup irdelemeye calisiniz.  :P
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

muhittin_kaplan

5 kez irdeledim ama
Geybay ın bahsettiği flag ile alakalı olarak,
"eğer flag ile blokladığın task ı atlayıp diğer task a sıradaki task a geçmiyorsa" demiş, (geçmiş konuşmalardan dolayı) bende bunun üzerine flag ile alakalı olmayıp delay koymadığım hiçbir taskı bırakmıyor dedim.

atladığım nokta nedir, hatalı yaptığım mı, zaten hatalı yaptığımdan dolayı düzgün çalışmıyor.