Union Ve Struct

Başlatan PROTECH_, 23 Ocak 2016, 20:16:50

PROTECH_

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

#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



Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

birkan

Güzel bir örnek olmuş elinize sağlık. Benim de arduino ile yapmam gerekiyordu aynı işi.

PROTECH_

Eyv.
Bu bir tanesi, uzerine biraz dusunup veri aktarimi olan herseye adapte edilebilir bir yontem bu.
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN

yldzelektronik

@PROTECH_ güzel örnek teşekkürler.

Struct ile haberleşme ile alakalı @gerbay bir zamanlar birşeyler söylemişti. Bununla ilgili örnek var mı verebileceğin?

Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

PROTECH_

@yldzelektronik eyv.

Soyle dusunebilirsin, mesela iki islemciyi uart ile haberlestirmek istiyoruz.
Bu durumda gonderilecek ve alinacak datalar icin ortak bir  "veriler.h" dosyasi olusturdugumuzu varsayalim.
Boylelikle iki islemci ne alip verecegini bilmis olacak.
Geriside yukaridaki ornekte yer alan  read_ext_eeprom yerine getch(), write_ext_eeprom yerine putch() fonksiyonlarini koymak gibi basit.
Multi-Core ,RTX,ThreadX, FreeRTOS, MODBUS  RTOS - Electronic-Hardware -- BERLIN