CCS'de iki Funksiyon ayni anda nasil cagrilir?

Başlatan Digimensch, 28 Kasım 2010, 20:53:17

Digimensch

Iki tane funksioynum var bir calismada.
Ikiside icinde while(True)  döngüsü barindiriyor.
Main funktionunda bu iki funktionu cagirdigimda 1.Funksiyona giriyor ve bir daha cikmiyor 2.Funksiyona girmiyor.
su sekilde
void funk1()
{
while(True)
{
........
.....
...
}
}

void funk2()
{
while(True)
{
........
.....
...
}
}

void main()
{
funk1();
funk2();
}

Acaba Thread olayi yokmu CCS'de?
Iki funksiyonlari ayni  anda nasil calistirabilirim?

SpeedyX

Bu şaka değilse eğer;

while satırlarını kaldır çalışır.

Ayrıca thread işletim sistemlerinde olur.

serdararikan

çift çekirdekli bir pic bulursan olabilir:)

Digimensch

#3
yapmak istedigim su:
LCD de kayan yazi funktionum var while(1) döngüsü ile calisiyor.
Birde devamli sinyal veren led diod var oda devamli sinyal veriyor dolaysiyla oda while(1) döngüsünde.
Hem LCD kayan yazi hemde sinyal veren led ikiside while döngüsünde calisiyor.
Simdi ben bu iki funksioynu ayni anda nasil calistirabilirim?

justice_for_all

led sinyalini timer ile gonderirsen olabilir...

led surekli mi calisiyo yoksa yanip sonuyomu??
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

teknikelektronikci

Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

RcALTIN

#6
C# ile thread kullanmaya alışıp da CCS'e geçince insanın eli kolu bağlanıyor, kendimden biliyorum :) Eğer aynı zamanda timer kurarak işin içinden çıkamayacak kadar çok işlem yapıyorsanız, basit bir yöntem olarak tek bir timer kurarak işin içinden çıkabiliriz gibi. Örneğin Timer taşması saydırılıp bir değişkenimizin saniyede 1 artırmasını sağlayın, saniye değeri 60 olunca da sıfırlayacak şekilde ayarlayın; böylece elimizde ana döngüden bağımsız işleyen bir saniye sayacımız olmuş oldu, eğer 1 saniyelik zaman aralığı yetersizse 120 olunca sıfırlayın böylece 500ms zaman aralığı elde edilir. Şimdi while döngüsünde program çalışıyorken örneğin her 3 saniyede bir kez işlem yapılacaksa if(saniye % 3 == 0) bloğu ile bunu sağlayıp, aynı zamanda 9 saniyede bir yapılacak bir iş için aynı döngüde ilk bloktan sonra if(saniye %9 == 0) bloğu ile bunu da yaptırabiliriz sanki... Dikkat edilmesi gereken nokta döngü içinde delay kullanımı oluyor ki bu işlem atlamalarına sebebiyet verebilir, ledi anlattığım gibi yakıp söndürmek içinde ayrı ayrı bloklar kullanırsanız delay kullanmaya da gerek kalmayacak diye düşünüyorum...

Düzeltme: yukarıda 120 olunca sıfırlayın 500ms olsun demişim, aslında hatalı yazmışım 60x2 değil 60/2 olacak kısaca 500ms için 30 olduğunda sıfırlanmalı... Zaten amaç timer kullanarak işlemleri sıralamanın mantığını anlatmak, detaylara takılmaya da gerek yok ya neyse yinede düzelteyim ben yanlışımı...
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

Digimensch

iki funksiyon var ve her funksiyonda while(true);  döngüsü mevcut.
Bu iki funksiyonu ayni anda calistirmak istemistim....!

Kesme olaylari ile bu is yapilabilinirmi??

picmanya

#8
Alıntı yapılan: Digimensch - 28 Kasım 2010, 22:01:36
yapmak istedigim su:
LCD de kayan yazi funktionum var while(1) döngüsü ile calisiyor.
Birde devamli sinyal veren led diod var oda devamli sinyal veriyor dolaysiyla oda while(1) döngüsünde.
Hem LCD kayan yazi hemde sinyal veren led ikiside while döngüsünde calisiyor.
Simdi ben bu iki funksioynu ayni anda nasil calistirabilirim?

lcd ye yazan while(1); döngüsüne odaklanıp onu istediğiniz gibi çalıştırın.
ledin çalışmasını denetleyen döngünüzü ise şu şekilde yapsanız bir timer kurup işinizi görüyorsa ya direkt bu timerin yazılım kesmesi altında ledin çalışması kontrol edin. yada led yanıp sönme zamanları farklı ve/veya ledin yanıp sönme zamanları farklı olduğu gibi bu zamanlarda belirli sürelerde değişim gösteriyorsa timer ile çıkış karşılaştırma (OCx) modülünü devreye alın derim.
lcd nizi kontrol eden döngünüzden siz çıkmadıkça led için ayarladığınız çalışma tarzı gerçekleşir.aslında geri planda kesme oluştuğunda lcd kontrol while döngüsünden çıkılıp kesme içindeki diğer işlemler tamamlandıktan sonra yine lcd while da kalan yerden devam ediliyor ama bu sizin hissedemeyeceğiniz kadar kısa bir süre olur siz yeterki kesme içindeki yazılımı fazla saykıl almayacak şekilde ve kesinlikle döngüye girmeyecek şekilde ayarlayın.bir kere yazması belki sizn açınızdan zor olabilir ama düzgün yazılmış bir kesme alt progarmının çalışması tadından yenmez yazılım C olduğu içinde gerekirse ordan oraya taşınabilirde adaptasyonu kolay olur.
aslında işlemciniz çift çekirdekli henüz olamıyacağına göre (thread'ı unutun) dma modüllü işlemciler ile bu işler dma üzerinden daha kolay yapılabiliyor zannediyorum  hem bu durumda lcd while döngüsünden çıkılmıyorda bildiğim kadarı ile aslında olay böyleyse bir nevi çift çekirdek-işlemci görevini veya thread çalışmasını dma modül üzerine almış oluyor.dma modüle bu güne kadar ihtiyacım olmadığından bunu kullanmadım FxDev hocamın bu konuda bilgisi varsa paylaşırsa sevinirim.
dma = dolaylıyoldan thread yazılım çalışması gibi bir şeymidir.

memet569

Anladığım kadarı ile yapmaya çalıştığın aynı anda bir kaç işlemi nasıl yapabilirim=!
örneğin, motor sürücüsü yaptın diyelim, motorun çalıştığı bildirmek için aynı anda yeşil bir led yanıp sönsün; işte bu tarz uygulamaları yapmak için
"Multi-Tasking and Real-Time Operating Systems" konusunu kavramak gerekir. kaynak olarak doğan ibrahim'in " Advanced PIC Microcontroller
Projects in C" kitabını öneririm. kitap normalde MikroC ile yazılmış ama bahsettiğim konu kitabın en sonunda CCS C ile yazılmış ve gayet başarılı.

Kolay gelsin...

birumher

fonksiyonlardeki değişkenleri dışarı al içlerindeki while döngülerini kaldır. Tek while içinde çalıştır ikisini de..
void main()
{
while(True)
{
funk1();
funk2();
}
}
Birkan.Herguner

picmanya

Alıntı yapılan: birumher - 10 Aralık 2010, 12:46:23
fonksiyonlardeki değişkenleri dışarı al içlerindeki while döngülerini kaldır. Tek while içinde çalıştır ikisini de..
void main()
{
while(True)
{
funk1();
funk2();
}
}


fonksiyonların içinde timer kesmesi falan ayarlanmıyorsa, dma modül devreye alınmıyorsa veya işlemcinin bir takım registerlerine falan dokunulmuyorsa bu şekilde kullanımda bir işe yaramaz.

az yukarıda ismi geçen RTOS konulu Doğan ibramın kitabındada fazladan laf kalabalığı yapılmış
bildiğimiz kullanım haliyle switch case ilede bu iş olmaz ama bir yerde timer anlatılmış bakın bunla olabilir işte.
bu iş için anahtar kelimeler dma modül,timer kurma ve kesmesini devreye alma,bir takım işlemci registerlerini kurcalama diyebilirim.

Digimensch


picmanya

iki fonksiyonu birden aynı anda çalıştırmak istiyorum ama olmuyor deyince, size yapmanız gerekenler fazlasıyla söylenmiş.
siz iki fonksiyonu aynı anda çalıştıracağım ama olmuyor demenin ötesinde, gerçekden yapmak istediğiniz işlemleri açıkça yazın
yani bu iki fonksiyonlar ne yapmak için oluşturuldu ve fonksiyon içlerinde ne tür işlemler yapılması gerekiyor.
belki burdan giderseniz daha fazla ve etkin cevap gelebilir.siz yazılanlardan ortak bir fikir edinmeye çalışın.sizin işiniz daha çok timer ve timer kesmesiyle çözümlenebilecek bir şey gibi duruyor yada fonksiyonlarınızın içlerinde UART,I2C,SPI,CCP ile ilgili çalışmalar geçiyorsa bunların devreye alınmasıylada duruma ve çalışmaya göre sonuca gidilebilir.
iki fonksiyon aynı anda çalışacak için verebileceğim cevapları vermişim. 

iceberg

RTOS kullan geç derim.. CCS C nin ki oldukça kullanışlı..