Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

C/C++ Tricks

Başlatan yldzelektronik, 23 Haziran 2016, 09:07:52

yldzelektronik

Merhaba,

Programcılıktaki bazı trickler konusunda tecrübelerinize başvurmak istiyorum.

Örneğin şuan bir hususta nasıl yapsam bilemedim dediğim bir noktadayım.

Bir proje için haberleşme alt yapısı hazırlıyorum.

Init etmem gereken hem mcu donanımı hem de external donanımlar var.Bunların init durumlarını (hata kodlarını ve durumlarını) güncel olarak bir değişkende tutmak ve ledler ile kullanıcıya göstermek istiyorum.

İlk etapta hata kodlarını tanımlamak için enum oluşturayım dedim. Oluşturdum. Değer atarken de garip bir şekilde enum değişkene or ile atama yaparım diye düşündüm.

Mesela
enum ErrorsStatus_Typedef{
	RfModule1_failed = 0,
	RfModule1_succes = 1,
	RfModule2_succes = 1,
	RfModule2_failed,

	NoConnectionWithBackSide,
	ConnectionSuccess,
	NoConnectionWithFrontSide,


}ErrorsStatus;


şeklinde bir kodlama oluşturdum. Bir de kalkıp ErrorsStatus |= RfModule1_failed; şeklinde bir atama yapmaya yeltendim.Ne büyük ayıp!

Ancak bu iş böyle yapılmaz, aşikar.Sizler bu tür durumlar için neler yapıyorsunuz.Cihazlarınızda hata kodlarını, durum raporlarını vs nasıl gösteriyorsunuz?
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.

quarko

"ConnectionSuccess" bir hata durumu olmadığı için onu enumeration dizisinin ilk elemanı olarak almalısınız. Bir ikincisi ErrorsStatus değişkeniniz tek değer alabileceği için rf module 1 ve 2 için ayrı error status larınız olmalı. Aynı anda hata durumu olduğunu varsayabilirsiniz bunun için. Bunun için typedef ile enumeration tanımlarsanız işinizi kolaylaştırabilir. Bir üçüncü olarak ta, mutlaka or layarak iş yapmalıyım diyorsanız, structure oluşturup bitlere bölmelisiniz. Ondan sonra mask layarak işlerini yapabilirsiniz.

Kolay gelsin.
"Aslanlar kendi hikayelerini yazmadıkça, avcıların kahramanlık hikayelerini dinlemek zorundayız."

bocek

#2
Şöyle yapabilirsiniz:
#define	RfModule1_state_bit 0
#define	RfModule2_state_bit  1

#define	NoConnectionWithBackSide _bit 2
#define	ConnectionSuccess_bit  3
#define	NoConnectionWithFrontSide_bit  4

#define setbit(var, bit) (var) |= (1 << (bit))
#define clearbit(var, bit) (var) &= ~(1 << (bit))
#define checkbit(var, bit) ((var) &= (1 << (bit)))

unsigned char errorstatus;


bu tanımlamaları yaptıktan sonra
örneğin RfModule2'nin durumunu öğrenmek istersek:

checkbit(errorstatus, RfModule2_state_bit)


örneğin ConnectionSuccess bitini hatalı (başarısız) olarak kaydetmek için:
clearbit(errorstatus,ConnectionSuccess_bit)


1 ya da 0. işte 'bit'ün mesele..

kantirici

#3
Ben genelde böyle kullanıyorum. Donanımın durumunu her an için saklayan global bir değişken tanımlarız ve enum veya define ile cihazın her durumu belirleriz.

Örneğin;

#define DEVİCE_READY   0
#define DEVİCE_RESET    1
#define DEVİCE_STATE1  2 .... gibi.

uint8_t device_status = DEVİCE_RESET;


Sonra cihazla ilgili ger işlemde device_status  değişkenine yeni durum yüklenir. Kontrol içinde if(device_status == DEVİCE_READY ) yapısı kullanılır.

Eğer aynı anda birden çok durum değişkeni tutulacaksa  struct ve bit field iş görecektir.

yldzelektronik

Merhaba,

sturct bit field ile yapmak daha uygun geldi.Global bir yapı tanımı işi baya kolaylaştırıyor.Teşekkürler.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.