state-event-transition nedir?

Başlatan mir_as82, 23 Eylül 2013, 16:39:34

mir_as82

Arkadaşlar C ile programlama yaparken bu 3 kavramı nasıl kullanıyoruz? Neden kullanıyoruz? Faydası nedri?

mufitsozen

#1
Alıntı yapılan: mir_as82 - 23 Eylül 2013, 16:39:34
Arkadaşlar C ile programlama yaparken bu 3 kavramı nasıl kullanıyoruz? Neden kullanıyoruz? Faydası nedri?

Sadece C ile değil, her dilde bu teknigi kullanabilirsiniz.

Temelde FSM (finite-state-machine) taniminda (modellemesinde) bir objenin bulundugu state'ler bu statelerde iken tepki gosterilen eventler ve bu eventlerin sonucunda alinan aksiyonlar (tepkiler ve bir sonraki state) o objenin dinamik olarak davranisini (behaviour) belirler.

FSMlerinin cesitli tipleri vardir. Modellemede en cok kullanilan UML de kullanilan  Harel Statechart denilen notasyondur.

FSM konusundaki kaynaklara bakarak daha ayrintili bilgi bulabilirsiniz.
http://tr.wikipedia.org/wiki/Sonlu_durum_makinesi
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

mir_as82

Önerebileceğiniz Türkçe veya İngilizce kaynak var mıdır? C dilinde bunlara örnek teşkil edebilecek uygulamaları nereden bulabilirim?

mufitsozen

Alıntı yapılan: mir_as82 - 23 Eylül 2013, 17:12:03
Önerebileceğiniz Türkçe veya İngilizce kaynak var mıdır? C dilinde bunlara örnek teşkil edebilecek uygulamaları nereden bulabilirim?


Practical UML Statecharts in C/C++: Event-Driven Programming for Embedded Systems
http://www.amazon.com/Practical-UML-Statecharts-Event-Driven-Programming/dp/0750687061/ref=pd_bxgy_b_text_y
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

z

#4
Alıntı yapılan: mir_as82 - 23 Eylül 2013, 17:12:03
Önerebileceğiniz Türkçe veya İngilizce kaynak var mıdır? C dilinde bunlara örnek teşkil edebilecek uygulamaları nereden bulabilirim?

Program yazarken farkinda olmadan ornek yapiyorsundur zaten.

A Butonuna bastiginda led yansin. A Butondan elini ceksen bile yanmaya devam etsin. B butonuna basarsan led sonsun. Tekrar A ya basarsan Led toggle etsin.

1.State: A Butonuna basilmayi beklerken ledi sondur

A butonuna basildiginda 2.State'te gec

2. State: Ledi yak. A butonu basili oldugu surece 2. State'de kal

A butonundan parmak cekildiginde 3. State gec

3. State: A yada B butonuna basildiginda 1. State gec aksi takdirde 3 de kal. (Mesela burda A butonu ile ilgili mantik hatasi hata yaptim)

Bu akisi sistematik tasarim yaparak daha az state ile gerceklestirebilirsin.

Burada State zaten anlasiliyor.

Event durumu butona basmak yada butondan parmagi cekmek

Transition 1 stateden bir diger state'de gecmek.

Kisacasi bunlar, sequential lojik tasariminin yazilim versiyonu
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mir_as82

Tesekkur ederim hocam. Peki fonksiyonlarin icinde pointer kullanimi neden ve nasil olur? Ornegin void (*fonk1) void ; tanimlamasi yaptim. Daha sonra void f1 void(){.........} gibi bir fonksiyon yazdim ve daha sonra
Fonk1=f1;
Bu kullanindaki mantik nedir? Belki tam anlatamadim ama tecrubeli arkadaslar ne demek istedigimi anlamistir

OptimusPrime

mesela çok dilli bir cihaz yaptın. kullanıcı menude gezinirken hangi dil seçilmişse ona ait bir fonksiyon çağırıyorsun diyelim. menünün her karakter yazacağın yerinde şeçili dili kontrol etmek yerine init anında bir kez kontrol edip fonksiyon işaretçisine ilgili dilin fonksiyonunu atarsan, menuye karakter basmak için sadece bu fonksiyonu çağırman yeterli olacaktır...
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 ||

mir_as82

kısa bir kod yazıp açıklamalı anlatabilir misiniz?

z

#8
Son sorduğun soruyla ilgili değil ama üzerinde çalışmak istersen sana state machine ile ilgili bir çalışma sorusu sorayım.

Bir program yazdın. İşlemcide yer (program alanı) sorunun yok.

Yazdığın program sonsuz dongü içinde çalışıyor. Başlıyor tıkı tık tıkı tık kodları peşpeşe işletiyor sonsuz döngünün son satırına geliyor ve burada 1 ms kadar zamanı boşa öldürüyor ardından sonsuz döngünün en başına gidiyor ve bu böyle devam ediyor.

Sana bu projeye eklenti yapmanı istediler. Ancak bu eklenti için yazdığın kodlar 10 ms de işini bitiriyor. Bu eklentiyi o 1 ms lik ölü zaman döngüsüne eklesen 9 ms lik fazladan işlem zamanı ana programın çalışmasını tehlikeye sokuyor.

Bu durumda 10 ms süren eklentiyi öyle bir yazki tek seferde çalıştırmak yerine her defasında 1ms lik parçası çalışsın. (Ana döngünün her 10 dönüşünde eklenti program işini bir kez yapsın)

RTOS, OS kullanmak yasak.

İşte bu eklentiyi state machine mantığı ile yazacağın kodla yapabilirsin.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mir_as82

Yani bir nevi bayrak yarisindaki bayrak devri gibi.
Fonksiyon pointer da: elimizde ekrana 5 dilde yazi yazan ayni menu var. Dillerin kelimelerini  farkli farkli dizilerde tuttugumuzu farzedelim, bunlari ekrana basan fonksiyon tek, ama bu fonksiyona gelen dil degiskenine gore ilgili yere ilgili dilin dizi elemanini yazdiriyor.

OptimusPrime

3 tane dil olsun türkçe japonca rusça. 3 de farklı formatta dizi içeriyor dolayısıyla 3 ünüde farklı şekilde ekrana basman gerekiyor.

bu 3 fonksiyona isim verelim
- türkçe basan -> printTR
- japonca basan -> printJP
- rusça basan -> printRU

dil seçeneğini tutan değikende lang olsun.
lang 1 ise -> TR
lang 2 ise -> JP
lang 3 ise -> RU

kullanıcı menüye girdi. lang da 3, rusça basman lazım. yani bu işi printRU fonksiyonu yapacak. dolayısı ile karakter basmadan önce
if lang=1 printTR else if lang=2 printJP else printRU
şeklinde kontrol ederek ilgili fonksiyonu çağırmalısın. bu menü kendisi ile birlikte 100 adet alt menü içerse 100 kez
if lang=1 printTR else if lang=2 printJP else printRU
yazmasın.

fakat şöylede yapabilirsin:
init anında dili kontrol edip
if lang=1 fptr=printTR else if lang=2 fptr=printJP else fptr=printRU
ilgili atamayı yaparsın. kullanıcı menüyü gezerken ne zaman ihtiyaç duyarsan sadece
fptr yi çağırırsın. o gerisini halleder...

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

mir_as82

 Peki o atama bize ne kazandiriyor?ve o atamannin mantigi ne?sen o atamayi yaparken fonksiyonun baslangic adresini fonksiyon pointere atmis oldun?aciklamali kod varsa yazar misin?

OptimusPrime

-Peki o atama bize ne kazandiriyor?
kabaca bakarsan olaya, kodda anlaşılırlık ve yazımda kolaylık sağlıyor.

-ve o atamanin mantigi ne?
bildiğin pointer mantığı

-sen o atamayi yaparken fonksiyonun baslangic adresini fonksiyon pointere atmis oldun?
aynen

-aciklamali kod varsa yazar misin?
kabaca bir örnek verdim zaten...

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

mir_as82

Neden normal degisken degilde fonksiyon pointer kullandik diye dusununce, sundan dolayi mi, program 5000 satir oldu diyelim kullanilan seyin normal degisken mi oldugu ileriki zamanlarda karistirilabilir. Bundan dolayi kullanilanin fonksiyon oldugunu belli etmek adina fonksiyon pointer kullandik?

yamak

Alıntı yapılan: mir_as82 - 25 Eylül 2013, 10:26:39
Neden normal degisken değilde fonksiyon pointer kullandik diye dusununce, sundan dolayi mi, program 5000 satir oldu diyelim kullanilan seyin normal degisken mi oldugu ileriki zamanlarda karistirilabilir. Bundan dolayi kullanilanin fonksiyon oldugunu belli etmek adina fonksiyon pointer kullandik?
Şöyle bir uygulamada olabilir.Örneğin konsoldan 0-15 arasında rakam girilmesini istiyosun ve her bir değere göre programa değişik işler yaptırıyosun.Şimde if kullanarak yapmak yerine fonksiyon göstericilerine bir diziye atarsın adam konsoldan girdiği değere göre dizini o elemanını çağırırsın hem kod daha sade olur hem de hem de kodu daha hızlı yazarsın hem de hata yapma olasılığın daha da düşer.
Örnek:
printf("0-15 arasında bir değer girin\n");
scanf("%d",&i);
f[i]();


Ya da şöyle bir yerde de kullanabilirsin:
Bir tane touch screen uyugulaması yaptın ve bu uygulama için de bi tane touch screen kütüphanesi yazdın.Kütüphanenin buton_oluştur fonksiyonunu kullanarak bir buton oluşturdun.Şimdi butona tıklandığında ne olacağını nasıl belirtirsin?
Bu butonu oluşturan fonksiyonun bir parametresi de butona tıklandığında çağırılacak fonksiyonun adresi olur  tıklandığında da o fonksiyon çalışır.