29 Kasım 2021, 21:12:07

Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H


Union Ve Struct

Başlatan PROTECH_, 23 Ocak 2016, 23: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 bytessizeof(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.='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(iYazilan.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 - 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 - 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 - berlin

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.