Picproje Elektronik Sitesi

PROGRAMLAMA DİLLERİ => C/C++ => Konuyu başlatan: yldzelektronik - 23 Haziran 2016, 09:07:52

Başlık: C/C++ Tricks
Gönderen: yldzelektronik - 23 Haziran 2016, 09:07:52
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?
Başlık: Ynt: C/C++ Tricks
Gönderen: quarko - 23 Haziran 2016, 09:27:28
"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.
Başlık: Ynt: C/C++ Tricks
Gönderen: bocek - 23 Haziran 2016, 10:13:06
Şö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)

Başlık: Ynt: C/C++ Tricks
Gönderen: kantirici - 23 Haziran 2016, 11:46:52
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.
Başlık: Ynt: C/C++ Tricks
Gönderen: yldzelektronik - 24 Haziran 2016, 14:22:42
Merhaba,

sturct bit field ile yapmak daha uygun geldi.Global bir yapı tanımı işi baya kolaylaştırıyor.Teşekkürler.