RTOS Sohbetleri!!

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

Erol YILMAZ

#30
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...

rree

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.

EMG81

#32
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.

t2

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.

SERRO EFE

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..

EMG81

#35
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);
   }
}

yamak

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?

EMG81

#37
Ö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.

yamak

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.

fatihinanc

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...
Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

EMG81

#40
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ı.)





Tagli

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?
Gökçe Tağlıoğlu

mcan

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.

Veli B.

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.

mcan

#44
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 ?