KEIL ile C++ Class Örneği(STM32)

Ana dosyamız olan main.cpp:

#include "STM32F4xx.h"
#include "mgbClass.h" //benim classim olur kendileri

void SystemInit(){
    (*((int*)0xE000ED88))|=0x0F00000;  // Floating Point donanimini aktiflestir. !!! Basimizin derdi !!!
    RCC->AHB1ENR |= 0x00000008;        // GPIOD donaniminin clock sinyalini uygulayalim        
    
    GPIOD->MODER = 0x55000000;         // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (Ledler bu pinlerde)
    GPIOD->OSPEEDR= 0xFFFFFFFF;        // GPIOD nin tum cikislari en yuksek hizda kullanacagiz
}

void DelayMs(unsigned int sayac); //olu zaman fonksiyonu

int main(){    
        MgbClass cikis;        
    
    while(1){
                cikis.KirmiziLedYak();     DelayMs(1000);
                cikis.MaviLedYak();         DelayMs(1000);
                cikis.SariLedYak();         DelayMs(1000);
                cikis.TuruncuLedYak();     DelayMs(1000);
    }  
}

void DelayMs(unsigned int sayac){
        unsigned int i=0;
    while(sayac--){
            for(i=0;i<2500;i++);
        }
}

Az önce dahil ettiğimiz mgbClass.h dosyası(mgb=Mustafa Gökhan Beken):

#include "STM32F4xx.h"
#include "GenericTypeDefs.h" //benim degiskenler için gerekli kütüphanem
//mgb: options for target kismindan path ayarlamazsan, include islemi yolu bulamaz, aklinda kalsin bu bilgi.

class MgbClass //sinif adi, MgbClass'dir
{
public:		
		MgbClass();	//constructor	yani hazirlik(yapici fonksiyon)
		~MgbClass();	//destructor yani yikici fonksiyon
		void SariLedYak();
		void TuruncuLedYak();
		void MaviLedYak();
		void KirmiziLedYak();		

private:
	
		uINT8 sari,turuncu,mavi,kirmizi;	
};

mgbClass.cpp dosyamızda sınıfımızın işlem yapan kısmı yer alıyor:

#include "mgbClass.h"

MgbClass::MgbClass(){ //Hazirlik yapiliyor
		sari=0x00001000;
		turuncu=0x00002000;
		mavi=0x00008000;
		kirmizi=0x00004000;
}	

MgbClass::~MgbClass(){ //Yokediliyor...
		GPIOD->ODR=0x00000000;
}	
		
void MgbClass::SariLedYak(){
	GPIOD->ODR=sari;			
}
void MgbClass::TuruncuLedYak(){
	GPIOD->ODR=turuncu;		
}
void MgbClass::MaviLedYak(){
	GPIOD->ODR=mavi;
}
void MgbClass::KirmiziLedYak(){
	GPIOD->ODR=kirmizi;			
}

Kendi değişken isimlendirme sistemim GenericTypeDefs.h:

typedef signed char 	INT8;
typedef unsigned char 	uINT8;

typedef signed short 	INT16;
typedef unsigned short	uINT16;

typedef signed int 	INT32; 	//typedef signed long int 	int32_t
typedef unsigned int 	uINT32;	//typedef unsigned long int 	uint32_t

typedef signed long long int	INT64;
typedef unsigned long long int 	uINT64;

typedef float	REAL32;
typedef double	REAL64;

 

Şimdi kodları açıklayalım:

#include “mgbClass.h”

class’ımızın header dosyasını çağırmamız şart, çünkü kodları farklı bir dosyaya yazdık. Bütün kodlar main.cpp’de olsaydı include etmeye gerek kalmayacaktı, ama class kullanmanın bir amacıda tekrar kullanılabilir kod yazmaktır. Aynı dosyayı başka bir projeye atıp kullanabilmek için her class’ı ayrı dosyada tutmakta fayda var.

MgbClass cikis;

Mevcut olan “MgbClass” adlı class’tan, “cikis” adlında bir nesne üretilmiş.

cikis.KirmiziLedYak();

cikis adlı nesnemizin KirmiziLedYak adlı metodunu çağırdık

public:
MgbClass(); //constructor   yani hazirlik(yapici fonksiyon)
~MgbClass();    //destructor yani yikici fonksiyon
void SariLedYak();
void TuruncuLedYak();
void MaviLedYak();
void KirmiziLedYak();

private:

uINT8 sari,turuncu,mavi,kirmizi;

Bir değişkenin veya bir fonksiyonun başında “public” varsa, o fonksiyona veya değişkene, farklı bir class‘tan ulaşılabilir.
public” yerine “private” yazsaydık, o değişken ya da fonksiyona, sadece tanımlandığı class‘ın içinden ulaşılabilecekti.
OOP dillerde, bunların dışında static, protected, extends şeklinde tanımlamalarda vardır, daha sonra değiniriz bunlara.

private: //buralar nedir
uINT8 sari,turuncu,mavi,kirmizi;
};

Bildiğiniz üzere uINT8 değişken türünü GenericTypeDefs.h dosyasında şu şekilde tanımlamıştık:

typedef unsigned char   uINT8;

o halde

uINT8 sari,turuncu,mavi,kirmizi;

satırı ile unsigned char türünde 4 adet değişken oluşturuyoruz zaten sizin sorduğunuz kısım burası değil başındaki “private:” kısmı.
Yukarda bahsettiğim gibi private olarak tanımlanan değişken veya fonksiyonlara sadece o class’tan ulaşabiliyoruz.
Örneğin burdaki “sari” adlı değişkene “MgbClass” adlı class’ın içindeki  “MgbClass“, “~MgbClass” “SariLedYak” ,”TuruncuLedYak“,”MaviLedYak“,”KirmiziLedYak” fonksiyonların herhangi birinden erişebilirim, zaten “MgbClass” adlı classtan erişmişim.
Ancak “main.cpp” dosyasından

cikis.sari=5

şeklinde erişemem, çünkü “sari” adlı değişken public değil private olarak tanımlandı.

MgbClass(); //constructor   yani hazirlik(yapici fonksiyon)
~MgbClass();    //destructor yani yikici fonksiyon

Constructor fonksiyonlar, classtan bir obje(nesne) yaratıldığı(hâşâ) pardon üretilmek istendiği zaman, nesne oluşturulmadan hemen önce kendi kendine çalışan fonksiyondur. Bu fonksiyonun içinde değişkenlere değer vermişiz. C++ dilinde constructor, class adı ile tanımlanır.
Destructor fonksiyonlar ise class‘tan bir nesne yokedildileceği zaman, yok edilmeden hemen önce kendi kendine çalışan bir fonksiyondur. Bu fonksiyonun adı, class adının başına tilde(~) koyularak elde edilir.

Fonksiyon tanımlamalarında dikkat edeceğimiz bir husus var.

void MgbClass::SariLedYak(){}

Burda göreceğiniz üzere class adını yazdıktan sonra iki adet noktalıvirgül yazıp fonksiyon adını yazıyoruz. “MgbClass” adlı class’a ait “SariLedYak” adlı fonksiyonumuzu oluşturduk.

Önemli bir konu daha var. Bir “C” programında direkt fonksiyon adını yazıp içi doldurulabilir. Ancak “C++” programlarında bir fonksiyon tanımlamadan önce, o fonksiyonun prototipini yazmamız gerekir.
mgbClass.h” adlı header dosyamızda, class‘ımızın prototip’ini yazdık. Bu dosyada sadece tanımlamalar vardır. Hiç kod yazmadığımız için kim nereye bağlı rahatça okunabilir.
mgbClass.h” adlı dosyamızı “main.cpp” dosyamızda include etmemiz, classı kullanabilmemiz için yeterli/gerekidir

 

Programı stm32f407vgt6 discovery kit için yazdım, kitteki 4 ledi, yaklaşık 1’er saniye aralıklarla yakıyor. Anlamadığınız yer olursa sorun.

Mustafa Gökhan BEKEN 20 Nisan 2014

5 thoughts on “KEIL ile C++ Class Örneği(STM32)

  1. HOCAM ÖNCELİKLE KONU BAŞLIĞINIZ İÇİN TEŞEKKÜR EDERİM. BEN STM32 SERİSİ AİLEYE BAŞLADIM ANCAK MIKROC DE SORUNLAR YAŞADIM HEMEN HERŞEYE HATA VERİYO YA DA ALGILAMIYO SONRA KEIL’E GEÇTİM FAKAT BU DAHA BETER ÇIKTI MESELA RCC->AHB1ENR İÇİN PATH YÜKLEMEM GEREKİYOR AMA BİR TÜRLÜ YAPAMADIM BANA ÖNERİNİZ NEDİR KEIL’DE DEVAM MI EDEYİM YOKSA FARKLI BİR COMPILER’A MI GEÇEYİM? SAYGILARIMLA.

  2. Keil, bilene güzel, daha çok uzman kişilere hitab ediyor. Nerdeyse herşeyi kullanıcıya bırakıyor ve ücretli. Bu yüzden coocox’a geçmiştim, gcc derleyicisi gayet güzel. Coocox ide’si java tabanlı olduğu için çok uyuz davranıyordu, en son em:blocks ide’sine geçtim bu ide de GCC derleyicisini kullanıyor yani ücretsiz ve çok kullanışlı, tavsiye ederim.

Bir Cevap Yazın