Union ve struct

protech

Üye
Katılım
4 Ağu 2006
Mesajlar
52
Puanları
1
Yaş
39
Selam

Gömülü yazılım geliştirildiğinde kullanılan dilin özelliklerini iyi kavramak pratik kolaylıklar getirir.
C gömülü yazılımda tartışmasız bir fenomen.
Fakat bu dilin özelliklerini iyi bilirseniz faydalanabilirsiniz.
Bu güzel özelliklerden bir tanesi de union ve struct .

Aşağıda ki kodlar uzun uzun tip dönüşümleri yapmaya gerek kalmadan
eeprom'a bir struct verisini nasıl yazıp okunacağını gösteren bir örnek.

Normalde stm32 de bu örneği yapmayı düşünüyordum fakat herkesin aşina olduğu PIC bu konuda hiç karışıklığa sebep olmayacağını düşünüp PIC'i sectim.

Örnekte farklı veri tiplerini barındıran bir structer ve bu structer'in içine gömülü olduğu union tipi var.
Union tipi ile yazılacak ve okunacak iki variable oluşturulup birine değer atanıp eeproma yazılıyor, diğeri ilede veriler eepromdan çekiliyor.
Okuma ve yazma işlemi sırasında herhangi bir variable tip dönüşününe ihityaç söz konusu değil, dolayısı ile satırlarca koddan kurtulmuş olunuyor.

faydali olması dileğiyle

Kod:
#include <main.h>

//--------------- veri yapimiz
typedef struct
{
  char   c;
  int16  i16;
  int32  i32;
  float  f;
  char   s[16];
}TestStructTipi;

//---------------- union içinde gömülmüş veri
typedef union
{
   TestStructTipi Data;
   char bytes[ sizeof(TestStructTipi) ]; // Data'ya byte olarak ulasmak icin
}TestUnionTipi;


//----------------  degiskenleri tanımla
  TestUnionTipi Yazilan,Okunan;
  int16 i=0;
  char rec;
 //--------------------------------//
void main()
{ 
  
   mcu_init(); // donanımları init yap
   delay_ms(400);
  
   printf("test basliyor!\n\r");
  
   // yazilacak veri icerigini doldur
   Yazilan.data.c ='T'; 
   Yazilan.data.i16 = 65000;
   Yazilan.data.i32 = 1200000;
   Yazilan.data.f   = 3.14;
   sprintf(Yazilan.data.s,"*String veri!*");
  
   // okunacak veri icerigini sifirla
   Okunan.data.c=0;
   Okunan.data.f=0;
   Okunan.data.i16=0;
   Okunan.data.i32=0;
   Okunan.data.s[0]=0;
  
   //------------------//
   while(1)
   {
     printf("\n\r\n\rVerileri EE'dan oku/yaz ? (R/W)");
     rec=getc();
     putc(rec);
     if(rec=='R')
     {
       i=0;
       // Verileri oku
       while(i<sizeof(TestStructTipi)) {
          Okunan.bytes[i]= read_ext_eeprom(i);
          i++;
       }
      
       //okunan verileri yaz
       printf("\n\rOkunan char :%c",Okunan.Data.c);
       printf("\n\rOkunan int16 :%lu",Okunan.Data.i16);
       printf("\n\rOkunan int32 :%lu",Okunan.Data.i32);
       printf("\n\rOkunan Float :%f",Okunan.Data.f);
       Okunan.Data.s[15]=0;//Bos okumada 0xff okunur bu nedenle sfirliyoruz.
       printf("\n\rOkunan String :%s",Okunan.Data.s);
      
     }
     else if(rec=='W')
     {
       i=0;
       // Verileri yaz
       while(i<sizeof(TestStructTipi)) {
          write_ext_eeprom(i, Yazilan.bytes[i]);
          i++;
       }
      
       //okunan verileri yaz
       printf("\n\rYazilan char :%c",Yazilan.Data.c);
       printf("\n\rYazilan int16 :%lu",Yazilan.Data.i16);
       printf("\n\rYazilan int32 :%lu",Yazilan.Data.i32);
       printf("\n\rYazilan Float :%f",Yazilan.Data.f);
       printf("\n\rYazilan String :%s",Yazilan.Data.s);     
     }
   }//while
  
}//main

qPNp5q.png
 

Forum istatistikleri

Konular
128,125
Mesajlar
915,240
Kullanıcılar
449,837
Son üye
betül hüsrevoğlu

Yeni konular

Çevrimiçi üyeler

Geri
Üst