Pic ile Multitasking

Başlatan bolubeyi, 04 Nisan 2013, 10:24:57

bolubeyi

Merhabalar, pic ile multitasking olayı mümkün müdür?Eğer mümkünse hangi picler bunu destekliyor?Bu konuda yardımlarınız için şimdiden teşekkür ederim.

Erol YILMAZ

Bir mcu yu tek görevli kullanmak tasarımcılık açısından ne büyük bir derttir,

buton beklerken, motorun akımı artar, arada diğer butona basılır ama mcu cevap vermez fln...


Multitasking elbette mümkündür ve yapılması da genellikle şarttır...

Başlangıç seviyesinden belli bir seviyeye kadar
"Super Loop" içinde her görevde "State Machine" kullanarak kolaylıkla tasarlayabilirsiniz.

Daha da büyüyen projelerinizde RTOS kullanmak vs gerekir.

Z80

Bir işlemciyi multitasking çalıştırmanın en kolay yolu, onu time-sharing yani zaman paylaşımlı çalıştırmaktır.

Timer interrrupt kurarsınız, belli zamanlarda mesela 2 ms de bir interrupt gönderir. Interrupt rutininde ikinci bir task çalıştırırsınız. Böylece 2 işlemi yürütmüş olursunuz, ana işlemler ve interrupt rutini.

Daha çok task çalıştırmak için interrrupt rutini içinde bir sayıcı tutar, her taska bir numara verirsiniz. Yani ilk interruptda sayıcı değeri birdir ve birinci taskı çalıştırır, çıkarken sayıcıyı bir artırıp öyle çıkar. İkinci interruptda sayıcı değerine bakar ikiyi görür ve ikinci taska gönderir. O da çıkarken sayıcıyı artırıp çıkar. En son öncelikli task'den çıkarken sayıcıyı resetler böylece tekrar birinci task'den başlar.  Böylece birçok taski aynı anda çalıştırmış oluruz.

Bunu yaparken bazı kurallara dikkat etmek gerekir . Mesala tasklerin süresi timer süresini aşmamalıdır, bir task içinde kullanılan değişkenler, memory blokları ana programda veya diğer task içinde kullanılmamalıdır, stack taşırılmamalıdır v.s.

   

bolubeyi

#3
http://read.pudn.com/downloads128/sourcecode/comm/com_port/547197/ex_rtos_demo_1_tasks.c__.htm

Buradaki yaptığı sanırım sizlerin dediği olay.

#include <18F452.h>   
#use delay(clock=20000000)   
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7)  // burda seri haberleşme rtos dan zaman bilgisini almak için mi?
#use rtos(timer=0,minor_cycle=100ms)    //Burdaki RTOS kurulum değerleri olabilir diye düşünüyorum
#task(rate=1000ms,max=100ms)   // burası task geçiş aralıkları olabilir diye düşünüyorum
rtos_run ( );    //bu  fonksyon ccs c in desteklediği genel bir fonksiyn sanırım