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
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