working example -> tested on shell C++

master
edwin 4 years ago
parent 1a5cf76def
commit 1ff6863dd5

@ -34,22 +34,17 @@ struct BitField
BitField& operator =(T v)
{
/*
// this step can be optimised for systems that support bitbandalias
T mask = ((1ULL << SIZE)-1) << START;
_raw &= ~mask;
_raw |= ((v & ((1ULL << SIZE)-1)) << START);
#if 0
_raw = ((v & ((1ULL << SIZE)-1)) << START);
return *this;
*/
#else
//_raw & ~(((1ULL << SIZE)-1) << START);
//#ifdef old
//TODO: test = problem with |= instead of =
// mask creation for v : https://stackoverflow.com/questions/1392059/algorithm-to-generate-bit-mask
// use bit band alias if system permits
_raw = ((v & ((1ULL << SIZE)-1)) << START) | (_raw & ~(((1ULL << SIZE)-1) << START));
return *this;
//#endif
#endif
}
/**
@ -80,18 +75,18 @@ union Reg_Control
{
// bit 4
struct POWER_DEV{
typedef BitField<uint8_t, 4, 1> Bits;
typedef BitField<uint8_t, 7, 1> Bits;
enum{TURN_OFF = 0, TURN_ON = 1};
};
// bits 2-3
struct SPEED{
typedef BitField<uint8_t, 2, 2> Bits;
typedef BitField<uint8_t, 0, 2> Bits;
enum{STAND_STILL = 0,
SLOW = 1,
NORMAL = 2,
FAST = 3};
};
struct Bits{
union Bits{
Reg_Control::POWER_DEV::Bits POWER_DEV;
Reg_Control::SPEED::Bits SPEED;
} bits;
@ -107,15 +102,23 @@ int main()
{
Reg_Control reg;
reg.bits.SPEED = Reg_Control::SPEED::FAST;
//reg.bits.SPEED = Reg_Control::SPEED::FAST;
reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON;
std::cout << +reg.raw << std::endl;
reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF;
std::cout << +reg.raw << std::endl;
reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON;
reg.bits.SPEED = Reg_Control::SPEED::SLOW;
std::cout << +reg.raw << std::endl;
reg.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF;
reg.bits.SPEED = Reg_Control::SPEED::FAST;
std::cout << +reg.raw << std::endl;

Loading…
Cancel
Save