From 86caa99e8df714a22f16507ea5cb6dc19b6de729 Mon Sep 17 00:00:00 2001 From: polymurph Date: Sun, 11 Jul 2021 10:56:10 +0200 Subject: [PATCH] solved = problem + readout problems of bitfield --- .../example_project/driver/device.cpp | 26 +++++++++++++++--- .../example_project/driver/device.hpp | 4 +++ .../example_project/main.cpp | 3 ++ CPP/register_modeling/example_project/runtest | Bin 17896 -> 18056 bytes .../example_project/utils/BitField.hpp | 20 +++----------- .../portable_bitfields/BitField.h | 13 +++++++-- 6 files changed, 43 insertions(+), 23 deletions(-) diff --git a/CPP/register_modeling/example_project/driver/device.cpp b/CPP/register_modeling/example_project/driver/device.cpp index f160b78..06f4851 100644 --- a/CPP/register_modeling/example_project/driver/device.cpp +++ b/CPP/register_modeling/example_project/driver/device.cpp @@ -11,7 +11,8 @@ Device::Device() : reg_control.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_OFF; reg_control.bits.SPEED = Reg_Control::SPEED::STAND_STILL; - std::cout << +reg_control.raw << std::endl; + std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl; + std::cout << "SPEED = " <<+reg_control.bits.SPEED << std::endl; } void Device::doSomething() @@ -19,14 +20,31 @@ void Device::doSomething() std::cout << "Device::doSomething()" << std::endl; reg_control.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON; - reg_control.bits.SPEED = Reg_Control::SPEED::NORMAL; + reg_control.bits.SPEED = Reg_Control::SPEED::FAST; if(reg_control.bits.POWER_DEV == Reg_Control::POWER_DEV::TURN_ON){ std::cout << "device turned on!" << std::endl; } std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl; - std::cout << "SPEED = " <<+reg_control.bits.SPEED << std::endl; + std::cout << "SPEED = " << +reg_control.bits.SPEED << std::endl; - std::cout << +reg_control.raw << std::endl; + std::cout << +reg_control << std::endl; + + reg_control = 0; + + std::cout << +reg_control << std::endl; + + std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl; + std::cout << "SPEED = " << +reg_control.bits.SPEED << std::endl; + + //reg_control.bits.SPEED = Reg_Control::SPEED::FAST; + reg_control.bits.POWER_DEV = Reg_Control::POWER_DEV::TURN_ON; + + std::cout << "POWER = " << +reg_control.bits.POWER_DEV << std::endl; + std::cout << "SPEED = " << +reg_control.bits.SPEED << std::endl; + + + + } \ No newline at end of file diff --git a/CPP/register_modeling/example_project/driver/device.hpp b/CPP/register_modeling/example_project/driver/device.hpp index 08efb7c..32f4689 100644 --- a/CPP/register_modeling/example_project/driver/device.hpp +++ b/CPP/register_modeling/example_project/driver/device.hpp @@ -65,6 +65,10 @@ class Device uint8_t raw; // union Ctor with default value set to 0x00 Reg_Control(uint8_t v = 0x00) : raw(v) {} + // raw value extraction of register + operator uint8_t() {return raw;} + // used for updating software immage of hardware register + void operator = (uint8_t v) {raw = v;} }; Reg_Control reg_control; diff --git a/CPP/register_modeling/example_project/main.cpp b/CPP/register_modeling/example_project/main.cpp index 54a3903..ab862ce 100644 --- a/CPP/register_modeling/example_project/main.cpp +++ b/CPP/register_modeling/example_project/main.cpp @@ -42,6 +42,9 @@ int main(void) { std::cout << "test" << std::endl; + //std::cout << std::hex << ((1ULL << 2)-1) << std::endl; + std::cout << 1ULL << std::endl; + Device dev; dev.doSomething(); diff --git a/CPP/register_modeling/example_project/runtest b/CPP/register_modeling/example_project/runtest index e21106fff543b54d81d3a359498ce1287b389211..869ff84632fb756479470e0c610efce0e58d546f 100755 GIT binary patch delta 3864 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 diff --git a/CPP/register_modeling/example_project/utils/BitField.hpp b/CPP/register_modeling/example_project/utils/BitField.hpp index aef84a6..7b36c16 100644 --- a/CPP/register_modeling/example_project/utils/BitField.hpp +++ b/CPP/register_modeling/example_project/utils/BitField.hpp @@ -47,21 +47,9 @@ 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); - return *this; - - - - #ifdef old - //TODO: test = problem with |= instead of = - // mask creation for v : https://stackoverflow.com/questions/1392059/algorithm-to-generate-bit-mask - _raw |= ((v & ((1ULL << SIZE)-1)) << START) ; + // use bit band alias if system permits + _raw = ((v & ((1ULL << SIZE)-1)) << START) | (_raw & ~(((1ULL << SIZE)-1) << START)); return *this; - #endif } /** @@ -71,7 +59,7 @@ struct BitField */ operator T() const { - return _raw >> START; + return (_raw >> START) & ((1ULL << SIZE) - 1); } /** @@ -81,7 +69,7 @@ struct BitField */ T operator ()() const { - return _raw; + return (_raw >> START) & ((1ULL << SIZE) - 1); } private: diff --git a/CPP/register_modeling/portable_bitfields/BitField.h b/CPP/register_modeling/portable_bitfields/BitField.h index 0d0e588..a826b6c 100644 --- a/CPP/register_modeling/portable_bitfields/BitField.h +++ b/CPP/register_modeling/portable_bitfields/BitField.h @@ -57,8 +57,12 @@ struct BitField */ operator T() const { - //return _raw >> START; - return (_raw & (((1ULL << SIZE)-1) >> START; + //return 0; + return 0; + + //return (_raw >> START) & ((1ULL << SIZE)-1); + //return (_raw >> START) & ((1ULL << SIZE)-1); + //return (_raw & (((1ULL << SIZE)-1) << START)) >> START; } /** @@ -68,7 +72,10 @@ struct BitField */ T operator ()() const { - return _raw; + //return _raw; + + return 0; + //return (_raw >> START) & ((1ULL << SIZE)-1); } private: