RTOS Sohbetleri!!

Başlatan serdararikan, 22 Nisan 2011, 18:14:00

serdararikan

RTOS hakkında bilgi alış-verişi,bilgilendirme amaçlı aklımıza gelen soruları buraya yazıp öneri,bilgi...vb cevapları almak istiyorum.

RTOS hakkında bildiklerim;
* yapılacaklar (Task) olarak tanımlanıyor.ve herbir task'ın belirli bir sürede gerçekleşmesi gerekiyor.
* task belirlenen sürede gerçekleştirilemezse görev başarısız oluyor.
* taskların öncelik(priorty) durumları var.önceliği yüksek olan task diğer taskların işleyişini kesebiliyor.

Kafamı karıştıranlar;
* RTOS da kaç task bulunur?
* Sınırı varmıdır?
* Sınır donanıma bağlıdır mutlaka ama standart olarak belirlenmiş xxx kadar task genel işlemler için yeterlidir şeklinde bir kabul söz konusumudur?
* Öncelik durumu RTOS da nasıl değerlendirilir?
* RTOS' da kesme varmıdır?Varsa Kesmeler RTOS un işleyişini nasıl etkiler?
* RTOS da Delay işlemi nasıl yapılır?
* RTOS' lara LCD,keypad,sensorler...vb için driverler adapte edilirmi?Edilirse driver ile RTOS arasındaki kod uyumluluğu nasıl sağlanır?

yazdıklarım benim düşüncelerim.bildiklerimde yanılıyor veya yanlış biliyor olabilirim.Sorularımı bazıları saçma veya komik olabilir.Bilgi sahibi arkadaşlar cevaplarsa birçok kişiyede faydası olur.

Erol YILMAZ

#1
Konuya hakim olmak için bilgi sahibi olmanız şart.
Bunun yolu da sanırım okumaktan geçiyor...

Multitasking çeşitlerini anlamalı öncelikle,
https://www.picproje.org/index.php/topic,25562.0.html

ve herhangibir RTOS'un kullanım kılavuzu ayarında metnini okumak gerekiyor...
http://www.keil.com/product/brochures/rl-arm_gs.pdf

Birçok genel kapsamlı sorunuza cevap bulacaksınız.

Misal task ta gecikme için KEIL RTX de os_dly_wait (20); kullanıyoruz.
Diğerlerinde de buna benzer şeyler...

Bu da OSA Rtos için bir şablon....



void main (void)
{
    //------------------------------------------------------------------------------
    //  Init PIC periphery
    //------------------------------------------------------------------------------

    Init();

    //------------------------------------------------------------------------------
    //  OSA initialisation
    //------------------------------------------------------------------------------

    OS_Init();

    //------------------------------------------------------------------------------
    //  Create all task with identical priority
    //------------------------------------------------------------------------------

    OS_Task_Create(0, Task_Sound);
    OS_Task_Create(0, Task_Button);
    OS_Task_Create(0, Task_Keyboard);

    //------------------------------------------------------------------------------
    //  Enable interrupts and run system
    //------------------------------------------------------------------------------

    OS_EI();
    OS_Run();
}

Çok yanlış anlaşıldığını düşündüğüm bi konu var.
"Verilen görevi istenilen sürede bitirmek zorunda" gibi birşeyler kalmış insanların aklında...
Olmazsa başarısız sayılır da diyenler var.

Oysa Askerlikte şöyle bir tabir vardır,

"Komutan, birliğinin yaptığı ve yapmadığı herşeyden sorumludur"

RTOS lar mı komutanımız yoksa biz mi? :)

serdararikan

Alıntı yapılan: Allegro - 22 Nisan 2011, 19:42:33
Konuya hakim olmak için bilgi sahibi olmanız şart.
Bunun yolu da sanırım okumaktan geçiyor...

tabiki öğrenmek için okumak şart.Ama burası da bir forum.
Forum=Bilgi ve tecrübe paylaşımı

bilgi sadece okunarak öğrenilmez.öğrenmenin çok farklı yöntemleri vardır.Bu yöntemler kişinin zeka düzeyine.öğrenilecek konunun özelliğine,öğretim ortamına,öğretim araç-gereçlerine,öğrenim ihtiyaçlarına,hazır bulunuşluk düzeylerine göre....vb farklılıklar gösterebilir.

Siz okuyarak kendi kendinize (self learning) bir konuyu öğrenebilirsiniz.bu yöntem sizin için uygun bir yöntem olabilir.bende öğrenebilirim,ali de ahmet te...x,y z kişileride.

Ben forumların kitlesel öğrenim ortamları olduğuna inanırım.zaten paylaşımın da amacı budur.Eğer bir kitle herhangi bir konuda öğrenim ortamı oluşturacaksa kitledeki bireylerin mümkün olduğu kadar faaliyete katılımı öğrenim sürecini hızlandırır.

Forumda birçok arkadaşın RTOS konusu merak ettiğini ve öğrenmek istediğini düşünüyorum.bu amaçla bu başlığı açtım.zamanla katılımın artacağında da şüphem yok.Gerekli olan sadece ilk hareketi sağlamak.

http://webhome.csc.uvic.ca/~mcheng/466/handouts/RTOS/report/doxygen/html/index.html

bu sitede Atmel için yapılmış basit bir RTOS örneği var.buradaki gibi açık kod rtos'ları incelemeye başladım.incelemelerim ilerledikçe bu sonuçları paylaşacağım.

Erol YILMAZ

#3
* yapılacaklar (Task) olarak tanımlanıyor.
DOĞRU

ve herbir task'ın belirli bir sürede gerçekleşmesi gerekiyor.
YANLIŞ

* task belirlenen sürede gerçekleştirilemezse görev başarısız oluyor.
YANLIŞ

* taskların öncelik(priorty) durumları var.önceliği yüksek olan task diğer taskların işleyişini kesebiliyor.
DOĞRU

Erol YILMAZ

#4
misal görevde birçok float işlem var ve bunlar 8 ms sürüyor.
biz de 6 ms de bitirmesini istiyoruz.
ne yapacaz ?

bu task başarısız mı diyecez ? :D

Bak atalarımız ne demiş?
BaŞarısız TASK yoktur, Başarısız yazılımcı vardır.
TASK; programcısına göre kişner...


Bu arada yapmamız gereken float işlemleri sadeleştirmek yada azaltmak olacaktır.
Mümkünse INTEGER tercih etmeli...
Bunu zaten biliyorduk ama UC-OS yazarıda aynı şeyi diyor.

Ne kalitede olursa olsun bir RTOS bizim genel yazılım problemlerimizi çözemez.
Tecrübe ve düşünmeye dayalı pratik yöntemleri sonuna kadar kullanmalıyız...

Biraz kitap indirdim fırsat buldukça incelerim :)



serdararikan

sizi tanıdığım kadarıyla bu rtos konusunda uzmansınız.O vakit bilgilerinizden faydalanalım

okuduğum dökümana göre(salvo user manual) 

semaphore--> bir task ın işleyişini kontrol eden yani çalışmasını durmasını sağlayan veya rtos tan task a bilgi göndermeye yarayan bayraklar(flag) veya bilgi kodlarıdır??   diyebilirmiyiz?

1 bit, 8 bit,16 bit 32 bit  gibi semaphore lar var diyor manualde.

Erol YILMAZ

Uzman değilim öncelikle, öğrenmeye çalışıyorum bende...

Semafor:
2 tane görev-task-thread var, Adları A ve B olsun..
A görevini yapabilmek için B'nin görevini bir yere kadar bitirmesine ihtiyacı var diyelim...
A bu yüzden B den gelecek Semafor u bekliyor olsun...

B, o noktada Semafor u SET ederse A bu noktada görevine devam edebilir sinyali olarak değerlendirir bunu.

Bu durumu (belki de daha başka birçok durumu) halledebilmek için semafor kullanıyoruz.

Çok görevli çalışmanın kendine göre durumları var bunun gibi...

serdararikan

yani basitçe özetleyecek olursak semafor tasklar arasında iletişim sağlıyor.

multitasking olayına gelince;
https://www.picproje.org/index.php/topic,25562.0.html

burada yazdığınıza göre ve salvo da anlatılana göre 2 temel multitasking sistemi var

* cooperative ve preemptive olmak üzere.

birisinde kesme ile hemen yüksek öncelikli taska geçiliyor ve yüksek öncelikli task bitince yarıda bırakılan task tamamlanıyor--> preemptive
diğerinde ise kesme gelince normal task bitene kadar beklenip normal task tamamlandıktan sonra yüksek öncelikli taska geçiliyor.--> cooperative


bunların dışında kullanılan ne gibi multitasking çeşitleri var veya varmı?

Erol YILMAZ

Preemptive, Cooperative de öncelik-priority sıralaması takip ediliyor.

Diğer dediğin zaman:
Ayrıca SuperLoop gibi ultra-basit bir teknikle, her bir görevi, "State Machine"
içinde çalıştırarak Multitasking'e giriş yapılabilir.

Öncelik olmadan, bütün görevler sırası ile çalıştırılır.

Ve bu sırada toplam tarama periyodu 10ms'den fazla olmaz ise bence
en basit işlemcide bile çalıştırılabilecek bir Multitasking sistemi elde edilir.
Tabi bazı servislerle de desteklemek lazım durumu...

serdararikan

aşağıdaki örnekte anladığım kadarıyla 5 adet task var

1- butona her basılışında counter değeri 1 er 1 er artırılıyor

2- zaman bilgisi

3- 10Hz lik bir sinyal üretiliyor

4- 200KHz lik bir sinyal üretiliyor

5- belirli periyotlar ile LCD de değerler görüntüleniyor

burada sanırım time,10Hz ve 200KHz lik frekans üretme işlemi öncelikli işlemler.özellikle en kritik işlem 200KHz lik sinyal. sonra time ve sonrada 10 Hz lik sinyal en son buton


Erol YILMAZ

#10
200 khz değil 200 Hz olacak,

RTOS dediğimiz şey sihirli değnek değil yaw,
o da gariban koşturan bi kod işte :)))

Zamandan haberdar olmak için genellikle gördüğüm 10 ms lik TICK kullanıyor millet.
Cortex M3 lerde Systick Counter var misal bu iş için optimize edilmiş....

serdararikan


rree

iki sene önce yazmıştım.18f452 Timer0 kesmesini kullanarak dört tane program parelel çalıştırabilirmiyim diye(Elbettete sıralı çalışır). Yazdığım bu program hangi katagöriye girmiş bulunur. Fazla bir işe yaradığını söyleyemem çünkü hız 40 kat düşüyor.
    Device=18f452
    DECLARE LCD_DTPIN PORTB.4
    DECLARE LCD_ENPIN PORTB.3
    DECLARE LCD_RSPIN PORTB.2

    @CONFIG_REQ
    '@__CONFIG CONFIG1H, OSCS_OFF_1 & HS_OSC_1
    @__CONFIG CONFIG1H, OSCS_OFF_1 & HSPLL_OSC_1
    @__CONFIG CONFIG2L, BOR_OFF_2 & BORV_20_2 & PWRT_OFF_2
    @__CONFIG CONFIG2H, WDT_OFF_2 & WDTPS_128_2
    @__CONFIG CONFIG3H, CCP2MX_OFF_3
    @__CONFIG CONFIG4L, STVR_OFF_4 & LVP_OFF_4 & DEBUG_OFF_4
    
    '#fuses HS,WDT128,NOPROTECT,NOLVP

    XTAL  = 10 
    Symbol TMR0ON T0CON.7'Tmro 1 aÇIP kAPATMA
    SYMBOL T0IE INTCON.5
    SYMBOL T0IF INTCON.2         
    SYMBOL TMR1ON T1CON.0
    SYMBOL TMR1IF PIR1.0
    SYMBOL TMR1IE PIE1.0
    SYMBOL GIEL INTCON.6
    SYMBOL GIE INTCON.7
     
    
    

    
'Multi Taskingde Kullanılan Değişkenleri belirt 
    Dim MTsayac As Word
    
    Dim MTDIN As Dword
    Dim MTD0 as MTDIN.Byte0
    Dim MTD1 as MTDIN.Byte1
    Dim MTD2 as MTDIN.Byte2
    Dim MTD3 as MTDIN.Byte3

    Dim MT0AD as Dword
    Dim MT1AD as Dword
    Dim MT2AD as Dword
    Dim MT3AD as Dword
    Dim MT4AD as Dword
    
    IntCon=%00100000'Tmro en,Int0 En
     T0CON=%11000000  'xxx.7 RD16
     'T1CON=%00000110
      'PIR1=%00000000
      'PIE1=%00000001
      'IPR1=%00000000  'xxx.0?
    
    
Basla:
    
    TrisA=%00000000
    TrisB=%00000000
    TrisC=%00000001
    
    
    'TMR1L=0
    'TMR1H=0
    Tmr0L=0
    TMR0H=0
' Multitasking Alt Etiket adreslerini al    
    MT0AD=MTASK0 
    MT1AD=MTASK1 
    MT2AD=MTASK2 
    MT3AD=MTASK3 
    MT4AD=MTASK4
    
    Goto Ana    
    ON_INTERRUPT goto Kesme
'------------------><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Kesme:
T0IF=0
TMR0L =211 'iki komut işleyecek süredir
'StAyar=$01
' Döndüğün yere kaydet Dikkat Select Case Deyimi Yerine Asemblerde Program Yaz
' Boyutlarına karşılaştır.
Select Case MTsayac
 Case 0
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT0AD=MTDIN
 
 Case 1
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT1AD=MTDIN
 
 Case 2
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT2AD=MTDIN
 
 Case 3
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT3AD=MTDIN
 
 Case 4
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT4AD=MTDIN
End Select
 
 MTsayac=MTsayac+1
 if MTsayac >=5 Then MTsayac=0
YUKGIT: 
 ' Multitasking adreslerini yükle ve git
Select Case MTsayac
Case 0
  MTDIN=MT0AD
  TOSL=MTD0
  TOSH=MTD1
  TOSU=MTD2
Case 1
  MTDIN=MT1AD
  TOSL=MTD0
  TOSH=MTD1
  TOSU=MTD2 
Case 2
  MTDIN=MT2AD
  TOSL=MTD0
  TOSH=MTD1
  TOSU=MTD2
Case 3
   MTDIN=MT3AD
   TOSL=MTD0
   TOSH=MTD1
   TOSU=MTD2
Case 4
   MTDIN=MT4AD
   TOSL=MTD0
   TOSH=MTD1
   TOSU=MTD2
End Select


Retfie Fast
'-----------------------------------------------------------
Ana:
TMR0H=0
TMR0L=0
T0IF=0
TMR0ON=1
TMR1ON=1
GIE=1
'GIEL=1
'-><<<<------<<<-------<<<-------<<<-------<<<--------------
Ana1:

Goto Mtask0
    
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask0:
     gie=0
     Cls
     Print At 1,1, "Task1"
     Delayms 100 
     gie=1 


Goto Mtask0
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask1:
Toggle PortC.1
gie=0
Print At 1,1, "Task2"
Delayms 100
gie=1



Goto Mtask1
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask2:

Toggle PortC.2
gie=0
Cls
Print At 1,1, "Task3"
Delayms 100
gie=1

Goto Mtask2
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask3:
  Nop
  NOP
  NOP
  NOP
  NOP

'Toggle PortC.3





Goto Mtask3
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask4:


Toggle PortC.4




Goto Mtask4
'->>-------->>>------->>>------->>>-------->>>----->>------

serdararikan

Alıntı yapılan: rree - 26 Nisan 2011, 19:47:27
iki sene önce yazmıştım.18f452 Timer0 kesmesini kullanarak dört tane program parelel çalıştırabilirmiyim diye(Elbettete sıralı çalışır). Yazdığım bu program hangi katagöriye girmiş bulunur. Fazla bir işe yaradığını söyleyemem çünkü hız 40 kat düşüyor.
    Device=18f452
    DECLARE LCD_DTPIN PORTB.4
    DECLARE LCD_ENPIN PORTB.3
    DECLARE LCD_RSPIN PORTB.2

    @CONFIG_REQ
    '@__CONFIG CONFIG1H, OSCS_OFF_1 & HS_OSC_1
    @__CONFIG CONFIG1H, OSCS_OFF_1 & HSPLL_OSC_1
    @__CONFIG CONFIG2L, BOR_OFF_2 & BORV_20_2 & PWRT_OFF_2
    @__CONFIG CONFIG2H, WDT_OFF_2 & WDTPS_128_2
    @__CONFIG CONFIG3H, CCP2MX_OFF_3
    @__CONFIG CONFIG4L, STVR_OFF_4 & LVP_OFF_4 & DEBUG_OFF_4
    
    '#fuses HS,WDT128,NOPROTECT,NOLVP

    XTAL  = 10 
    Symbol TMR0ON T0CON.7'Tmro 1 aÇIP kAPATMA
    SYMBOL T0IE INTCON.5
    SYMBOL T0IF INTCON.2         
    SYMBOL TMR1ON T1CON.0
    SYMBOL TMR1IF PIR1.0
    SYMBOL TMR1IE PIE1.0
    SYMBOL GIEL INTCON.6
    SYMBOL GIE INTCON.7
     
    
    

    
'Multi Taskingde Kullanılan Değişkenleri belirt 
    Dim MTsayac As Word
    
    Dim MTDIN As Dword
    Dim MTD0 as MTDIN.Byte0
    Dim MTD1 as MTDIN.Byte1
    Dim MTD2 as MTDIN.Byte2
    Dim MTD3 as MTDIN.Byte3

    Dim MT0AD as Dword
    Dim MT1AD as Dword
    Dim MT2AD as Dword
    Dim MT3AD as Dword
    Dim MT4AD as Dword
    
    IntCon=%00100000'Tmro en,Int0 En
     T0CON=%11000000  'xxx.7 RD16
     'T1CON=%00000110
      'PIR1=%00000000
      'PIE1=%00000001
      'IPR1=%00000000  'xxx.0?
    
    
Basla:
    
    TrisA=%00000000
    TrisB=%00000000
    TrisC=%00000001
    
    
    'TMR1L=0
    'TMR1H=0
    Tmr0L=0
    TMR0H=0
' Multitasking Alt Etiket adreslerini al    
    MT0AD=MTASK0 
    MT1AD=MTASK1 
    MT2AD=MTASK2 
    MT3AD=MTASK3 
    MT4AD=MTASK4
    
    Goto Ana    
    ON_INTERRUPT goto Kesme
'------------------><<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Kesme:
T0IF=0
TMR0L =211 'iki komut işleyecek süredir
'StAyar=$01
' Döndüğün yere kaydet Dikkat Select Case Deyimi Yerine Asemblerde Program Yaz
' Boyutlarına karşılaştır.
Select Case MTsayac
 Case 0
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT0AD=MTDIN
 
 Case 1
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT1AD=MTDIN
 
 Case 2
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT2AD=MTDIN
 
 Case 3
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT3AD=MTDIN
 
 Case 4
  MTD0=TOSL
  MTD1=TOSH
  MTD2=TOSU 'MT0AD  Donduğü adresi MT0AD Kaydet
  MT4AD=MTDIN
End Select
 
 MTsayac=MTsayac+1
 if MTsayac >=5 Then MTsayac=0
YUKGIT: 
 ' Multitasking adreslerini yükle ve git
Select Case MTsayac
Case 0
  MTDIN=MT0AD
  TOSL=MTD0
  TOSH=MTD1
  TOSU=MTD2
Case 1
  MTDIN=MT1AD
  TOSL=MTD0
  TOSH=MTD1
  TOSU=MTD2 
Case 2
  MTDIN=MT2AD
  TOSL=MTD0
  TOSH=MTD1
  TOSU=MTD2
Case 3
   MTDIN=MT3AD
   TOSL=MTD0
   TOSH=MTD1
   TOSU=MTD2
Case 4
   MTDIN=MT4AD
   TOSL=MTD0
   TOSH=MTD1
   TOSU=MTD2
End Select


Retfie Fast
'-----------------------------------------------------------
Ana:
TMR0H=0
TMR0L=0
T0IF=0
TMR0ON=1
TMR1ON=1
GIE=1
'GIEL=1
'-><<<<------<<<-------<<<-------<<<-------<<<--------------
Ana1:

Goto Mtask0
    
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask0:
     gie=0
     Cls
     Print At 1,1, "Task1"
     Delayms 100 
     gie=1 


Goto Mtask0
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask1:
Toggle PortC.1
gie=0
Print At 1,1, "Task2"
Delayms 100
gie=1



Goto Mtask1
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask2:

Toggle PortC.2
gie=0
Cls
Print At 1,1, "Task3"
Delayms 100
gie=1

Goto Mtask2
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask3:
  Nop
  NOP
  NOP
  NOP
  NOP

'Toggle PortC.3





Goto Mtask3
'->>-------->>>------->>>------->>>-------->>>----->>------
Mtask4:


Toggle PortC.4




Goto Mtask4
'->>-------->>>------->>>------->>>-------->>>----->>------


sanırım yazdığınız kod "State Machine" kategorisine giriyor.İşe yaramak kısmına gelince anladığım kadar ile; hız 4 te birine düşüyor diye bir olay yok.RTOS mantığında bir işin ne kadar sürede bitirilmesi gerektiği bellidir.iş o süre yapılır ve bitirilir.eğer belirli aralıklarla yapılacaksan görev zamanı geldiğinde tekrar başlatılır tekrar bitirilir.süreç böyle devam eder.

Erol YILMAZ

Alıntı yapılan: serdararikan - 26 Nisan 2011, 22:56:02...RTOS mantığında bir işin ne kadar sürede bitirilmesi gerektiği bellidir...

Söylediğiniz bu süre işi için bir kaynak gösterebilir misiniz ?