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
(http://i.hizliresim.com/qPNp5q.png) (http://hizliresim.com/qPNp5q)
Güzel bir örnek olmuş elinize sağlık. Benim de arduino ile yapmam gerekiyordu aynı işi.
Eyv.
Bu bir tanesi, uzerine biraz dusunup veri aktarimi olan herseye adapte edilebilir bir yontem bu.
@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?
@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.