23 Şubat 2016 Salı

Gömülü Sistem II( C Programlama)


  • Eğer İnt main(void) ile başladı isek programı return 0 ile bitirme Nedenimiz Başta Bu Fonksiyon int döndürecek demişiz Hata Vermesin Diye Return 0 döndürüyoruz 
  • bolum = (float)bolunen / bolen;      Buradaki İşlem Cast İşlemi Dönüstürme İşlemidir
  • Dönüstrmede Dikkat!!      (DÜŞÜK) char <-> int <-> long <-> float <-> double (YÜKSEK)                               Çıkan sonucu, daha düşük bir değişken tipine atamaya kalkarsanız, o zaman veri kaybı yaşanır. Ve örneğin float 1.5 olan sonucu int değişkene 1.0 olarak kaydedilir.
  • if - else if merdiveni yukarda verdiğimiz örnekler için biçilmiş kaftandır. if - else if merdiveni, doğru bir şey bulduğu zaman kontrolu orada keser ve diğer koşulları kontrol etmeden blok sonlandırılır.

  • //while içinde 1 olduğundan sonsuza kadar döngü çalışır.
     while( 1 )


  •               , &&   ve , & ikiside oluyor fakat DİKKAT ---------!!!!!!                                                                                                                                                                                                                                                                                                                         ÖNEMLİ NOT: Özetle işlemlerinizi hızlandırmak istiyorsanız; AND kullanacağınız zaman, && operatörüyle çalışın ve yanlış olması         muhtemel olan koşulu sol tarafa koyun. Eğer OR operatörü kullanacaksanız, doğru olma ihtimali fazla olan koşulu, ifadenin soluna koyun ve operatör olarak || ile çalışın. Bu şekillde yazılan bir program, kısa devre operatörleri sayesinde, gereksiz kontrolden kaçınarak işlemlerinizi hızlandıracaktır                                                                                                                                                                               .
    Elbette & veya | operatörlerinin kullanılması gereken durumlarda olabilir. Her n'olursa olsun, koşulun iki tarafınında çalışmasını istiyorsanız, o zaman & ve | operatörlerini kullanmanız gerekmektedir.
  • .f veya .2f veya .3f veya .4f     bizim sayımızın vigülden sonra kac basamak gösterecegini belirtir  mesela .2f   virüglden sonra iki basamak gösterir
  • define ile  atama yaparız ...belli bi yerden sonra eger define geçersiz olsun istersek        #undef  ile iptal ederiz. ................... .  #ifdef (if defined - şayet tanımlandıysa) veya #ifndef (if not defined - şayet tanımlanmadıysa) operatörleri kullanılır.
  • Önemli Noktalar...

    Konuyu noktalarken, söylemek istediğim bazı şeyler bulunuyor. Olabildiğince, önişlemci komutlarından - #include komutu hariç - uzak durun. Çünkü bu komutlar, esnek bir yapıya sahip değiller ve bu durum, bir noktadan sonra başınızı ağrıtacaktır. Önişlemci komutlarıyla yazılmış kodları takip etmek oldukça zordur ve debug edilemezler. Java gibi gelişmiş dillerde, #define komutu bulunmaz. Modern dillerde, bu yapıdan uzaklaşılmaya başlanmıştır.

  • Bellekleme :
























  • Değişken: Deger Tutar    Pointer : Adres Tutar      Pointer önüne *alır ...Float Bir değişken int bir pointera işaretlenemez ....pointerın içini okumak için  *p ile olur... Bir Degiskenin Adresini Pointera atarken degiskenin başına & koyulur


int a=10,b;

int *p;




p=&a;   //tutuldugu adresi atadık 

printf("Pointer %d \n",p);

printf("Anın Degeri %d \n",a);

b=*p;

    printf("B nin Degeri %d \n",b);




& ADRES ATAR

* İÇERİK OKUR



  • . Eğer, pointer işaret eden bir pointer'i işaret edecek bir pointer tanımlamak istiyorsanız, üç defa yıldız ( *** ) yazmanız gerekir


int x=100;
int *p,**r,***s;

printf("X in İlk Değeri  %d \n",x);
p=&x;
r=&p;
s=&r;
***s=9999;

    printf("X in Son Değeri  %d \n",x);       



ARTIK X in Degeri 9999 oldu





Dizilerdede Benzr Durum vardır   dizinin 0.elemanı     *(ptr +0)   dır....5.eleman mesela *(ptr+4)   dür 




  • ÖNEMLİ: Fonksiyonla Sadece Bir Deger Degilde Birden Fazla Deger Döndüreceksek Bunu degiskenlerle yapmak zor cünkü RETURN sadece Bir Deger Döndürür oyüzden Referansla Arguman Aktarmamız Gerekir  
örnegin:Bölme işlemi Yapacak Bir Fonksiyon Bize Bölüm ve Kalan Olmak üzere İki Deger Döndürecek oyüuzden ..Referans yoluyla argün aktarmalıyız ...


#include
int bolme_islemi( int bolunen, int bolen, int *kalan )
{
 *kalan = bolunen % bolen;
 return bolunen / bolen;
}
int main( void )
{
 int bolunen, bolen;
 int bolum, kalan;
 bolunen = 13;
 bolen = 4; 
 bolum = bolme_islemi( bolunen, bolen, &kalan );
 printf( "Bölüm: %d Kalan: %d\n", bolum, kalan );
 
 return 0;
}






  • Biz Her Zaman Fonksiyonu main in üstüne Yazarsak Bi süre Sonra Main Fonksiyonu Kodlar altında kaybolur..oyüzden mainin altındada fonksiyon tanımlanabilir Sadece En üstte fonksiyonu tanımlarız bu kafidir

#include
int bolme_islemi( int, int, int * );     //DİKKAT ........!!!!
int main( void )
{
 int bolunen, bolen;
 int bolum, kalan;
 bolunen = 13;
 bolen = 4; 
 bolum = bolme_islemi( bolunen, bolen, &kalan );
 printf( "Bölüm: %d Kalan: %d\n", bolum, kalan );
 
 return 0;
}
int bolme_islemi( int bolunen, int bolen, int *kalan )
{
 *kalan = bolunen % bolen;
 return bolunen / bolen;
}



  • Dinamik Bellek Yönetimi Malloc ve Callocla Yapılır..bunun icin #include eklenmeli programımıza 

calloc ile malloc farkı calloc olusturdugu alanlara hep 0 degerini atar..fakat malloc hic bir deger atamaz  kullanımları ise 



isaretci_adi = calloc( eleman_sayisi, her_elemanin_boyutu ); 



isaretci_adi = malloc( eleman_sayisi * her_elemanin_boyutu ); 


en sonunda free(dizi) deyip alanları boşaltıyoruz 



Hafıza alanı ayırırken bazen bir problem çıkabilir. Örneğin bellekte yeterli alan olmayabilir ya da benzeri bir sıkıntı olmuştur. Bu tarz problemlerin sık olacağını düşünmeyin. Ancak hafızanın gerçekten ayrılıp ayrılmadığını kontrol edip, işinizi garantiye almak isterseniz, aşağıdaki yöntemi kullanabilirsiniz:
 dizi = calloc( eleman_sayisi, sizeof( int ) );
 // Eger hafiza dolmussa dizi pointer'i NULL'a 
 // esit olacak ve asagidaki hata mesaji cikacaktir.
 if( dizi == NULL )
  printf( "Yetersiz bellek!\n" );



  • C de String Atamak KATAR demektir atamasını ise char isim[30] şeklinde yaparız burada 29 karakter alır.en son karakter otomatik \n dir bu sonu gösterir            Daha Fazla Karakter almak ve boşluk bırakınca yazmayı bırakmamamsı icin get ve puts kullanırız.



  • Yeni Degişken Tipi Oluşturma  ENUM ile 
enum ana_renkler {
  Kirmizi,
  Mavi,
  Sari
 };

 // Degiskeni tanimliyoruz.
 enum ana_renkler piksel;

 // Degisken degerini Mavi olarak belirliyoruz.
 // Dilersek Sari ve Kirmizi da girebiliriz.
 piksel = Mavi;


///ana_renkler   SANKİ İNTEGER      PİKSEL ise Degisken adı  mesela X gibi    
İNTEGERA verilebilecek degerler ise kırmızı mavi sari 




DEGİŞKEN ADI DEGİSTRME : TYPEDEF


her seferinde int yazmak istemiyoruz örneğin sadece x deyince anlaşılsın istiyoruz ozmn typedefle degistiririz...

typedef int  i ;
i    sayi=5       diyerek   artık int demeden   sadece i diyerek  degiskeni tanımlayaibiliriz 








  • Structlar ile bilgileri gruplaya biliriz örnegin bir kişi oluştur telefonu adresi yaşını yaz gibi...

    struct {                                                                                                                                                                                                                                                                       
    int tel;                                                                                                                          int yas} kisi ;



#include
int main( void )
{
 struct {
  int yil;
  int ay;
  int gun;
 } siz, kiz_kardes, erkek_kardes;

 printf( "Doğum gününüzü giriniz> ");
 scanf( "%d-%d-%d", &siz.gun,
    &siz.ay,
    &siz.yil );
 printf( "Kız kardeşiniz> " );
 scanf( "%d-%d-%d",  &kiz_kardes.gun,
    &kiz_kardes.ay,
    &kiz_kardes.yil );
 printf( "Erkek kardeşiniz> " );
 scanf( "%d-%d-%d",  &erkek_kardes.gun,
    &erkek_kardes.ay,
    &erkek_kardes.yil );
 return 0;
}



      İÇ İÇE STRUCT yapıları kullanabiliriz ..mesela kişi oluşturup içinde dogum gününü tutabiliriz             



#include
int main( void )
{
 struct {
  char isim[40];
  int boy;
  struct {
   int yil;
   int ay;
   int gun;
  } dogum_bilgileri;
 } kisi;

 printf( "Adınız: " );
 scanf( "%s", kisi.isim );
 printf( "Boyunuz: " );
 scanf( "%d", &kisi.boy );
 printf( "Doğum tarihi: ");
 scanf( "%d-%d-%d",  &kisi.dogum_bilgileri.gun,
    &kisi.dogum_bilgileri.ay,
    &kisi.dogum_bilgileri.yil );

 printf( "Girilen bilgiler:\n" );
 printf( "İsim: %s\n", kisi.isim );
 printf( "Boy: %d\n", kisi.boy );
 printf( "Doğum tarihi: %d/%d/%d\n",  kisi.dogum_bilgileri.gun,
      kisi.dogum_bilgileri.ay,
      kisi.dogum_bilgileri.yil );
 return 0;
}












  • STRUCT İLE FUTBOLCU OLUŞTURMA 



#include
int main(void)
{
struct {
char ad[50];
int yas;
struct{
int hiz,guc;
char ayak[20];
}yetenek;
}oyuncu={"ali",66,{2,4}};
printf("Adi %s ",oyuncu.ad);
printf("yas %d ",oyuncu.yas);
printf("Hiz %d ",oyuncu.yetenek.hiz);
}











  Cagaty Cebi 3.sayfa Devam Edilecek



ardına  deitel c 


sonra ise eren bastürk ve ahmet arif balık 

arm programlaması   






























                                İLERİ    C 
  • veri tiplerini gömülü sistemlerde ASLA KULLANMAYIN. Aklınızdan iki soru geçti hemen… Birincisi “niye?”, ikincisi “ne kullancaz o zaman?”. İkisine de nedenleriyle cevap vermeye çalışacağım.Çünkü standard veri tiplerinin boyutu platform bağımlıdır. Ne demek istiyorum? Örneğin X mikrokontrolöründe int veri tipi 2 byte iken, Y mikrokontrolöründe int veri tipi 4 byte olabilir. Yine Z mikrokontrolöründe int veri tipi 8 byte olabilir ve eşşeğin kulağına su kaçırabilir. Örneğin sizin bilgisayarlarınızda muhtemelen int 8 byte olacaktır. Bunun sebebi işlemcinin adres yolunun genişliğinin platformdan platforma farklı olabilmesidir. Bu kavram “void*” veri tipinde daha detaylı anlatılacaktır. Ancak şu söylenebilir ki 32-bit’lik platformlarda int veri tipi 32 bit yer kaplar ki bu da malumunuz 4 byte’a tekabül eder. Benzer şekilde 64 bitlik sistemlerde int 8 byte yer kaplar. 
  • Gömülü sistemlerde, belleğin bilinçli şekilde kullanılabilmesi çok önemlidir. Programın bellek kullanımının platformdan platforma değişmemesi ise, bir çok hatanın önüne geçmemizi sağlar
  • int8_t ,int16_t,int64_t  Hangi Platforma Gidersen Git Bunların Kapladıgı Bellek Sabittir 
  •  kod derlendiğinde kodun işletilecek olan kısmı ile, değeri sabit olan değişkenler flash’a atılır. Değişecek değişkenler, fonksiyon stack’leri ise ram’de tutulur.



  • Macar notasyonu (Hungarian Notation) der ki değişkenin ismini öyle güzel yaz ki hem derdini anlatsın hem de tipini.
  •  Değişkenin adını uzun yazmakta bir sakınca yoktur. Derleyici zaten derleyince onu adrese dönüştürecektir. Bir harfle isimlendirilen değişken de, uzunca ismi olan değişken de tipi aynı olduğu takdirde aynı miktarda yer kaplayacaktır.
  • 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /*Asagidakilerin hepsi PORTB'nin 3. bitini 0'a çeker.Bu işlem gerçekte PIC mikrodenetleyicilerde B portunun 3 pinini lojik sıfıra çeker, yani o pinde 0V görülür. */
    PORTB = PORTB & 0b11110111;
    //ya da ayni sey:
    PORTB = PORTB & 0xF7;
    //ya da ayni sey:
    PORTB &=  ~(1<<3);
    //ya da macro yazalim yine ayni sey
    #define CLEAR_BIT(DATA,BIT_INDEX) do(DATA&= ~(1<
    CLEAR_BIT(PORTB ,3);






    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /*Asagidakilerin hepsi PORTB'nin 3. bitini 1'e çeker.Bu işlem gerçekte PIC mikrodenetleyicilerde B portunun 3 pinini lojik bire çeker, yani o pinde 5V görülür. */
    PORTB = PORTB | 0b00001000;
    //ya da ayni sey:
    PORTB = PORTB & 0x08;
    //ya da ayni sey:
    PORTB |=  (1<<3);
    //ya da macro yazalim yine ayni sey
    #define SET_BIT(DATA,BIT_INDEX) do(DATA|= (1<
    SET_BIT(PORTB ,3);



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /*Asagidakilerin hepsi PORTB'nin 3. bitini tersler.Bu işlem gerçekte PIC mikrodenetleyicilerde B portunun 3 pin lojik birde ise bu pini lojik sıfıra çeker, yani o pinde 5V varken artık 0V görülür. Benzer şekild epin lojik sıfırda ise bu pini lojik bire çeker, yani o pinde 0V varken artık 5V görülür  */
    PORTB = PORTB ^ 0b00001000;
    //ya da ayni sey:
    PORTB = PORTB ^ 0x08;
    //ya da ayni sey:
    PORTB ^=  (1<<3);
    //ya da macro yazalim yine ayni sey
    #define TOGGLE_BIT(DATA,BIT_INDEX) do(DATA^= (1<
    TOGGLE_BIT(PORTB ,3);







    ;

Share: