non-reentrant function hatası nasıl düzelir?

Başlatan fatal1ty, 26 Ekim 2008, 15:23:48

fatal1ty

Arkadaşlar selamlar, timer kesmesinin içinde lcd yaz fonksiyonunu çağıramıyorum...
şu hatayı alıyorum;
Error[472]   : non-reentrant function "_lcd_write" appears in multiple call graphs: rooted at "_kesme" and "_main"

yardımınızı bekliyorum...

3ddark

_lcd_write fonksiyonunu ana programda kullandıgın için öyle bir hata veriyor benimde daha önce başıma geldi lcd write fonksiyonunu başka isimle kopyala ve kopya olan fonksiyonu cagır problem düzelir.

Örnek

main
{
   lcd_write(c);
}

interrupt
{
  lcd_write_k(c);
}
Yapılacak çok şey var

fatal1ty

İlginiz için çok teşekkür ederim, sorunu çözdüm ama neden böyle bişey yaptığı kafama yatmadı :roll:

controller

bir fonksiyona aynı anda iki yerden çağrı yapılmasından kaynaklanıyor.
Hesabım OG tarafından haksız bir şekilde pasif yapılmıştır.

arslan74

Problemi sorunsuz çözmenin bir kaç yolu var.

- Mesela kesme altında ekrana birşey yazmassın. ekrana mesaj yazmasını gerektiğini belirten bir flag tanımlarsın ve mesajı tutan birde yazı dizi tanımlarsın. ekrana yazmak istediğin mesajı bu yazı dizisine atarsın ve flag registerini set edersin. Ana programda sürekli bu flagı kontrol edersin. Eğer set edilmiş ise ekrana mesajını yazarsın.

- Yada tersini de yapabilirsin. Sadece kesme programı altında ekrana birşeylerde yazabilirsin. Ama onu pek önermiyorum. Pek cok başka problemleri ortaya cıkartır.

- Aynı işi yapan iki farklı fonksiyon kullanmanız da pek sağlıklı bir çözüm değil. Bu iki fonksiyonun çakışma riski yüksek o zamanda ekrana hatalı birşeyler yazar. Yada daha kötüsü LCD yi kilitler ve ekran çalışmaz.

Bu yüzden sana en basid ve içlerinde en sağlıklı önerim ilk seceneği kullanmanız yönünde olacaktır.

Selamlar