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.
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? :)
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.
* 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
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 :)
(http://img541.imageshack.us/img541/3572/ebook.png)
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.
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...
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ı?
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...
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
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ş....
evt 200Hz pardon.
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
'->>-------->>>------->>>------->>>-------->>>----->>------
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.
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 ?
gösteremem çünki bu bil bilgi değil.Bu yüzden cümleye "anladığım kadarı ile" diyerek başladım.
şu kadar sürede bitirecen diye bişi olamaz da ondan diyorum :)
bak ne güzel yanlış bildiğimiz noktaları aydınlatıyorsunuz.teşekkür ederiz
Şu süre mevzusuna takıldım biraz. Diyelim ki bir sistemimiz var. Bu sistemde rtos kullanıyoruz. Dışarıdan tetikleme geldiğinde o tetiklemeye bağlı işin mutlaka 10ms içinde bitirilmesi gerekiyor diyelim. Yani o iş için belirlenmiş azami bitirme süresi 10ms olsun. 10ms'nin altındaki herhangi bir süre bizim için kabul edilebilir olsun. Bu durumu, bu şartı ne olursa olsun sağlayabilen sistemi rtos olarak adlandırabiliriz değil mi? Yani bir iş için belirlediğimiz azami süre içerisinde herhangi bir anda işini bitirebiliyor. Bu durumda dolaylı da olsa bir iş için süre belirtmiş olmuyor muyuz?
Ben daha RTOS un tam anlamıyla ne olduğu ve neler yapabildiğini anlamış değilim arkadaşşşş..lar.!
Alıntı yapılan: EMG81 - 27 Nisan 2011, 00:02:23
Ben daha RTOS un tam anlamıyla ne olduğu ve neler yapabildiğini anlamış değilim arkadaşşşş..lar.!
bende onu anlamaya çalışıyorum.ama en önemli fonksiyonu multitasking heralde.
Olaya kurumsallık ve usta çırak mantığı ile çalışmak olarak bakmak lazım sanıyorum. RTOS kurumsal, yapısal programlama ise belirli bir iş için çalışan kodlar. Kurumsallık dediğim anda güzel ülkemin kurumları geliyor ya neyse:) Öyle ise bulaşmamak lazım bu işe...
Kritik bir haberleşme fonksiyonu yazdığımızı düşünelim. Donanımsal olmasın. Bu durumda TimeOut belirlenmedi ise bu fonksiyonda çakılırız ta ki sonuç alıncaya kadar.
Bu durumu RTOS üzerinde yapmak istersek nasıl olacak? INT ile fonksiyonu kestik ve çıktık diyelim; sonrasında neler yaşanabilir? Biz çıktıktan 30 us sonra data gelirse kaçar mı? İş tamamen donanımsal destekle mi yürür? İç içe kesme desteği ne kadar etkin çalışır?
Hemen aklıma gelenler...
bu tarz bir problemin kesmeye belirlenecek önceliklerle giderilebileceğini düşünüyorum.haberleşme kesme daha öncelikli belirlenirse olabilir.
RTOS ların normal OS lardan farkı deterministik olmasıdır. Yani sistemin işleyişinde sürpriz olmaz.
Benim halen aklımda RTOS nedir sorusu var. Çok derinden giriyorsunuz konuya.(kimse kusura bakmasın.herkes öyle) Biraz yüzeysel takılsak daha iyi gibi.
Ne bu RTOS. WinCE gibi birşeymi? Yoksa compiler gibi birşeymi? Yoksa adamlar bir yığın kod yazmış bize 1 satırda bunların tamamını kullanma şansımı vermiş? Yoksa yoksa yoksa . Durdurun artık şu yoksalarımı. :-\
aynen bende katılıyorum
nedir bu rtos ?
bir yöntemmidir ?
multitasking mi yaratıyor ?
donanımda olmayan bir şeyi yazılım sayesindemi yapıyor ?
başka derleyicilerle bunu yapmak neden imkansız ?
herkes bu konuyu merak ediyor ama ortlıkta bir kod yok.acaba hazır bir rtos ile uygulama yapmayı denemekmi lazım yoksa ufaktan başlayıp,örneğin multitasking yapabilecek bir kod yazarak olaya giriş yapmak mı lazım?
Nedir bu RTOS ?
RTOS kod topluluğu, fakat belirli bir disipline göre şekillenmiş, yoksa bildiğiniz yazdığınız kodlardan ne farkı olabilir !
Normal de biz RB0 = 1 yap dediğimiz de hemen rb0 1 oluyor haliyle, fakat rtos da ise bu rtos a rb0 ı 1 yap demekle oluyor yani rtos donanımı kontrol altında tutuyor kendi başımızla donanımla oynayamıyoruz. RTOS dediğimiz şey yine kod parçacıkları unutmayalım.Mesala rtos da OSportb( 1, 1) diye fonksiyon vardır portları kontrol eden ancak bunla portlara müdahale edebiliriz, peki niye rb0 = 1 demiyoruz çünki rtos aynı anda 5 programı kontrölünde tutması gerek heryerde portu kafamıza göre değiştirirsek direkt anlamda(rb0 =1 gibi) bu 5 programı kontrol etmek zorlaşır. Şimdilik bu kadar konu açıldıkça soru geldikçe en basit anlamda anlatmaya çalışacağım.
Alıntı yapılan: emrahmrcn - 27 Nisan 2011, 12:01:59
Şimdilik bu kadar konu açıldıkça soru geldikçe en basit anlamda anlatmaya çalışacağım.
emrah hocam açıklamalar için teşekkür ederiz.benim merak ettiğim konu hazır yazılmış bir RTOS elbette kodlarının test edilmiş defalarca denenmiş eksiklikleri giderilmiş olduğundan kullanışlıdır.fakat hazır bir RTOS u anlamak için oturup onun tüm manualini okumak,çok sayıda örnek yapmak gerekir.RTOS konusuna yeni başlayanlar için olaya bi yerden başlamak lazım.bu ilk başlangıç konusunda yardımcı olabilirmisiniz?
Alıntı yapılan: gerbay - 27 Nisan 2011, 13:48:42
Alıntı yapılan: emrahmrcn - 27 Nisan 2011, 12:01:59
Nedir bu RTOS ?
RTOS kod topluluğu, fakat belirli bir disipline göre şekillenmiş, yoksa bildiğiniz yazdığınız kodlardan ne farkı olabilir !
Normal de biz RB0 = 1 yap dediğimiz de hemen rb0 1 oluyor haliyle, fakat rtos da ise bu rtos a rb0 ı 1 yap demekle oluyor yani rtos donanımı kontrol altında tutuyor kendi başımızla donanımla oynayamıyoruz. RTOS dediğimiz şey yine kod parçacıkları unutmayalım.Mesala rtos da OSportb( 1, 1) diye fonksiyon vardır portları kontrol eden ancak bunla portlara müdahale edebiliriz, peki niye rb0 = 1 demiyoruz çünki rtos aynı anda 5 programı kontrölünde tutması gerek heryerde portu kafamıza göre değiştirirsek direkt anlamda(rb0 =1 gibi) bu 5 programı kontrol etmek zorlaşır. Şimdilik bu kadar konu açıldıkça soru geldikçe en basit anlamda anlatmaya çalışacağım.
hocam donanımı RTOS kontrol altında tutuyor ya da turumuyor olayı başka bir olay. Diyelim ki siz kernel mode da çalışıyorsunuz, o zaman donanıma istediğiniz gibi erişebilirsiniz. İster direk erişin ister RTOS üzerinden erişin. Eğer user mode da çalışıyorsanız bunu yapamazsınız, kernel mode da çalışan bir driver üzerinden yapmanız gerekir. Bu normal PC lerde çalıştırdığımız işletim sistemlerinde de böyle RTOS larda da.. Bu olay tamamen farklı bir olay..
Tabiki bu da OS in bir parçası, ben parça parça OS içeriğinden örnek veriyorum yoksa RTOS bu anlattığım olay değil sadece , insanların kafasında somut şeyler oluşması lazım buda en bilindik örneklerle olabilir. Şimdi siz yeni bir noktaya temas ettiniz KERNEL mod ve USER mod yada Çekirdek modu ve kullanıcı modu, bunlarda bellek yönetimi (MMU) bilindikten sonra oturacak konular.
Öncelikli olarak soru sormak lazım ki akılda bir şeyler oluşsun? Niye bizim RTOS lara ihtiyacımız var? Zaten biz kodları bildiğimiz gibi yazıyoruz sorun olmuyor ! Peki aynı anda çalışıyormuş gibi görünen programlar yazdınızmı ? Bir kod kümeniz olsa , her yeni işlemcide portları değiştirmek için bir çok ayar yerine hep aynı fonksiyonları(API) kullansanız işleriniz daha da hızlanmazmı, ve tabikide uzun zaman değişik ortamlarda test edilmiş kod kümesi sizin yeniden yazacağınız kodların güvenirliliğinden ne kadar yüksek olur ?
Alıntı yapılan: serdararikan - 27 Nisan 2011, 11:21:43
herkes bu konuyu merak ediyor ama ortlıkta bir kod yok.acaba hazır bir rtos ile uygulama yapmayı denemekmi lazım yoksa ufaktan başlayıp,örneğin multitasking yapabilecek bir kod yazarak olaya giriş yapmak mı lazım?
Öncelikle bu konuya hassasiyet gösteren arkadaşların
SADECE TÜRKÇE kaynakları taraması,
example klasörünü, User Manuali okumaması neticesi, kesin olarak
BAŞARISIZLIKTIR.
Kod yok diyen arkadaşım,
Bak kod yazmışım senin için,
https://www.picproje.org/index.php/topic,25562.0.html
Gelelim şimdi Salvo RTOS user manualine:
https://rapidshare.com/files/459459470/e-book_Salvo_User_Manual.pdf
Adam konu başlığı açmış:
Chapter 2 • RTOS Fundamentals
Basic Terms
Sayfa 43...
Pic18f452 Multi tasking programında yaşanan problemler şunlardı.Dört tane program parelel çalışsın tasarlamıştım.Bunları Mtask0,Mtask1,Mtask2,Mtask3 label etiketi altında timer0 atanan zaman kadar kotları işliyor.Zaman bitince diğerine atlıyor.
-Zamana baglı bir program var kulanıldı ise o program düzgün çalışmıyor. Çalışması için kesmeyi kapatmam
tasking işlemini durdurmam gerekiyor.
- Kesme çok sık tekralandığı için Status ,W Durum kayıtcılarını yedeklemek tekrar geri vermek için çok
zaman kaybediliyor.
- Öyle durum oluyorki komutun işlendiğini belirten buna bağlı kesme lazım oluyor.Pic de öyle bir şey yok.
- Delay komutu tasking programında hesaplanan değerlerde çalışmıyor
- Serial soft vare programlarıda
Bu problemler rtos ile donanımsal ve yazılımsal çözülmüş sanırım yavaş yavaş anlamaya çalışacağım.
Arkadaşlar Rtos için 1 günümü harcadım. Mikro C ile sabahladım ve sonuç: Artık bende Rtos un içerisindeyim. ! :)
Şu an 3 adet Task oluşturdum. Bu taskların içine de herkesin yaptığı gibi belirli zamanlarla pinlerin bitlerini değiştirip sonsuz döngü koydum. Mükemmel bi şekilde çalışıyor. Biraz dinlendikten sonra Akşama Rtos ile Edüstriyel bir iş yapıcam.
Ayrıca RTos hakkında merak eden, sorun yaşayan herkese yardımcı olabilirim.
Alıntı yapılan: EMG81 - 23 Temmuz 2011, 08:24:57
Ayrıca RTos hakkında merak eden, sorun yaşayan herkese yardımcı olabilirim.
Ben merak ediyorum hiç bir denemem olmadı. Örnek proje yayınlarsanız sevinirim.
fxdev in sayesinde bende osartos ile bişeyler karaladım avr için 4 task grafik ekran adc giriş çıkışlar felan gayet kolaylaştırıyo işleri.. programa takla attırmak zorunda kalmıyorum..
OSA .
@T2
Rtos için C kullanmak lazım. Senin için Hemen bir örnek kod yayınlıyorum.
/* RTOS deneme
23.07.2011
*/
#include <osa.h>
//******************************************************************************
//
// Constants
//
//******************************************************************************
//------------------------------------------------------------------------------
#if defined(P18F252) || defined(P18F258) || defined(P18F242) || defined(P18F248)
//------------------------------------------------------------------------------
#define PORTA_CONST 0x00
#define TRISA_CONST 0x01
#define PORTB_CONST 0x00
#define TRISB_CONST 0x01
#define PORTC_CONST 0x00
#define TRISC_CONST 0x00
#define NUMBER_OF_LEDS 8
#define TABLE_MASK 7
//------------------------------------------------------------------------------
#elif defined(P18F452) || defined(P18F458) || defined(P18F442) || defined(P18F448)
//------------------------------------------------------------------------------
#define PORTA_CONST 0x00
#define TRISA_CONST 0x01
#define PORTB_CONST 0x00
#define TRISB_CONST 0x01
#define PORTC_CONST 0x00
#define TRISC_CONST 0x00
#define PORTD_CONST 0x00
#define TRISD_CONST 0x00
#define PORTE_CONST 0x00
#define TRISE_CONST 0x00
#define NUMBER_OF_LEDS 8
#define TABLE_MASK 7
//------------------------------------------------------------------------------
#endif
//------------------------------------------------------------------------------
// Timers
//------------------------------------------------------------------------------
// Timer0 used as a counter for software PWM
#define T0CON_CONST 0x41 // prs = 4 (period = 256 * 4 * 0.2us = 200 us)
// 8-bit mode
// TImer2 used for system ticks
#define T2CON_CONST 0x25 // post = 8, period = 250*4*5* 0.2 us = 1 ms
#define PR2_CONST (250-1)
#define ms / 1 //
//******************************************************************************
//
// LED's brightness table
//
//******************************************************************************
//------------------------------------------------------------------------------
#if NUMBER_OF_LEDS == 4
//------------------------------------------------------------------------------
const char Brightness[] = {31, 11, 4, 0};
//------------------------------------------------------------------------------
#elif NUMBER_OF_LEDS == 8
//------------------------------------------------------------------------------
const char Brightness[] = {31, 20, 11, 7, 4, 2, 1, 0};
//------------------------------------------------------------------------------
#else
//------------------------------------------------------------------------------
#error "Incorrect NUMBER_OF_LEDS constant value (should be 4 or 8)"
//------------------------------------------------------------------------------
#endif
//------------------------------------------------------------------------------
//******************************************************************************
//
// Global variables
//
//******************************************************************************
char m_cSpeed; // Rotation speed
char m_cPosition; // Current rotation phase (position of brightness value in
// Brightness table)
char m_cDirection; // Rotation direction (-1, +1)
//******************************************************************************
//
// Function prototypes
//
//******************************************************************************
void Init (void);
void Task_Control1 (void);
void Task_Control2 (void);
void Task_Control3 (void);
/********************************************************************************
* *
* Function: main *
* *
*------------------------------------------------------------------------------*
* *
********************************************************************************/
// Tell to linker that these functions will be called indirrectly
void main (void)
{
Init(); // Init periphery
OS_Init(); // Init OS
OS_Task_Create(0, Task_Control1); // Create tasks.
OS_Task_Create(0, Task_Control2);
OS_Task_Create(0, Task_Control3;
// Starting values:
m_cPosition = 0; // rotation phase
m_cDirection = 1; // dircetion
OS_EI(); // Enable interrupts
OS_Run(); // Running scheduler
}
/********************************************************************************
* *
* Function: Init *
* *
*------------------------------------------------------------------------------*
*
* description: Makes periphery initialization:
* - I/O ports
* - ADC
* - timers
* - interrupts
*
* parameters: void
*
* on return: void
*
********************************************************************************/
void Init (void)
{
//------------------------------------------------------------------------------
// I/O ports configuration
//------------------------------------------------------------------------------
Porta=0;
Portb=0;
Portc=0;
TrisA=0;
TrisB=0;
Trisc=0;
//------------------------------------------------------------------------------
// ADC
//------------------------------------------------------------------------------
ADCON0 = 0xC1; // Channel 0
// ADON = 1
// Fosc/32
ADCON1 = 0x0E; // Use only one analog input AN0 (RA0)
// Left justify
//------------------------------------------------------------------------------
// Timers init
//------------------------------------------------------------------------------
T0CON = 0x80 | T0CON_CONST;
T2CON = T2CON_CONST;
PR2 = 250-1;
//------------------------------------------------------------------------------
// Interrupts
//------------------------------------------------------------------------------
INTCON = 0;
T0IE_bit = 1;
PEIE_bit = 1;
TMR2IE_bit = 1;
}
/********************************************************************************
*
* Interrupts service routine
*
********************************************************************************/
void interrupt (void)
{
if (T0IF_bit && T0IE_bit)
{
T0IF_bit = 0;
}
if (TMR2IF_bit)
{
TMR2IF_bit = 0;
OS_Timer();
}
}
/********************************************************************************
* *
* TASK: Task_Rolling *
* *
*------------------------------------------------------------------------------*
*
* description: Perfors rotation of brightesses for each LED
*
********************************************************************************/
#pragma funcall main Task_Control1
void Task_Control1 (void)
{
for(;;){
Portb.B7 = 1;
OS_Delay(500 ms);
Portb.B7 = 0;
OS_Delay(500 ms);
}
}
#pragma funcall main Task_Control2
void Task_Control2 (void)
{
for(;;){
Portb.B6 = 1;
OS_Delay(250 ms);
Portb.B6 = 0;
OS_Delay(250 ms);
}
}
#pragma funcall main Task_Control3
void Task_Control3 (void)
{
for(;;){
Portb.B5 = 1;
OS_Delay(100 ms);
Portb.B5 = 0;
OS_Delay(100 ms);
}
}
Bu komut ile oluşturulan taskların öncelik sırası mı belirleniyo.Mesela bu uygulamada port.5 portb.6 portb.7 deki ledler aynı anda yanıp sönüyo mu?
Öncelik sırasını belirleyebileceğin gibi, ledleri aynı anda yakıp söndürebilirsin ama 1. derece önceliğe sahip iş bitmeden kesilip 2. 3. 4. 5. 6. işler yapılamaz. 6. derece iş bitmeden kesilip 5. 4. 3. 2. 1. işler yapılabilir.
Bir işin bitmesi tam olarak ne oluyo bütün tasklarda sonsuz döngüler var.mesela 3. task oluştursak ve herbirindeki işlemleri sonsuz döngüler içine koysak ve öncelik sıralarını belirlesek rtos nasıl bir ol izler. sonuçta hepsi sonsuz döngü içinde.Taklardan birindeki işini bitirmesi nasıl oluyo yani.
Taskların birbiri arasındaki geçiş işlemi o task için ayrılan sürenin dolmasıyla belirleniyor diye biliyorum.
Bunu da timer kesmesi kontrol ediyor.
Tasklar arası geçiş kurallarını ise tasklarin önceliği belirliyor diye biliyorum...
Alıntı yapılan: fatihinanc - 23 Temmuz 2011, 19:49:29
Taskların birbiri arasındaki geçiş işlemi o task için ayrılan sürenin dolmasıyla belirleniyor diye biliyorum.
O zaman Real Time çalışma olur mu ? Rtos un çalışma mantığını anlatan bikaç grafik koyuyorum buraya. (
Not: Bu grafikler daha önce forumda paylaşıldı.)
(http://i54.tinypic.com/2elbcjo.png)
(http://i53.tinypic.com/1239mkn.png)
(http://i51.tinypic.com/2dm61l3.png)
OSA'nın dökümantasyonunu inceledim, hatta biraz da kaynak koduna baktım. Ancak henüz bir uygulama denemesi yapmadım.
Benim aklıma takılan sorular, RTOS'un kullanımından çok dahili işleyişi ile ilgili.
Örneğin, normalde görev değişimi (context switch) sırasında, o görevin yığını (call stack) bir yere kopyalanmalı ki o görevin çağırdığı fonksiyonlardan geriye dönüş mümkün olsun. PIC16 ve PIC12 de yığına erişim mümkün değil. Bu durumda görevler içinde fonksiyon çağırmak mümkün olmuyor mu? Ayrıca kaynak kodunda PIC18 için olan bölümde de yığının saklanması ile ilgili bir bölüm göremedim, bilmiyorum belki de benim gözümden kaçmıştır. Sanki sadece program counter ve bazı register'lar saklanıyor gibi gözüküyor.
Ayrıca bir de C18'in kendi yazılımsal yığını var. Görev değişimi sırasında bunun da saklanması ve değiştirilmesi gerekebilir. Bu olay nasıl çözülmüş onu da anlamadım.
Dediğim gibi, ben kullanımından çok RTOS'un dahili işleyişini merak ediyorum. OSA'nın kaynak kodu güzel yazılmış, ama yine de sadece koda bakarak olayın bütününü görmek çok zor, veya ben bir türlü başaramadım. Bunu görsel veya sözel olarak anlatacak bir doküman var mıdır?
RTOS a bir task koyalım ve bu taskın sadece tek komutu getc(); olsun ,kullandığımız mikrokontrolörde donanımsal 1 byte hafıza tutabilen usart donanımı için
9600 bps ile haberleşebilmek demek, aşşağı yukarı saniyede 1200 byte alıyoruz yada yolluyoruz demek, 1/1200 = 833ns ediyor. Yani veri kaybı olmaması açısından 833 ns de bir gidip usart donanımından ,datayı işleyeceksek, başka bir yere almak gerekiyor. Yani hiç bir işlemi işin içine kaymassak ve usartdan alıp hafızaya atmak işemi de 1 ns olsun, düzgün veri iletişimi için her 833 ns de, 1 ns bu task a ayırmak gerekiyor .
Doğru mu anlamışım acaba.
Alıntı yapılan: mcan - 12 Ekim 2011, 00:48:00
...9600 bps ile haberleşebilmek demek, aşşağı yukarı saniyede 1200 byte alıyoruz yada yolluyoruz demek, 1/1200 = 833ns ediyor...
1/1200 baud 833us yapar. RTOS ları fazla incelemiş değilim fakat INT oluştuğunda zaten ilgili rutinde bir tampona atılma işlemi yazılımsal olarak programmer tarafından yapılmıştır diye düşünüyorum. Task esnasında ilgili buffer veya flag kontrol edilip, görev varsa icra edilmeli, yoksa devam edilmeli diye düşünüyorum. Bu durumda bahsettiğiniz olaya gerek kalmaksızın, taskın kendisini INT rutini gibi kullanmış olursunuz ki oldukça da etkin olur. Yanlışım/hatam varsa konuyu bilen arkadaşlar düzeltir, bende öğrenmiş olurum.
Alıntı yapılan: katana - 12 Ekim 2011, 01:07:12
1/1200 baud 833us yapar. RTOS ları fazla incelemiş değilim fakat INT oluştuğunda zaten ilgili rutinde bir tampona atılma işlemi yazılımsal olarak programmer tarafından yapılmıştır diye düşünüyorum. Task esnasında ilgili buffer veya flag kontrol edilip, görev varsa icra edilmeli, yoksa devam edilmeli diye düşünüyorum. Bu durumda bahsettiğiniz olaya gerek kalmaksızın, taskın kendisini INT rutini gibi kullanmış olursunuz ki oldukça da etkin olur. Yanlışım/hatam varsa konuyu bilen arkadaşlar düzeltir, bende öğrenmiş olurum.
Önerdiğim task interrupt tarzında bir task değil, normal task olarak düşünelim, yani interrupt kullanmadan düzgün veri akışı sağlamk istiyorsak 833 us de bir taskı işlememiz lazım değil mi?
Alıntı YapTask esnasında ilgili buffer veya flag kontrol edilip, görev varsa icra edilmeli, yoksa devam edilmeli diye düşünüyorum
Buradan anladığım getc için düşünürsek uart modülünün flaglarını başka tasklarda kontrol mü edicez ?