[Çözüldü]extern "C" void ve STM32 timer hesabı

Başlatan baran123, 23 Haziran 2015, 21:52:01

baran123

Timer ile uğraşıyorum.Takıldığım bir nokta var.Şu hesaplama ile ilgili bir şeyi kaçırıyorum.Daha önce kullandığımda not aldım şöyle bir şey yapmıştım.Bu örnekde bir hata var mı ? Birde 1 saniyelik kesme için bir örnek yazabilirseniz çok iyi olur.:)
timer3 için örnek olabilir.
(16bitlik timer - işlemci 48mhz de çalışıyor)
Period = (1/Clock)*(65535-sayi)*Prescaler
5 = 1/48Mhz * Y * 65535
0,00000002083 * 65535 * Y = 5
0,0013653125 * Y = 5
Y = 3662
sayi = 64803


Bir diğer sorum ise fonksiyonların başına gelen şu tanımı gördüm;
extern "C" void TIM2_IRQHandler(void){ ... }

"extern "C" "nedir ne iş yapar ?

justice_for_all

#1
stm32lerde benim bildigim timer degeri verilene ulastiginda kesme uretir .65535 ten cikarmana gerek yok formulde.
extern ifadesi ile tanimlanan bir degisken,fonksiyon diger kutuphane dosyalarinin icinde kullanilabilir.

mesela main.c dosyan var sen burda

extern uint8_t data; diye bisey tanimladin.bunu

benim.h veya benim.c kodunda kullanabilirsin tek yapman gereken kodunun icine

uint8_t data; tanimlaman gerek.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

baran123

#2
Hocam teşekkür ederim. Extern'ü biliyorum ama "C" ifadesini bilmiyorum.

mesaj birleştirme:: 23 Haziran 2015, 23:01:21

C++ ile derlenen programda fonksiyon implementasyonu bu şekilde belirtilirse derleyici bu kısmı C olarak derliyor.Sonucuna ulaştım.Doğru mudur acaba ?

justice_for_all

#3
Alıntı Yapextern "C" is meant to be recognized by a C++ compiler and to notify the compiler that the noted function is (or to be) compiled in C style.

Timer icin periyoda 48000 prescaler icin 10000 verip bi denermisin.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

mufitsozen

#4
sayin  @justice_for_all, yanlis bir cevap veriyorsunuz.

extern ile extern "C" iki farkli konudur.

simdi sayin @Baran Ekrem sizin sordugunuz sorudan anladigim kadari ile bir c++ compiler kullaniyorsunuz. C++ derleyicileri fonksiyon isimlerini "mangle" ederler (ezip, bozar). Bu yuzden c++ derleyicilerindeki modullerde  c derleyicisi ile derlenmis fonksiyonlari cagirmak isterseniz extern "C" ile bunu belirtirsiniz.

bkz: https://en.wikipedia.org/wiki/Name_mangling

mesaj birleştirme:: 23 Haziran 2015, 23:05:20

ben mesaj yazarken justice_for_all dogru cevabi belirtmis
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

justice_for_all

ben arkadasin extern "C" yi sordugunu sonra farkettim yalnis bilgi vermek istemem kimseye.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

baran123

Hmmm tamam.Hocam c++ derleyici kullanmıyorum da internette araştırırken karşıma çıktı merak ettim sağ olun.

justice_for_all

baran yukarida timer icin ornek degerler verdim onlari denermisin bi.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

baran123


justice_for_all

pardon prescaler 1000 olacak. 48000 * 1000 / 48000000 = 1 saniye
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

baran123

Tamam oldu :) Yani formül ;

Period * prescaler
-------------------
   Clock Speed

Oluyor o zaman ?

justice_for_all

Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

baran123

Bu kadar kolay olacağını sanmıyordum.Dün gece neredeyse bütün cebiri kullandım. :D
Teşekkürler :)

justice_for_all

kolay gelsin Egitimlerin guzel bu arada devamini bekliyoruz.
Deneyip de başaramayanları değil, yalnızca denemeye bile kalkışmayanları yargıla.   Gökhan Arslanbay

baran123

Sıfırdan düzenliyorum hepsini.Elimden geldiğimce paylaşmaya çalışacağım.Buralarda olun arada takılıyorum böyle . :)