Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

rtos_yield()'in amacı nedir?

Başlatan Seferi, 28 Eylül 2018, 12:15:14

Seferi

#include <46k22usart.h>
#include <stdio.h>
#use rtos(timer=0,minor_cycle=200ms)

#define LCD_ENABLE_PIN PIN_E2
#define LCD_RS_PIN PIN_B0
#define LCD_RW_PIN PIN_B1
#define LCD_DATA4 PIN_B2
#define LCD_DATA5 PIN_B3
#define LCD_DATA6 PIN_B4
#define LCD_DATA7 PIN_B5
#include <lcd.c>

#task(rate=1s,max=100ms)
void gorev1();

#task(rate=2s,max=100ms)
void gorev2();

void main()
{
    rtos_run();
}


void gorev1(void)
{
    //lcd_gotoxy(1,1); printf(lcd_putc,"\Gorev1          ");
        say++;
        if(say>=10)
         {rtos_yield();}            
    lcd_gotoxy(1,1); printf(lcd_putc,"\Gorev1    %ld",say);

}
void gorev2(void)
{
    lcd_gotoxy(1,1); printf(lcd_putc,"\Gorev2          ");
}

Merhaba CCSC nin kendi Rtos özelliğini kullanmaya çalışıyorum. Yukarıdaki gibi bir kod yazdım ve çalışıyor gibi de görünüyor. Yani ekrana istediğim zaman aralıklarında "Görev1      (say)" ve "Görev2" yazıyor. Fakat say değişkeni 10'dan büyük olduğu zaman "Görev1     (say)" yazmasın istiyorum, fakat Görev1'in yanındaki sayı artmaya devam ediyor. Bunu da rtos_yield(); ile yapmaya çalıştım. Daha doğrusu bu fonksiyonun nasıl çalıştığını anlamak için bu şekilde bir program yazdım. rtos_yield(); normal programda "return 0" ın yerine mi kullanılıyor? Tam olarak görevi nedir?

SpeedyX

yield, diğer tasklara yol verir. Bir taskın kritik noktasından sonra bu komut kullanılarak beklemekte olan diğer taskların öncelik sırasına göre çalışması sağlanır.

OptimusPrime

Gorev zamanlayicisina benim isim bitti illaki bana ayrilan surenin bitmesini bekleme hemen siradaki goreve gec mesaji gonderiyor. Bunun birde kesmeden yol vereni var.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Seferi

#3
Alıntı yapılan: OptimusPrime - 28 Eylül 2018, 16:04:39Gorev zamanlayicisina benim isim bitti illaki bana ayrilan surenin bitmesini bekleme hemen siradaki goreve gec mesaji gonderiyor. Bunun birde kesmeden yol vereni var.
Ama yinede Görev2 yi tamamlıyor program. O dediğiniz nasıl oluyor? Kesmenden yol vereni..

OptimusPrime

Yol veriyor derken ben artik yokum diger gorevleri islet demiyor. Bana ayrilan sure icerisinde baska isim kalmadi diger arkadaslarla ugras diyor. Diger arkadaslarda kendilerine ait olan sureleri tamamladiklarinda yine yol veren arkadasa sira geliyor.  ;)

kesmeden yol verirkende ayni geyik devam ediyor. Kesme gorevi aslinda araya kaynatilmis bir gorev oluyor. Kesmede yapilacaklarin yapilip hemen kalinan yere geri donulebilmesi icin yield_isr kullaniliyor. Yukaridaki ile ayni manltik. Benim isim bitti zaten kesme icerisindeyiz, gereksiz yere bekleme beni, kaldigin yerden isine devam et diyor, gorev yoneticisine.

 
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

mufitsozen

@OptimusPrime CCS C Reference Manual'da yield_isr diye bir fonksiyon bulamadim. Bu fonksiyon ile ilgili bilgiyi nereden buldunuz CCS Cde acaba bilgilendirebilirmisiniz?
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

OptimusPrime

FreeRTOS ile aynidir diye salladim. Tutmadi demek. Belkide ismi farklidir? ;D
Kesmeden yol vermenin bir yolu olmali.
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

mufitsozen

Alıntı yapılan: OptimusPrime - 28 Eylül 2018, 18:14:11FreeRTOS ile aynidir diye salladim. Tutmadi demek. Belkide ismi farklidir? ;D
Kesmeden yol vermenin bir yolu olmali.

Maalesef CCS C icindeki RTOS preemptive degil, cooperative.

Boyle bir fonksiyon yok. Kesmeden yol vermek gibi konularda biraz alengirli.

Yazdiklariniz @Seferi arkadasin kafasini karistiracaktir, Biraz daha ozenli yorumlar yazmak onun sevkini kirmamak acisindan onemli, bence.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

OptimusPrime

@mufitsozen
sevkini kirmamak disindaki yorumlarina katiliyorum. Haklisin. ;)
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

Seferi

O zaman benim programda "Görev2" nin işini bitirmesi normal bir durum. Bir de şu durum dikkatimi çekti; görev sürelerinin 1s 2s 3s 4s olduğu 4 görev tanımlıyorum,
#task(rate=4s,max=100ms)
void gorev4();
burada dördüncü görev 4saniyede bir işlenmesi gerekiyorken daha geç sürede işleme alınıyor, bu normal bir durum mudur?

SpeedyX

Normal bir durumdur. Yield kullandığında veya taskların birisi tanımlanmış süresinden daha uzun zaman harcadığında, task zamanlamalarında bozulmalar oluşur. Eğer yield veya uzun zaman harcama periyodik olarak tekrarlanıyorsa, bu bozulma da tekrarlar.

ertan

Merhaba
RTOS görevlerinden birine denir ve programın kontrolünü idare eder.rtos_run () işlevi Tamamlandığında tüm görevler bu işlevi çağırmalıdır.
Bu işlevler, CCS Gerçek Zamanlı İşletim Sisteminin (RTOS) çalışmasını kontrol eder.
Bu işletim sistemi, birlikte çalışan çok görevlidir ve görevlerin belirtilen zaman aralıklarında çalışması için zamanlanmasına izin verir. RTOS kesmeleri kullanmadığından, kullanıcı her görevde rtos_yield () işlevini kullanmaya özen göstermelidir, böylece hiçbir görevde sonsuza kadar çalışmasına izin verilmez.

sımışka

ilgili threadin task fonksiyonunda kullanılıyorsa, o thread in o noktadan sonrası çalışması işlemesi durdurulur ve diğer thread veya main thread den işlemeye devam eder. İşlemciyi diğer task lar için boşa çıkarma işlemini görür. Eğer tek çekirdekli işlemci üzerinde birden fazla proses var ise , aynı işlemi bu prosesler arası yapar. Eğer birden fazla proses altında main thread leri dışında yaratılmış thread ler var ise, kuracağınız scheduling algoritmasına göre yield fonksiyonundan sonra, kendi prosesinin diğer threadi nden veya diğer prosesesin thread inden çalışmaya devam eder.