Aynı fonksiyon içinde goto - label kullanımından haberim var.
#include <setjmp.h> kütüphanesindeki, LongJmp - SetJmp fonksiyonlarıyla iş göremedim. ( Bu benim beceriksizliğimde olabilir.)
Altdaki koddaki tarzda; Fonksiyonlar arasında sıçrama yapılabiliyor mu? Fonksiyonlar işlemci tanımlı ve kullanıcı tanımlı olabiliyorlar.
Yapmak istediğimi alt da kısaca kod halinde yazmaya çalıştım. Kodu düzenleyerek göstermeniz mümkünmüdür?
void CN_Interrupt() // işlemci giriş pin kesmesi interruptu.
{
...kodlar...
if(şartlar1) Atla_1;
...kodlar...
}
void TIMER1_Interrupt() // işlemci timer kesmesi interruptu.
{
...kodlar...
if(şartlar2) Atla_2;
...kodlar...
}
void Calis(void) // kullanıcı tanımlı yazılan fonksiyon.
{
...kodlar...
if(şartlar3) Atla_3;
...kodlar...
}
int main(void)
{
...kodlar...
while(1)
{
...kodlar...
...kodlar...
Atla_1:
...kodlar...
...kodlar...
Atla_2:
...kodlar...
...kodlar...
Calis();
...kodlar...
...kodlar...
Atla_3:
...kodlar...
...kodlar...
}
}
İki farklı fonksiyon var ve birinde etiket oluşturmuşsun ve o fonksiyon içinde dönsürürken başka bir fonksiyon çağırıp o fonksiyon içinde diğer fpnksiyondaki etiketleri çağırıyorsun. Bu sıkıntı yaratır diye biliyorum.
Bende lcd için Basic ten kalma alışkanlık Bi fonksiyon çağırıp o fonskiyon içinde etiketlere dallanıyorum fakat yanlış hatırlamıyorsam senin yaptığın gibi yapmaya çalıştığımda olmamıştı.
Bu yüzden programı yazarken ona göre akış belirlemelisin
mustafa_cmbz,
3 farklı fonksiyonum + Main() fonksiyonum var.
3 nün içeriği aynı. Etiket oluşturulan hangisi? Etiket ne?
İnterrupt ve fonksiyonlar içinde sadece bir/bir kaç değişkenin değerini değiştirin. Ana döngüde de bu değerlere göre diğer fonksiyonlara dallanın.
Durum makinası (state machine) konusunu inceleyiniz.
işlemci ucuz hafıza - kapasite ve hızı düşük.
dediğiniz tarzda-şekilde kod çok uzuyor, sığmıyor. çok karmaşıklaşıyor. her türlü senaryoya göre kod yazmak gerekiyor.
İyi bildiğiniz gibi; goto label ile aynı fonksiyon içinde istenilen yere dallanılabiliyor. olay karmaşıklaşmadan kolayca halledilebiliyor.
Bana herhangibir fonksiyon içinden, Main() fonksiyonu içindeki While() döngüsü içerisinde herhangibir yere atlayabileceğim bir yapı lazım.
#include <setjmp.h> kütüphanesindeki, LongJmp - SetJmp yapıları bu işi sağlamak içinmi verilmiş? İstediğimi yapabilecek yapılar bunlarmı?
state machine ne de bakarım, ama şimdi yoğunlaşmam gereken yer farklı ise, öncelikle ona bakmak isterim.
Mesela hangi mcu?
Microchip 30F2010 ve 30F2011 modelleri,
ucuz olanları, kullanabildiklerim ve minimum donanımları yeterli gelenler bunlar.
işlemi bunlarla yapmak zorundayım.
C dilinde bu türden bir işi yapabilecek anahtar kelimeler;
#include <setjmp.h> LongJmp - SetJmp mıdır? Araştırmam gereken kısım bunlarmı?
Başkada bir yere çıkan bir cevap bulamadım henüz. Her yerde bunlara atıf yapılmış.
Hala "state machine" konusunda ısrarcıyım. Bir yere sıçradığınızda geri döneceğiniz yeri bilmezseniz sıkıntılar çıkar. Mutlaka fonksiyon kullanınız.
yukarıda arkadaşların bahsettiği şekilde geri döneceğin yeri belirtmen lasım mantığı var
void main()
{
ok tuşuna basıldı ise fonksiyonu çağır
} // main son
fonksiyon()
{
menu1: // etiket ( basicten kalma alışkanlık... iki nokta ile belirtilen kısımlara etiket der idik )
çıkış tuşuna basıldı ise exit menuye git ve fonksiyon geldiği yere gitsin
ok tuşuna basıldı ise menu2' ye git gibi
goto menu1
menu2:
goto menu2
exıt_menu:
} // fonksiyon sonu
bende sizinle hem fikirim özellikle lcd lere menu yaparken çok anlaşılır ve pratik oluyor böyle fakat
başka bir fonksiyonda iken başka bir fonksiyon altında tanımladığın etikete dallanır isen orada işler karışıyor...
mustafa_cmbz, aynı fonksiyon içinde bir yere sıçramada kullanılan goto label den bahsediyorsunuz.
bundan haberim var ve kullanıyorum.
peki fonksiyonlar arasında sıçrama nasıl olacak.
sizin kodunuz üzerinden ilerlersek;
Void main() içine bir while() döngüsü ve bununda içerisine bir etiket koyalım ve
fonksiyon() adlı fonksiyonunuz içinden bu etikete sıçramaya çalışalım.
Bu iş nasıl olacak? Bunun yöntemi lazım bana.
Alıntı yapılan: mehmet - 14 Haziran 2024, 23:02:26Hala "state machine" konusunda ısrarcıyım. Bir yere sıçradığınızda geri döneceğiniz yeri bilmezseniz sıkıntılar çıkar.
Mutlaka fonksiyon kullanınız.
Hocam fonksiyon kullanmada sıkıntı yok. kullandığım bir yapıdır. fonksiyonla basitce makul şekilde olabilse fonksiyonla yaparım zaten.
fonksiyonun ilave kodların geçmediği kısımlar olabiliyor. Kısaca basit bir sıçrama yapmak gerekebiliyor.
Bilen varsa bir fonksiyon içinden Main() içindeki while() döngüsü içerisine sıçrama yöntemini birisi anlatabilirse sevinirim.
#include <setjmp.h> kütüphanesindeki, LongJmp - SetJmp bu yapıylamı yapılıyor? Başka yöntem varmı?
Birde bu geri dönme meselesi çıktı, buraya çok takılınılıyor, her yerde yazıyor bu geri dönülecek adres meselesi,
herkesde buna takıyor. 99 bin yerde goto; label; de sıkıntı geri dönülecek adresi tutmak bilmek lazım gibi.
Kullanıpda geri dönenide görmedim hiç. Yada bu tarz bir geri dönüş kullanımı varsada, benim onunla hiç işim yok.
Geri dönmeye çalışan yok. Geri dönüş yok. Hep ileri gitmek var. Arkama bile bakmayacağım.
Anlatımı çok basit, sıçra komutuna gelindiğinde, sıçranılacak yere gidilecek.
Ve sıçranılan yerden itibaren aşağıya doğru sırası ile komutlar-kodlar işletilecek.
Ne sıçra komutunun olduğu yerden sonraki blok içindeki kodlar, nede sıçranılan yerden önceki komutlar bir seferliğine işletilmeyecek.
geri dönüş olmayacak yani.
Aynen yukarıda mustafa_cmbz nin bahsettiği ve bilenen düz-klasik goto; ve label: ikilisi gibi olmalı.
Yalnız bunlar aynı blok-fonksiyon ({}) işerteleri içinde çalışır bize bunun gelişmiş modeli lazım. Farklı bloklar içinde çalışma ruhsatına sahip olmalı.
Bayram önü son gün, yokmu sevabına el atacak meseleye. Teşrik Tekbirleri sonrası hayır dua ediveririm.
CCS den anlamam ama basic de program yazarken GOSUB ile gönderilen alt programda (LABEL da) son satırına RETURN yazdığında geldiği GOSUB satırının hemen altına gelir oradan devam eder.
Muhtemelen aynı konuyu anlatan CCS ile ilgili :Bu forumdaki linki (https://www.picproje.org/index.php?topic=31938.0)
Yok sizde geri dönmeniz gereken yerin 1 satır altına döndünüz. Bir nevi alt programa git gel yaptınız. Geri dönmeye çalıştınız.
C de o işi donanım kesmeleri, yazılım kesmesi ve gerektiğinde kullanılan, kullanıcının yazdığı-oluşturduğu fonksiyonlar yapıyorlar.
Benim dediğimde geri dönüş yok. Aslında sanıyorum herhangibirşeyi çağırmakda yok denebilir galiba.
En azından C de yazılımda ben birşeyi çağırmayacağım, geri planda ben görmeden bir şey çağrılıyorsa bilemem.
Çok basit-sade şekilde, bir kelime ile yönlendirilip, direkt yönlendirilen yere git ve ordan program satırlarını koşturmaya devam et.
Anlatması çok basit. Ama henüz yapamadım.
Switch-case ile şartlarınıza göre ana döngünüzü yazın. Gerekli değişkeni de; interrupt, harici girişlerle değiştirirsiniz. Buna göre kodlar istediğiniz şekilde çalışır.
Interrut rutininden veya subritinden return kullanmadan ayrıldığınızda
stack taşması olur.
Ben bu tarz işlem gerektiğinde genelde byte cinsinden bayraklar tanımıyorum. Farklı fonksiyonlara da gitse bayrağa bakıp işlem yapıyorum.
Alıntı yapılan: mehmet - 15 Haziran 2024, 14:07:44Switch-case ile şartlarınıza göre ana döngünüzü yazın. Gerekli değişkeni de; interrupt, harici girişlerle değiştirirsiniz. Buna göre kodlar istediğiniz şekilde çalışır.
Böyle çalışır zaten, buna itiraz edemem. Bir şekilde yapılır edilir çalıştırılır. Yalnız ben bu şekilde yapmak istemiyorum.
Yada geçici olarak mecburen bu tarz klasik yöntemlerle yapsamda. Asıl olarak anlattığım tarzda nasıl yapıldığınıda öğrenip yapmak isterim.
Alıntı yapılan: sadogan - 15 Haziran 2024, 16:04:04Interrut rutininden veya subritinden return kullanmadan ayrıldığınızda stack taşması olur.
Bunların önlemini alıpda öyle sıçramayı planlıyorum. Yapmak istediğimle direkt alakalı olmadığından bu konuya girilmedi.
Donanımsal kesme interrupt-fonksiyonlarında çözüm çok kolay olur. İlgili flağı sıfırlar çıkarız. Kullanıcı tanımlı fonksiyonlarda ise gereken önlemler alınırdı. Fonksiyon ona göre tasarlanırdı.
Olmadı global değişkenlerle iş kotarılırdı. Öncelikli amaç önce yapmak istediğim kısım, sonrasında arıza çıkaran yerlere ayrıca bakılır.
Çözümü henüz bulamadık. Herkese Hayırlı Bayramlar Dilerim. Hoşcakalın.
C ile yazacaksanız Basic kodlama mantığını bırakmanız gerekmekte. Özellikle interrupt fonksiyonundan elinizi kolunuzu sallayarak çıkamazsınız.
Alıntı yapılan: mehmet - 15 Haziran 2024, 22:59:12C ile yazacaksanız Basic kodlama mantığını bırakmanız gerekmekte. Özellikle interrupt fonksiyonundan elinizi kolunuzu sallayarak çıkamazsınız.
Aynen öyle c de klasik bir durum var goto komutunu sevmez derler c ile yazanlar.
Ben Basic ten uzun yıllar sonra geçin ce epey sıkıntı yaşadım daha yeni yeni alışıyorum.
C de fonksiyon lar çok esnek kullanımı çok hoş hatta proton son versiyonların da da eklemişler fakat bir fonksiyon çağırdığını da başka bir fonksiyona yada fonksiyon altındaki etikete goto ile dallanıp işlem yapamıyorsun.
Çünki bir fonksiyonu çağırdığında iki parantez içindeki işlemi yapıp işlem bittiğinde geri parantez sonunda otomatik geri dönmesi bekleniyor. Sen o fonksiyon içinde başka bir fonksiyona dallanıp o dallandığın yerde işlem bittiğinde main'e nasıl dönecektim ben ya diyor anladığım kadarıyla bu gittiğin ve döneceğin yer burada ortaya çıkıyor işte.
Alıntı yapılan: mehmet - 15 Haziran 2024, 22:59:12C ile yazacaksanız Basic kodlama mantığını bırakmanız gerekmekte. Özellikle interrupt fonksiyonundan elinizi kolunuzu sallayarak çıkamazsınız.
İnterrupt fonksiyonunu içindeyken; fonksiyonun tam olarak kendiliğinden bitmesine müsade etmeden, yarım bırakıp nasıl çıkılabilir?
return; ile .
return ifadesiyle çıkılır çıkılmasına ama;
sıçrama yapmadan önce ve sonra, sanıyorum return iş görmez gibi duruyor.
sıçrama ve return ifadesi; ikisi peş peşe ve aynı anda kullanılamayacaktır.
Alıntı yapılan: mehmet - 15 Haziran 2024, 22:59:12C ile yazacaksanız Basic kodlama mantığını bırakmanız gerekmekte. Özellikle interrupt fonksiyonundan elinizi kolunuzu sallayarak çıkamazsınız.
bu kısmın tercümesini ben şöyle anladım;
interrupt fonksiyonu içindeki herhangibir yerden,
while() döngüsü içerisine, çok sert bir şekilde direkt olarak sıçrama yaparken;
hem düzgün bir şekilde intterrupt fonksiyonundan çıkılmalı, hemde yapılmak istenilen sıçrama işlemi layıkıyla yapılabilmeli.
Bu nasıl olacak peki? Henüz sıçrama faaliyetinin nasıl yapılacağı ortada yokken. Önce bir sıçrasaydık sonradan çıkacak problemlere bakılabilirdi.
SIÇRAMANIN NASIL YAPILDIĞINI, BEN ÖNCELİKLİ OLMAK ÜZERE, HENÜZ BİLEN ORTAYA KOYAN YOK. sıçrama yapılabileceğide kesin değil gerçi.
Rutin içinde sıçrama yapabilirsiniz ancak
RUTIN DIŞINA ÇIKMANIZA C İZİN VERMEZ.
break, continue komutları incelenebilir.
https://www.kadifeli.com/fedon/stdcprtr.php
Bu kısıma forum içi aratma ile ulaşamamıştım. Aratma kriterlerim yetersizde kalmış olabilir. webde aratınca karşılaştım.
https://www.picproje.org/index.php/topic,46931.45.html
Burada;
Z
nin sorduğu bir soruya,
bluekid
in verdiği cevapla,
mufitsozen
in de katkılarıyla,
Aradığım tarzda çözüme ulaştım. Kendilerine çok teşekkür ederim.
Daha öncesindeki aramalarımdada aynı ipucuna ulaşıyordum.
Bu konu benim açımdan kapanmıştır.
Yeri değil ama; çözüm üretenlerin ismini okuduğumda yokluklarına bir kere daha üzüldüm. Gerçekten foruma ekstra değer katan kendi alanlarında bilgi ve foruma destekleri ile yeri doldurulamayan üyelerdi. Yoklukları gerçekten üzücü :'(
OG,Müfit Sözen çok bilgili forum üyeleri idi Allah(C.C) onlara rahmet etsin.
Gerbay yine muazzam C ve elektronik bilgisine sahipti.Yazılım konusunda çok iddialı değilim ama onun yazdığı ufak bir kodu görünce ne kadar bilgili olduğunu hemen daha ilk satırlardan anlayabiliyordunuz.Bildiğim kadarıyla forumdan tüm mesajlarını silerek ayrılmıştı.Ne kadar büyük bir kayıp.
Yinede arada bir foruma şöyle bir bakıyordur sanırım .
Bülent Hoca da çok bilgili idi, yalnız biraz cümleleri karşıdakinin yanlış anlamasına sebep olabiliyordu. Şimdilerde mekatronik.org sitesine takılıyor.
Yine o forumda
@czorgormez in bu forumda da üye olduğunu ama topu topu 3-5 mesajının olduğunu gördüm.Diğer forumda 7-8 ayda 900 e yakın mesajı olmasına rağmen burada o kadar senede 3-5 mesajının olmasına sebep belli bir mesaj sayısına kadar yayınlanması için onay beklemesi olabilir
Yine mesela o forumda clc nickli yine çok bilgili bir başka arkadaş da var .Büyük bir firmanın AR-GE sinde çalışıyordu.
@czorgormez gibi elektronik bilgisi çok üst seviyelerdeki kişilerden onaylama zorunluluğunu kaldırılabiliyorsa kaldırılmalı bence