Bit Tanımlama Hkn.

Başlatan Pyrodigy, 24 Ocak 2018, 15:27:11

Pyrodigy

Merhaba arkadaşlar. CCS ve dolayısı ile C diline yeni alışmaya başlıyorum. Uzun yıllar ASM den sonra C dilinin esnekliği beni çok şaşırttı ve hayran kaldım. ASM de bit tanımlamasını kısıtlı imkanlar ile yapabiliyor iken C dilinde önüme birçok seçenek çıkıyor. Öyle ki Aşağıda ki bit tanımlaması kitaba göre aynı gözüksede değerli tecrübelerin yorumlarından yararlanmak istiyorum. Derleyici bu iki tanımlamayı gördüğünde nasıl davranır ? ve
Bu iki tanımlama nın birbirinden ayıran temel özellik nedir ?
Saygı ve sevgilerimle
// ADRES FLAG
unsigned int16	AdresFlags; // Adres
#bit  Adres1 = AdresFlags.0
#bit  Adres2 = AdresFlags.1
#bit  Adres3 = AdresFlags.2
#bit  Adres4 = AdresFlags.3
#bit  Adres5 = AdresFlags.4
#bit  Adres6 = AdresFlags.5
#bit  Adres7 = AdresFlags.6
#bit  Adres8 = AdresFlags.7
#bit  Adres9 = AdresFlags.8
#bit  Adres10 = AdresFlags.9


ile

struct{
unsigned char  Adres1:1;
unsigned char  Adres2:1;
unsigned char  Adres3:1;
unsigned char  Adres4:1;
unsigned char  Adres5:1;
unsigned char  Adres6:1;
unsigned char  Adres7:1;
unsigned char  Adres8:1;
unsigned char  Adres9:1;
unsigned char  Adres10:1;
}AdresFlags;
Persistance is the name of the game in this business....

quarko

Alttaki structure ansi c uyumlu bir kod parçasıdır. İstediğiniz yerde kullanabilirsiniz. Ama üstteki ansi c uyumlu değildir. Derleyicilere özel bir tanımlamadır. Birde char türünden bir değişkende 8 adet bit tanımlanabilir. Bilginiz olsun. O yüzden alttaki unsigned char değişken tipi yerine unsigned int kullansanız daha doğru olur. Hatta bunların yerine uint8_t, int8_t,uint16_t, int16_t,uint32_t, int32_t gibi standart değişken tipi tür tanımlamalarını kullanırsanız, yazdığınız kod taşınabilirlik noktasında daha iyi olacaktır.
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

Salih

Birinci durum için bellek kullanımı şu şekilde oluyor
020-021 AdresFlags
020.0   Adres1
020.1   Adres2
020.2   Adres3
020.3   Adres4
020.4   Adres5
020.5   Adres6
020.6   Adres7
020.7   Adres8
021.0   Adres9
021.1   Adres10



ikinci durum şu şekilde kullanılabiliyor.
Bellekte yine 2 bayt ayrılıyor.
Yani ikisi de aynı gibi.


#include <16F877.h>


struct AdresFlags{
unsigned char  Adres1:1;
unsigned char  Adres2:1;
unsigned char  Adres3:1;
unsigned char  Adres4:1;
unsigned char  Adres5:1;
unsigned char  Adres6:1;
unsigned char  Adres7:1;
unsigned char  Adres8:1;
unsigned char  Adres9:1;
unsigned char  Adres10:1;
};


struct adresflags adresbayrak;
Void Main()
{ 
  adresbayrak.Adres1 =1; 
 }

ledavrupa


Pyrodigy

İlginize teşekkürler.
Peki şu kodda ilgili bitleri OR işlemi ile işaretlemek istediğimde 
void TEST(void)
{
static unsigned int16 ADRESDATA_READ=0;  //ADRES TUS DATA SPI READ
// porttan okuma işlemi gerçekleştikten sonra ADRESDATA_READ ya aktarılan bilgi
         AdresFlags ^= ADRESDATA_READ; // or işlemi (+)
}

1. örnekte hata vermezken, 2. tanımlama örneğinde hata veriyor. Neden ? ?
Not: Bu arada 8 bitlik pic16f1526 kullanıyorum.

main.h dosyasında bulunan 10 bitlik tanımlama örneklerini tekrar yazıyorum.

1. Örnek

unsigned   int16 AdresFlags; //Adres Bayrağı bitleri
#bit  Adres1 = AdresFlags.0
#bit  Adres2 = AdresFlags.1
#bit  Adres3 = AdresFlags.2
#bit  Adres4 = AdresFlags.3
#bit  Adres5 = AdresFlags.4
#bit  Adres6 = AdresFlags.5
#bit  Adres7 = AdresFlags.6
#bit  Adres8 = AdresFlags.7
#bit  Adres9 = AdresFlags.8
#bit  Adres10 = AdresFlags.9


ve

2. Örnek
struct {
unsigned   int8 Adres1:1;
unsigned   int8 Adres2:1;
unsigned   int8 Adres3:1;
unsigned   int8 Adres4:1;
unsigned   int8 Adres5:1;
unsigned   int8 Adres6:1;
unsigned   int8 Adres7:1;
unsigned   int8 Adres8:1;
unsigned   int8 Adres9:1;
unsigned   int8 Adres10:1;
}AdresFlags={0,0};
Persistance is the name of the game in this business....

Salih

Kendime göre yorumum,


Birincisin de iki adet 16 bitlik sayı üzerinde işlem
yapılıyor ve doğal olarak hata vermiyor.


İkincisinde 16 bitlik sayı ile Struct yapılı değişken üzerinde
işlem yapmak istediğiniz için tip uyumsuzluğu oluyor.