C Dilinde Kullanılan Bazı Terimler¶
Burada C dilinde kullanılan bazı terimlerin nasıl kullanıldığını anlatmaya çalışacağım.
#include Preprocessor¶
#include terimi başka bir başlık dosyasının içeriğinin kaynak veya başlık
dosyasına dahil edilmesini sağlar. #include terimi ile sadece başlık
dosyalarını dahil etmeniz önerilir.
Bir başlık dosyasını #include direktifi ile dahil ettiğinizde, o başlık
dosyasındaki tüm deyim ve tanımlar dosyanıza dahil edilecektir. Bir başlık
dosyası başka bir başlık dosyasını dahil edebilir. Burada önemli olan nokta
içiçe başlık dosyalarını dahil etmemektir.
Elimizde 4 adet modul1, modul2, modul3 ve modul4 olarak adlandırılımış modüller olsun. Aşağıdaki şartlarda çalışması istenen bir projede başlık dosyalarını başlık dosyaları içinde dahil ederseniz bu yapıyı kuramazsınız. Başlık dosyaları içinde diğer başlık dosyalarını dahil ederseniz tüm modüller birbirine erişebilir durumda olacaktır ve hata ayıklamak zor olacaktır. Ayrıca derleme süreniz de uzayacaktır.
- Modul1; modul2’ye ve modul3’e erişebilsin, modul4’e erişemesin.
- Modul2; modul4’e erişşin, diğerlerine erişemesin
- Modul3; modul4’e erişsin, diğerlerine erişemesin
Ben kaynak dosyalarında şu sıra ile #include direktiflerini kullanırım.
- mikrodenetleyiciye ait başlık dosyaları
- Standard C kütüphaneleri başlık dosyaları
- Dahil edilecek diğer modül başlık dosyaları
- Kaynak dosyasına ait başlık dosyası
#define Preprocessor¶
#define terimi ile kodda kullanılacak koda özel tanımlamaları tanımlarız.
Bu terim ile tek bir değer tanımlamaktan makro fonksiyon tanımlamaya kadar
bir çok tanımlama yapabiliriz. Aynı zamanda farklı derleme modları için
tanımlama yaparak farklı çıktı üretebiliriz.
Örnek olarak bir projede iki adet baskı devre kartı yada sistem kurdunuz. Bir tanesinde LCD ekran ile direk bilgi alırken diğer kartta LCD ekran bulunmuyor. LCD ekran üzerinde hata ayıklama mesajları gösterirken aynı kodun LCD ekran olmayan test kartında da çalışmasını istiyorsunuz. Bunu yapmak için aşağıdaki gibi bir kod yazabiliriz.
Bu kod ile LCD_DEBUG tanımlamasını aktif ettiğinizde sonucunuz lcd ekrana
yazdırılırken, tanımlamayı deaktif ederseniz lcd ekrandan çıktı almazsınız.
volatile¶
C dilinde anlaşılması zor olan terimlerden birisidir volatile terimi.
Direk çevirisi uçucu olan bu terim bir çok hata(İng.bug)’nın ana sebebidir.
Kod normal çalışırken optimizasyon açıldığı anda düzgün çalışmamaya başlar
ise büyük ihtimal bir değişken volatile tanımlanması gerekirken
volatile olarak tanımlanmamıştır.
volatile değişken tanımlanırken kullanılan bir terimdir. Bu terim
derleyiciye tanımlanan değişkenin uçucu bir değere sahip olduğunu belirtir.
Peki nedir bu uçucu tanımı? Uçucu; değişkenin değerinin her an değişebileceği ve her seferinde yeni değerin kullanılması gerektiğini belirtir. Aşağıdaki kod üzerinde incelersek:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | volatile unsigned int flag;
void timer_ISR (void)
{
//....
flag = 1;
//....
}
void main (void)
{
//....
//....
if (flag == 1)
{
flag = 0;
//....
//....
}
//....
//....
}
|
timer_ISR() fonksiyonu bir zamanlama kesme fonksiyonu olarak çalışıyor.
Belirli bir zaman geçtikten sonra periyodik zamanlanmış görevlerin yerine
getirilmesi için flag değişkenine 1 değerini atıyor ve main fonksiyonu bu
değeri kontrol ederek zamanlanmış görevleri yerine getiriyor. Özellikle
birden fazla working register’a sahip işlemcilerde derleyiciler optimizasyon
esnasında değişkenleri working registerlarda saklamaya çalışırlar ve
gerekmedikçe RAM’den okuma yazma yapmazlar. Eğer derleyiciye flag
değişkenin uçucu olduğunu belirtmez isek main() fonksiyonu flag
değişkenine ait değeri working register’ına kopyalayacak ve tüm kontrolleri
working registerdaki değere göre yapacaktır. flag değişkeninin değeri
main() fonksiyonu haricinde bir yerde değiştirildiğinde main()
fonksiyonu değişkeni tekrar okuyarak kontrol etmediği için yapılan değişimin
bir etkisi olmayacaktır.
const¶
const constant kelimesinin kısaltması olarak yazılmış ve sabit anlamına
gelmektedir. const terimi derleyiciye tanımlanan değişkenin değerinin
değiştirilemeyeciğini belirtmektir. Her değiştirelemeyen değişken ROM üzerinde
tanımlanmaz. Çoğu durumda const ile tanımlı değişkenler RAM’de tanımlıdır.
static¶
static terimini Türkçe’ye sabit yada kalıcı olarak çevirebiliriz. C dilinde
static terimi kalıcı ve gizli görevlerini yerine getirir. Eğer bir fonksiyon
içinde statik değişken tanımlarsanız bu değişken fonksiyondan çıkıldığında
değerini muhafaze edecek ama o fonksiyon dışında erişilemez olacaktır. Eğer bir
fonksiyon veya genel değişken tanımında static terimini kullanırsanız bu
değişken veya fonksiyon diğer modüller tarafından ulaşılamaz olacaktır. Nesne
tabanlı programlama dillerindeki private terimine benzer bir kullanım söz
konusu olacaktır.