Başka bir RTOS: Keil RTX

Başlatan Erol YILMAZ, 26 Mart 2011, 20:11:14

Erol YILMAZ

ARM için Keil de yazan arkadaşlar,
Hemen yanı başınızda bir RTOS var, Adı : Keil RTX

Kullanımı gayet basite indirgenmiş,
Buradaki dökümanı incelediğimde RTOS ile yeni tanışan arkadaşlara bu işi kavratacak
bir döküman old. anladım,  Lütfen inceleyiniz...

Alıntı YapThe Keil RTX is a royalty-free,
deterministic Real-Time Operating System designed for ARM and Cortex-M devices.
It allows you to create programs that simultaneously perform multiple functions and
helps to create applications which are better structured and more easily maintained.




http://www.keil.com/product/brochures/rl-arm_gs.pdf


http://www.keil.com/rl-arm/kernel.asp

http://www.keil.com/rl-arm/rtx_benefits.asp

Elinizdeki Keil MDK içinde kolayca aktif hale getirebilirsiniz.

İşlem legal olmadığı için anlatmıyorum, Kırık kullanmanızı tavsiye de etmiyorum :P

Bunları gösteriyoruz da ne oluyor ?
Daha önce RTOS ile çalışmamış arkadaşlar bir an önce denesinler ve kullanım kılavuzlarını Ingilizceleri
yeterli olmasa bile iyice okusunlar...
Bir tanesini kavrayınca diğerleri de zaten %90 oranında aynısı oluyor...
Şimdiden kolay gelsin.
Bu arada ARM dünyasına giriş yapmamıştım ama bu yazılımın güzelliği uğruna girecem sanırım :)))

Erol YILMAZ

Bu da genel istek üzerine Keil RTX üzerinde çalışan 2 görevli bir RTOS programı...

RTOS, 10 ms de 1 SYStimer INT yaptıracak şekilde ayarlanmış,

Round Robin modda çalışıyor...

250 göreve kadar görev çalıştırabiliyor...



#include <RTL.h> 

OS_TID task1;
OS_TID task2;

U16 counter1;
U16 counter2;

__task void job1 (void);
__task void job2 (void);

__task void job1 (void) {
  task1 = os_task_create (job1,1);
  task2 = os_task_create (job2,1);

  while (1) {
    counter1++;
    os_dly_wait (10);
  }
}
        
__task void job2 (void) {
  while (1) {
    counter2++;
    os_dly_wait (20);
  }
}

int main (void) {

  os_sys_init (job1);
}

Erol YILMAZ

Biraz flood yapayım,,,

Bir C fonksiyonu ile TASK arasında temel olarak aşağıdaki gibi bir fark var.


fatihinanc

Peki burada sağda verilen "Task" kısmında for( ;; ) sonsuz döngüsünün bitme koşulu "task" fonksiyonuna ayrılan süre mi oluyor ?
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

Erol YILMAZ

#4
Sonsuz döngü normal şartlarda sürekli çalışıyor,
Sonsuz döngünün işlevini yapmaması, artık o task ın disable duruma gelmesi ile mümkün...


Örneğin :
os_tAsk_delete (tAskID1);
os_tAsk_delete_self ();



Misal o task ta vereceğimiz os_delay( ) gibi gecikme anlarında işlemci o görevi bırakıp
diğer görevlere geçiyor...

Örneğin :
os_dly_wait (dly);

veya diğer görevlere bak diye basit bir fonksiyonla RTOS' a bildirilebiliyor.

Örneğin :
os_tAsk_pass ();

Round Robin tarzı çalışmada o Task ta geçirilebilecek MAX süre de belirlenebiliyor...

fatihinanc

Anladım, sağolun hocam. Ben ilk başta Round-Robin çalışmayı kastetmişim. Şimdi ismini de öğrenmiş oldum.
Galiba Round-Robin olmayan sistemlerde tüm bu geçiş ve iptal etme işlmelerini manual olarak yapmak zorunda kalıyoruz.

Peki bir soru daha soracak olursam;
Yukarıda verdiğiniz "RTX Benefits" sayfasında şu madde geçiyor;

Alıntı YapFlexible Scheduling: round-robin, pre-emptive, and collaborative

Diğer iki çalışma modu hakkında bir bilginiz var mı ?
Ve bunları üstünlüklerine göre sıralayabiliyor muyuz ?
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

Erol YILMAZ

Schedular:
Task ların hangi sıralama ile çalıştırılacağını geçişlerin nasıl yapılacağını belirleyen kısım...

Schedular ın çalışma tarzı aynı isimle olsa dahi farklılıklar gösterebilir,
Zira tonlarca schedular tipi var. Ama ağırlıklı olarak 3 e ayrılmış durumda.


Round Robin Scheduling:
Yuvarlak robin. Tasklara ufak bir timeslice calisma zamani vererek,
isleri bitmediyse dairesel sirada bir sonrakini islemeye basladigi algoritma. (Alıntı)

Cooperative Scheduling:
O anda çalışan Task izin verdiğinde tasktan ayrılıp ve en yüksek öncelikli görevin çalıştığı tip.

Preemptive Scheduling:
O anda çalışan Task'ın Os  INT ile kesilip daha yüksek öncelikli bir  görev varsa onun
çalışmaya başlanmasının ayarlandığı Tip...

Hangisi daha iyi dersen, buna tek bir cevap vermek mümkün değil,
Çünkü birçok parametresi olan bir konu,

Misal PIC16F819 da Round Robin ile çok güzel uygulamalar yapılabiliyor...
Ama 10 larca görevin bi arada olduğu orta halli projelerde Cooperative ve Preemptive gerekli olabiliyor.
Bunun yanında Preemptive scheduları da PIC16 da çalıştıramazken, PIC18 içinde çalıştırmak sıkıntılı oluyor...

Misal bana kalırsa Mercedes en iyisi ama bir başkasına göre ağır kalkış yapan bir araç...

Şirket hesabına alınmış benzini vergiden düşen bir Doblo da birilerine göre en iyi olabiliyor sonuçta :)

fatihinanc

Anladim. Aslinda hepsine en uyarlanabilir sistem Round-Robin schedular gibi(PIC16 agirlikli). Onun haricinde interrupt gerektiren schedular lar, stack okuma/yazma zorunlulugu da getiriyor tabi.

Aciklamalarinizdan sonra bu schedular lari kiyaslayamacagimizi da ogrenmis oldum.
Sistemimize hangisi uygunsa onu tercih etmeliyiz.

Konuyu fazla diger mcu lar etrafina sarmadan ARM uzerinde durmak istiyorum.

RTos lar, multitasking haricinde mesela bir cevrebirimi dusuk seviye kod yazmadan kullanmaya olanak taniyabilir mi ?
(mesela ARM larin CAN, USB, Ethernet birimleri gibi)
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

serdararikan

bu bahsettiğiniz RTOS'lar ücretsiz sanırım?

fatihinanc

Hayir Hocam, konunun basinda aciklama yapilmis.
RTX RTos kutuphaneleri, MDK icine entegre ediliyor.
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

Erol YILMAZ

RTOS lar için yazılmış kodların bu mantığa uygun olarak ele alınması gerekli,
Bu yüzden RTOS üreticileri artık çevrebirim sürücülerinin de bir kısmını kendileri
oluşturuyorlar...

fatihinanc

Anladim hocam.
Biraz hazirci gibi sorular sordum ama yine de ilginiz ve yardiminiz icin tesekkur ediyorum.

Eger bendeki LPCXpresso 1768 e bu RTos u port edebilirsem, birkac ornek eklerim bu sayfaya...
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

mcan

#12
Selamlar stm32 cm3 ile deneme yapmaya çalışıyorum,
Sytemİnit fonksiyonunu istiyor. Örneklerde olan startup.s dosyası sadece startup.s dosyası bendeki ise startup_stm32f10x_hd.s
Sanırım versiyon farkı var.
1- RTX için işlemciden bağımsız tek bir startup.s dosyasımı var?
2-Eğer systeminit fonksiyonunu ben kendim yazarsam rtx yinede ticktimer vs.. gibi gereksinim duyduğu şeyleri kurabilirmi?

Kendim cevaplıyım:
1-işlemcimize ait olan startup.s dosyasını kullanabiliriz. Örneğin startup_stm32f10x_hd.s
2-M3 için systick kullanarak timer'ı kendi ayarlıyor ancak rtx_conf_cm.c dosyasından gerekli ayarlamaları yapmamız gerekiyor.

mcan

#13
idle demon içerisinde kullanılan global değişkenlerin bir kopyasımı oluşturuluyor? yani idle demon içinde kullandığım global değişkenler sanki static ve yerel değişken gibi davranıyor.

Cevabımı-problemimi buldum ; idle demon içerisinde  variable+=1; gibi tek bir komut kullanıyordum aynı zamanda bu değişkeni başka tasklarda kullanıyordum... Çözüm şu şekilde oldu  tek komutluk kodu arttırdım ve çözüldü, sonra aklıma optimizasyon olayı geldi optimizasyonu sıfıra çekip tekrar tek komut ile denedim yine çalıştı, sonra tek komut ve optimizasyon sonda iken volatile kullanıp denedim sonuç yine olumlu oldu... Şu volatile olayını iyi yakalamak gerekiyor yoksa derleyici optimizasyon adına kodun bir kısmını uçuruyor bazen.

Şimdi tasklardaki tüm ek kodları kaldırıp ösadece os_dly kullanrak deniyorum yine sonuç istediğim gibi değil, idle demon içerisindeki global değişken başka bir taskda sıfırlanmasına rağmen sıfırlanmıyor. zombi gibi hortluyor.