Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

RTOS

Başlatan HEXF2, 01 Aralık 2005, 08:18:10

HEXF2

Arkadaşlar forumda bu konu hakkında arama yaptırdım bazı arkadaşlar ingilizce döküman vermişler fakat birçok teknik terim içeriyor ve ingilizcem çok da kuvvetli olmadığından tam bir anlam çıkaramıyorum RTOS nedir CCS 'de RTOS nasıl kullanılır ne işe yarar yani PIC'te ne işe yarar,ne gibi uygulamlarda kullanılır? RTOS'u CCS'de kullanabilmem için setup ayarlarını en doğru nasıl yapabilirim ne olur yardım edin genelde açtığım topic'ler yanıtsız kalıyor (nedendir çözemedim) ama bu defa bu konuda yardımcı olacak arkadaşlar çıkacaktır umarım yardımlarınızı bekliyorum.

argeci

rtos bildiği gibi gerçek zamanlı işletim sistemi demektir.Bu tarz tasarlanan sistemlerde yanlışsam arkadaşlar düzeltsin task yani görev kavramı vardır bu sistemde en önemli avantaj hızlı tepki vermesini istediğiniz görev ve fonsiyonları işlettirmek ve bunun bir düzen altında yapılmasını sağlamaktır ufak bir örnek windowsdan verelim mesela windowsda yüksek önceliğe sahip olan olaylardan biri olan fareden gelen verilerin okunmasıdır windows ne kadar hatada yapsa çöksede genelde fare haraketsiz kalmaz eğer fareyi hareket ettiremiyorsanız gerçekten çok ciddi bir problem var demektir işte mesela sizde picle yaptığınız bir tasarımda mesela fareden aldığınız değerleri lcd de göstermek olsun fare okuma fonsiyonun örnek veriyorum 1ms lik taskların tanımlandığı rutine koyarsınız lcd ekrandaki değer güncelemeyide 100ms deki taskların içine koyarsınız böylece sistem realtime'a yaklaşmış olur.100ms tasktada gelse 1ms lik task işletme zamanı geldiğinde (bu bilgi genelde timerla alınır) önce onu işletir ve devamlı güncel değere sahip olmanız sağlanmış olur.Gerçekte 1ms de bir lcd güncellemek sizin bi işinize yaramaz ama farenin 1ms isteklerine cevap vermeniz şarttır vermezseniz iletişim kaybolabilir (tabi kesinlikle fare böyle çalışır demen bu bir örneklendirmedir) tabi bu tarz bir sistem tasarlanırken 1ms taskların yazıldığı yere 2 ms süren bir fonsiyon yazarsanız sistemiz çöker bu aslında bilinen interupt mantığının olaylara dönüştürülüp fonsiyonlarında görev olarak tanımlandığı bir yapıya sağlamda bir kontrol algoritması eklenmesidir desek sanırım yanlış bir değerlendirme olmaz.Ustalar yanlışlarımı düzeltsin.Herkese kolay gelsin
esselamü aleyküm ve rahmetüllahi ve berekatühü Allahın selamı rahmeti bereketi hepinizin ve hepimizin üzerine olsun

HEXF2

harika açıklamışsın ne olduğunu peki anlattıklarına örnek bir kod verebilir misin yani bu biriminin nasıl kurulduğuna dair

arslan74

Merhaba,
RTOS ( Real Time Operating System ) acılımındanda anlaşılacağı gibi. Gercek zamanlı işletim sistemidir. Arkadasın örnek verdiği Windows v.b. Linux, dos, unix iştetim sistemi gibi. Yüklü bir ana program var ve bu sürekli calışıyor, diğer programlarda onun alt programı şeklinde oluyor. Mesela ana bir menü yaptın sonra ana menüden değişik alt programlara girebiliyorsun. Alt menüden cıktın mı tekrar ana program geri dönüyorsun.
Böyle bir uC (Microcontroller) ile tek programa değişik programlar yükleyib çalıştırabilirsin.

Normalde uC için tek program yazılır diğer alt programlar buna adapte edilerek yapılır. tabi bunu yapan kişi kendi alt programını kendisi hazırlamak zorunda kaliyor.

Ama bu işleri cok daha kolay hale getirmek için uC için bir çeşit hazır işletim sistemi yazmışlar. Sen kendi yaptığın veya başkların hazırladığı programları bu işletim sistemine entegre ediyorsun gerisini kendisi otomatik ayarliyor. Yoksa diğer türlü hepsini biz ayarlamaya uğraşsak cok bocalarız. Kaldı kı daha sonra calışan alt program sayısını artırmak zorunda kalsak sistemi yeniden tek tek ele almak zorunda kalacağız.

Ama RTOS ile bu işleri belirtiyorsun o sana ona göre hazır kodlar üretiyor.

Gelelim CCS ile RTOS uygulamasına. RTOS genel olarak ANSI-C standartı baz kazırlanmıştır. RTOS CCS'nin komutlarını ve fonksiyonlarını anlayıb ona göre kod üretebilmesi için onun kodlarını anlamalı.

Ancak ne yazık ki CCS ANSI-C standartlarına uymuyor. Dolaysıyla Hazır RTOS programlarıyla bunu kullanamassın. Bunun yerine size tavsiyem Hi-Tech yada IAR'ın derleyicilerini kullanmanız. Cünkü bu derleyiciler Ansi-C standartlarına göre hazırlanmış vede cok başarılarını kesin olarak kanıtlanmış professonel derleyicilerdir. Hi-Tech web sitesine girdin mi orda Hi-Tech ile uyumlu çalışan "Salvo RTOS" programını web sitesinde göreceksin. RTOS programları derleyicilerden ayrı birer programdır vede ayrı satılır. Ama freeware RTOS işletim sistemleride var. Hata PIC serisi uC desdeklemektedirler. Daha fazla bilgiyi arama motorlarından bulablirsin.

Çalışmalarınız da başarılar,

Hasan ARSLAN

argeci

//multitasking system – handle multiple tasks with one microprocessor
//task counters used to tell when a task is ready to be executed
//all these counters are incremented every time a 500us interrupt happens
//every task has its own counter that is updated every time a 500us interrupt happens
unsigned int task0_counter=0;
unsigned int task1_counter=0;
unsigned int task2_counter=0;

//this tells when a task is going to happen again
//for example, when task0_counter==TASK0_COUNTER_MAX, set task0_counter=0 and do task
#define TASK0_COUNTER_MAX 1         //high frequency task – every 500us, maybe PWM
#define TASK1_COUNTER_MAX 2000      //low frequency task – every 1000ms
#define TASK2_COUNTER_MAX 5000      //low frequency and low priority task, every 2500ms

//Note: every variable referenced in both interrupt and main() must be declared volatile. You have been warned!
//this enables/disables a task
volatile unsigned char task0_enable=TRUE;
volatile unsigned char task1_enable=TRUE;
volatile unsigned char task2_enable=TRUE;

//this allows tasks triggered by interrupt to run in the background in main()
volatile unsigned char task2_go=FALSE;
void setup_multitasking(void)
{
   //set up tmr1  to interrupt every 500us
   TMR1CS=0;
   T1CKPS0=0;
   T1CKPS1=0;

/*We want to wait 2000 clock cycles, or 500us @ 16MHz (instructions are 1/4 speed of clock).  Timer 1 interrupts when it gets to 0xFFFF or 65535.  Therefore, we set timer 1 to 65535 minus 2000 = 63535, then wait 2000 ticks until rollover at 65535.  To test, use simulator to find that its exactly correct*/

   #define  TICKS_BETWEEN_INTERRUPTS      2000
   #define  INTERRUPT_OVERHEAD            19
   #define TMR1RESET (0xFFFF-(TICKS_BETWEEN_INTERRUPTS-INTERRUPT_OVERHEAD))
   #define TMR1RESET_HIGH TMR1RESET >> 8
   #define TMR1RESET_LOW TMR1RESET & 0xFF
   TMR1ON=0;
   TMR1H=TMR1RESET_HIGH;
   TMR1L=TMR1RESET_LOW;
   TMR1ON=1;      
   TMR1IF=0;
   TMR1IE=1;
   PEIE=1;
   GIE=1;   
}

void interrupt isr(void)
{
   //one tick every 500us at 16Mhz
   if (TMR1IF)
   {
      //set up timer 1 again to interrupt 500us in future
      TMR1IF=0;
      TMR1ON=0;
      TMR1H=TMR1RESET_HIGH;
      TMR1L=TMR1RESET_LOW;
      TMR1ON=1;
      task0_counter++;
      if (task0_counter>=TASK0_COUNTER_MAX)     //high frequency task – every 1 tick
      {
            task0_counter=0;
            if (task0_enable==TRUE)
            {
                  //do high frequency important task 0, for example PWM
            }
      }
      task1_counter++;
      if (task1_counter>=TASK1_COUNTER_MAX)     //low priority task - every 2000 ticks
      {
            task1_counter=0;
            if (task1_enable==TRUE)
            {
                  //do low frequency yet important task 1
            }
      }

/*this task takes a long time, 100ms for example, lots of maths.  Is extremely low priority, but has to be done at regular intervals, so all this does is trigger it.  In main(), it will, at leisure, poll ‘task2_go' and then execute it in the background.*/

      task2_counter++;
      if (task2_counter>=TASK2_COUNTER_MAX)     //every 250ms
      {
          task2_counter=0;
          if (task2_enable==TRUE)
          {
               //every 250ms take 100ms to do maths, do this in main() so the we can get back to doing the high frequency tasks.
               task2_go=TRUE;
          }
      }
   }  //if (TMR1IF)
} //interrupt routine


main()
{
   setup_multitasking();
   while(1)
   {
      if (task2_go==TRUE)
      {
            task2_go=FALSE;
            //take our time, doing heaps of complex maths at our leisure in the background
      }
   }
}

şimdi yukardaki koda beraber bakarsak 500us de task0 var pwm için
1sn (1000ms) task1
ve daha yüksek zamanlar için 2500 ms lik task2
interupt rutini sana bu olayı düzenliyo 500us kurulmuş timer interupu her 500us de task 0 countu 1 olduğu için hemen true oluyo maine bakarsan task 0 ve bir için kod yok eğer sen
         task0_counter=0;
         if (task0_enable==TRUE)
         {
         }
desydin 500usde bir işlemesi gereken kodlarını buraya yazardın örnek task2 yi almış interrupt programı her 500us'de bir task2 nin counter değerini bir arttıracak taki 5000 olana kadar yani 2,5 saniye olana dek  2,5 saniye geçmeden task2_enable true olmayacak ve senin o if'in içindeki kod çalışmayacak eğer sen bu if'in içinde toogle (pinb1); yazsan ve b1'e led bağlasan 2,5 saniyede yanıp sönen bir led elde ederdin eğer bu kodu task 1 le değiştirsen 1 saniyede task0 ile değiştirsen ledin her 500us de konum değiştirecekti
İşte mesele bundan ibaret rtoslarda buna benzer bi yapı ile çalışıyor bazı rtoslar dahada gelişmiş öncelik verebiliyosun zaman dışında bazı şartlarada bağlayabiliyorsun  
http://www.bknd.com/cc5x/multitasking.shtml
buralara
http://freertos.org 'a ve  
http://www.picos18.com/index_us.htm 'ada bakabilirsin ben biraz genel değindim kalanını siz tamamlarsınız inşallah
esselamü aleyküm ve rahmetüllahi ve berekatühü Allahın selamı rahmeti bereketi hepinizin ve hepimizin üzerine olsun

HEXF2

Ya arkadaşlar harika anlatmışsınız çok teşekkür ederim anladığım kadarı ile PIC için RTOS kullanımında TIMER ve flaglardan yararlanılıyor bunun gibi şeyleri assembly'de bayağı bir yazmıştım yani istenilen zaman aralıklarında işlenmesi gereken komutları TIMER'lar ile sağlıyordum çok zor gelmedi peki CCS'de setup ayarlarını nasıl yapıcaz biraz komutlarından bahsedermisiniz

HEXF2

Arkadaşlar neyse sorunu çözdük fakat yeni topic açmamak için burda kısa birşey sormak istiyorum.Bu frekansı bulmak 1/T zamanı bulmak içinse 1/F formülünü kullanıyoruz.Kafama takılan şu 1/F dendiği zaman bulunan zaman ne cinsinden oluyor.Yani sanite mi milisaniye mi mikrosaniye mi??
Şimdi diyelim 50HZ'lik kare dalga üretiyoruz.Bunun kaç saniyede yada milisaniyede 0-1 arası değiştiğini 1/F den buluyoruz.

1/50 = 0.02 çıkıyor.Bu değer zannedersem saniye cinsinden.Bunu milisaniye cinsinden yazarsak 20ms yapar.Yalnış yapıyorsam düzeltin lütfen.

Yani HZ değeri için bölüm sonrası zaman değeri saniye
KHZ için milisaniye
MHZ için mikrosaniye olacak sanırım

Bu anlattıklarımda emin değilim yalnışım varsa düzeltin lütfen

Erol YILMAZ

HEXF2 ornek bir uygulama koyarmısın?

XX_CİHAN_XX

Alıntı yapılan: "HEXF2"Arkadaşlar neyse sorunu çözdük fakat yeni topic açmamak için burda kısa birşey sormak istiyorum.Bu frekansı bulmak 1/T zamanı bulmak içinse 1/F formülünü kullanıyoruz.Kafama takılan şu 1/F dendiği zaman bulunan zaman ne cinsinden oluyor.Yani sanite mi milisaniye mi mikrosaniye mi??
Şimdi diyelim 50HZ'lik kare dalga üretiyoruz.Bunun kaç saniyede yada milisaniyede 0-1 arası değiştiğini 1/F den buluyoruz.

1/50 = 0.02 çıkıyor.Bu değer zannedersem saniye cinsinden.Bunu milisaniye cinsinden yazarsak 20ms yapar.Yalnış yapıyorsam düzeltin lütfen.

Yani HZ değeri için bölüm sonrası zaman değeri saniye
KHZ için milisaniye
MHZ için mikrosaniye olacak sanırım

Bu anlattıklarımda emin değilim yalnışım varsa düzeltin lütfen

Kesinlikle doğru dostum.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

arslan74

Merhaba,

Aşağıdaki linkte Salvo RTOS'un programı var.

http://rapidshare.de/files/8713736/salvo.zip.html

Hi-Tech Derleyicisiyle uyumlu.

Çalışmalarınız da başarılar,

Hasan ARSLAN

HEXF2

Arkadaşlar yanıtlarınız için çok teşekkür ederim yalnız @erol uygulama derken neyi koyayım buraya anlamadım

Erol YILMAZ

Alıntı yapılan: "HEXF2"@erol uygulama derken neyi koyayım buraya anlamadım

Çalışan örnek bir program demek istemiştim.

HEXF2

Dostum örnek program derken ben RTOS olayını asm dilinde hallettim zamanları değiştiriyorum ve hazır alt programlarıma kodlarımı ekliyorum.Ama hala C'de olayı halletmiş değilim yani CCS'in son versiyonuna RTOS fonksiyonlarını eklemişler fakat ben nasıl kurulup çalıştırılacağını çözmüş değilim sordum ama cevap veren çıkmadı araştırıyorum dur bakalı olayı tam anlamıyla çözeyim senle temasa geçerim merak etme  :D  Bu arada inşallah CCS'de şu RTOS'un nasıl kurulduğunu anlatan arkadaş çıkar zira böyle açıklamaların yapılacağı tek yer bence burası ingilizce dökümanlarda çok teknik terim var okuyorum ama kafam karışıyor bir arkadaş burda nasıl kullanıldığını yazsa harika olur.

picusta

RTOS sadece timeslicing'den ibaret değildir (burda verilen örnekteki gibi). Hakkiyla RTOS Preemtive olur, kaynak paylasimi, mesaj gibi mekanizmalari içerir. Bunlar PIC16 ile mümkün değil, ama PIC18 ile yapmak mümkün (çünkü stack'i istedigin gibi kullanamiyosun). PICOS18 ile harikalar yaratilabilir, üstelik mantigini anladiginiz zaman Program gelistirme süresi neredeyse 1/10'a düsüyo, söylemedi demeyin.

CaFFeiNe

CCS içerisindeki örneği bile çalıştıramadık :) yardımcı olabilecek arkadaşlar aranıyor :)

kod


simülasyon şeması


simülasyondada görüleceği gibi terminalde hiçbirşey çıkmıyor

bunun üzerine aşağıdaki gibi basit bir kod yazdım istediğim RB0 ucundaki ledin düzensiz aralıklarlada olsa yanıp sönebilmesi şöyleki 1.task saniyede bir ledi yakacak 2.task ise 0.5 saniyede bir söndürecek ama oda olmadı



yani işi çözemedim