打印
[电路设计]

C++ 玩IO(更新一下):

[复制链接]
9317|51
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CC2530|  楼主 | 2011-7-2 11:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 CC2530 于 2011-7-4 15:58 编辑
 
#ifndef __URIL_REG_OBJECT_HPP__
#define __URIL_REG_OBJECT_HPP__
#ifdef  __cplusplus   //仅在C++使用
#include "uni_int.h"
#include "util_macro.h"
#include "iar_macro.h"
template <typename T> class  REG_OBJECT_t;
template <typename T,uint8 bit_start> class  REG_BIT_OBJECT_t;
template <typename T,uint8 bit_start,uint8 bit_size> class  REG_FIELD_OBJECT_t;

template <typename T> class  REG_OBJECT_t
{   
  public:  
    __always_inline__ static  REG_OBJECT_t<T>  &Attach(volatile T  * REG_ADDR)
    {
        return *(REG_OBJECT_t<T> *)REG_ADDR;
    }
   
    __always_inline__   REG_OBJECT_t<T>   &ToREG_OBJECT_t()
    {
        return *(REG_OBJECT_t<T> *)&reg;
    }
    template <uint8 b1>   
        __inline__   REG_BIT_OBJECT_t<T,b1>   &ToREG_BIT_OBJECT_t()
        {
            return *(REG_BIT_OBJECT_t<T,b1> *)&reg;
        }
   
    template <uint8 b1,uint8 s>   
        __inline__   REG_FIELD_OBJECT_t<T,b1,s>   &ToREG_FIELD_OBJECT_t()
        {
            return *(REG_FIELD_OBJECT_t<T,b1,s> *)&reg;
        }   
   
   
    union
    {
        T          reg;
        volatile T Reg;
    };
   
   
   
    __always_inline__ REG_OBJECT_t<T> &set_bit(uint8 bit_start)
    {
        reg |=  1U<<bit_start;
        return *this;
    }
    __always_inline__ REG_OBJECT_t<T> &Set_Bit(uint8 bit_start)
    {
        Reg |=  1U<<bit_start;
        return *this;
    }
   
    __always_inline__ REG_OBJECT_t<T> &clr_bit(uint8 bit_start)
    {
        reg &=  ~(1U<<bit_start);
        return *this;
    }
   
    __always_inline__ REG_OBJECT_t<T> &Clr_Bit(uint8 bit_start)
    {
        Reg &= ~(1U<<bit_start);
        return *this;
    }
   
    __always_inline__ REG_OBJECT_t<T> &toggle_bit(uint8 bit_start)
    {
        reg ^=  1U<<bit_start;
        return *this;
    }
   
    __always_inline__  REG_OBJECT_t<T> &Toggle_Bit(uint8 bit_start)
    {
        Reg ^= 1U<<bit_start;
        return *this;
    }
   
    __always_inline__  REG_OBJECT_t<T> &write_bit(uint8 bit_start,T value)
    {
        if(value)
        {
            reg |=  1U<<bit_start;
        }
        else
        {
            reg &= ~(1U<<bit_start);
        }
        return *this;
    }
    __always_inline__  REG_OBJECT_t<T> &Write_Bit(uint8 bit_start,T value)
    {
        if(value)
        {
            Reg |=  1U<<bit_start;
        }
        else
        {
            Reg &= ~(1U<<bit_start);
        }
        return *this;
    }
    __always_inline__  REG_OBJECT_t<T> &read_bit(uint8 bit_start,T &value)
    {
        
        if(reg &  (1U<<bit_start))
        {
            value=1;
        }
        else
        {
            value=0;
        }
        
        return *this;
    }
    __always_inline__  REG_OBJECT_t<T> &Read_Bit(uint8 bit_start,T &value)
    {
        
        if(Reg &  (1U<<bit_start))
        {
            value=1;
        }
        else
        {
            value=0;
        }
        
        return *this;
    }
   
    __always_inline__  REG_OBJECT_t<T> &write_field(uint8 bit_start,uint8 bit_size,T value)
    {
        T temp_reg=this->reg;
        temp_reg &= ~_BVF_DATA(~value,bit_start,bit_size);
        temp_reg |=  _BVF_DATA(value,bit_start,bit_size);
        this->reg = temp_reg;
        
        return *this;
    }
   
    __always_inline__  REG_OBJECT_t<T> &Write_Field(uint8 bit_start,uint8 bit_size,T value)
    {
        T temp_reg=this->Reg;
        temp_reg &= ~_BVF_DATA(~value,bit_start,bit_size);
        temp_reg |=  _BVF_DATA(value,bit_start,bit_size);
        this->Reg = temp_reg;
        
        return *this;
    }
   
        __always_inline__  REG_OBJECT_t<T> &read_field(uint8 bit_start,uint8 bit_size,T &value)
    {
        value= (reg & _BVF(bit_start,bit_size))>>bit_start;
        
        return *this;
    }
   
    __always_inline__  REG_OBJECT_t<T> &Read_Field(uint8 bit_start,uint8 bit_size,T &value)
    {
        value= (Reg & _BVF(bit_start,bit_size))>>bit_start;
        
        return *this;
    }
   
};

template <typename T,uint8 b> class  REG_BIT_OBJECT_t
{
  public:  
    __always_inline__ static  REG_BIT_OBJECT_t<T,b>  &Attach(volatile T  * REG_ADDR)
    {
        return *(REG_BIT_OBJECT_t<T,b> *)REG_ADDR;
    }
   
    __always_inline__   REG_OBJECT_t<T>   &ToREG_OBJECT_t()
    {
        return *(REG_OBJECT_t<T> *)&reg;
    }
    template <uint8 b1>   
        __inline__   REG_BIT_OBJECT_t<T,b1>   &ToREG_BIT_OBJECT_t()
        {
            return *(REG_BIT_OBJECT_t<T,b1> *)&reg;
        }
   
    template <uint8 b1,uint8 s>   
        __inline__   REG_FIELD_OBJECT_t<T,b1,s>   &ToREG_FIELD_OBJECT_t()
        {
            return *(REG_FIELD_OBJECT_t<T,b1,s> *)&reg;
        }
   
    union
    {
        T          reg;
        volatile T Reg;
    };
   
    __always_inline__ REG_BIT_OBJECT_t<T,b> &set()
    {
        reg |=  1U<<b;
        return *this;
    }
   
    __always_inline__ REG_BIT_OBJECT_t<T,b> &Set()
    {
        Reg |=  1U<<b;
        return *this;
    }
   
    __always_inline__ REG_BIT_OBJECT_t<T,b> &clr()
    {
        reg &=  ~(1U<<b);
        return *this;
    }
   
    __always_inline__ REG_BIT_OBJECT_t<T,b> &Clr()
    {
        Reg &= ~(1U<<b);
        return *this;
    }
   
    __always_inline__ REG_BIT_OBJECT_t<T,b> &toggle()
    {
        reg ^=  1U<<b;
        return *this;
    }
   
    __always_inline__  REG_BIT_OBJECT_t<T,b> &Toggle()
    {
        Reg ^= 1U<<b;
        return *this;
    }
   
    __always_inline__  REG_BIT_OBJECT_t<T,b> &write(T value)
    {
        if(value)
        {
            reg |=  1U<<b;
        }
        else
        {
            reg &= ~(1U<<b);
        }
        return *this;
    }
    __always_inline__  REG_BIT_OBJECT_t<T,b> &Write(T value)
    {
        if(value)
        {
            Reg |=  1U<<b;
        }
        else
        {
            Reg &= ~(1U<<b);
        }
        return *this;
    }
    __always_inline__  REG_BIT_OBJECT_t<T,b> &read(T &value)
    {
        
        if(reg &  (1U<<b))
        {
            value=1;
        }
        else
        {
            value=0;
        }
        
        return *this;
    }
    __always_inline__  REG_BIT_OBJECT_t<T,b> &Read(T &value)
    {
        
        if(Reg &  (1U<<b))
        {
            value=1;
        }
        else
        {
            value=0;
        }
        
        return *this;
    }  
};
template <typename T,uint8 bit_start,uint8 bit_size> class  REG_FIELD_OBJECT_t
{
  public:
   
    __always_inline__  static  REG_FIELD_OBJECT_t<T,bit_start,bit_size>  &Attach(volatile T  * REG_ADDR)
    {
        return *(REG_FIELD_OBJECT_t<T,bit_start,bit_size> *)REG_ADDR;
    }
   
    __always_inline__   REG_OBJECT_t<T>   &ToREG_OBJECT_t()
    {
        return *(REG_OBJECT_t<T> *)&reg;
    }
    template <uint8 b1>   
        __inline__   REG_BIT_OBJECT_t<T,b1>   &ToREG_BIT_OBJECT_t()
        {
            return *(REG_BIT_OBJECT_t<T,b1> *)&reg;
        }
   
    template <uint8 b1,uint8 s>   
        __inline__   REG_FIELD_OBJECT_t<T,b1,s>   &ToREG_FIELD_OBJECT_t()
        {
            return *(REG_FIELD_OBJECT_t<T,b1,s> *)&reg;
        }
   
   
    union
    {
        T          reg;
        volatile T Reg;
    };
   
   
    __always_inline__ REG_FIELD_OBJECT_t<T,bit_start,bit_size> &write(T value)
    {
        T temp_reg=this->reg;
        temp_reg &= ~_BVF_DATA(~value,bit_start,bit_size);
        temp_reg |=  _BVF_DATA(value,bit_start,bit_size);
        this->reg = temp_reg;
        return *this;
    }
   
    __always_inline__ REG_FIELD_OBJECT_t<T,bit_start,bit_size> &Write(T value)
    {
        T temp_reg=this->Reg;
        temp_reg &= ~_BVF_DATA(~value,bit_start,bit_size);
        temp_reg |=  _BVF_DATA(value,bit_start,bit_size);
        this->Reg = temp_reg;
        return *this;
    }
   
    __always_inline__ REG_FIELD_OBJECT_t<T,bit_start,bit_size> &read(T &value)
    {
        value= (reg & _BVF(bit_start,bit_size))>>bit_start;
        return *this;
    }
   
    __always_inline__ REG_FIELD_OBJECT_t<T,bit_start,bit_size> &Read(T &value)
    {
        value=(Reg & _BVF(bit_start,bit_size))>>bit_start;
        
        return *this;
    }
   
};
#endif
#endif
 

#include "proj_incs.h"
#include "util_reg_object.hpp"

uint8 io;
uint8 x;
void test_io1a(void)
{   
    REG_OBJECT_t<uint8>::Attach(&io).set_bit(0).clr_bit(1).write_field(2,3,7).ToREG_BIT_OBJECT_t<5>().set().clr().toggle().ToREG_FIELD_OBJECT_t<6,2>().write(2);   
}
void test_io1b(void)
{   
    REG_OBJECT_t<uint8>::Attach(&io).Set_Bit(0).Clr_Bit(1).Write_Field(2,3,7).ToREG_BIT_OBJECT_t<5>().Set().Clr().Toggle().ToREG_FIELD_OBJECT_t<6,2>().Write(2);   
}
void test_io2a(void)
{
    REG_BIT_OBJECT_t<uint8,2+3>::Attach(&io).write(1).write(0).toggle().read(x).write(~x);
    //优化用小写
}
void test_io2b(void)
{
    REG_BIT_OBJECT_t<uint8,2>::Attach(&io).Write(1).Write(0).Toggle().Read(x).Write(~x);
    //防优化用大写
}
void test_io3a(void)
{
    REG_FIELD_OBJECT_t<uint8,2,3>::Attach(&io).write(3).write(4).read(x).write(~x);
    //优化用小写   
}
void test_io3b(void)
{
    REG_FIELD_OBJECT_t<uint8,2,3>::Attach(&io).Write(3).Write(4).Read(x).Write(~x);
    //防优化用大写
}

int main()
{
    test_io1a();
    test_io1b();
    test_io2a();
    test_io2b();
    test_io3a();
    test_io3b();
   
    while(1);
}
评分
参与人数 2威望 +2 收起 理由
mayingzi521 + 1 不错
499734424 + 1

相关帖子

来自 2楼
lxyppc| | 2011-7-4 10:18 | 只看该作者
支持一下,我写一个纯c版本的

// 左右都为闭区间
#define _BitField(s,e)           (( (1<<((e)-(s)+1)) -1 )<<(s))

#define Attach(x)           (x) = (x)
#define set(s,e)            | _BitField(s,e)
#define clr(s,e)            & ~_BitField(s,e)
#define tog(s,e)            ^ _BitField(s,e)

使用方式
uint8 io=0xff;
// 设置[0,6]位,清除[1,2]位,反转[0,7]位
Attach(io) set(0,6) clr(1,2) tog(0,7);

使用特权

评论回复
评分
参与人数 1威望 +10 收起 理由
hotpower + 10 发条裤子
板凳
zhouwaiting| | 2011-7-2 11:16 | 只看该作者
沙发,第一次

使用特权

评论回复
地板
zifenglin| | 2011-7-2 11:16 | 只看该作者
沙发

使用特权

评论回复
5
乡村男孩| | 2011-7-2 11:17 | 只看该作者
沙发被抢
上官叔叔
厉害
是IAR编译器吗

使用特权

评论回复
6
moreand| | 2011-7-2 11:19 | 只看该作者
C++也可以用在M0里编程吗?

使用特权

评论回复
7
hotpower| | 2011-7-2 11:19 | 只看该作者
不错~~~
酒鬼,老师都是用的模板,很黄很暴力的~~

使用特权

评论回复
8
乡村男孩| | 2011-7-2 11:23 | 只看该作者
膜拜

使用特权

评论回复
9
john_lee| | 2011-7-2 13:57 | 只看该作者
不错!顶一下上官。

使用特权

评论回复
10
plc_avr| | 2011-7-2 15:50 | 只看该作者
没学过C++,要向高手看齐........顶你!

使用特权

评论回复
11
chy117| | 2011-7-2 19:27 | 只看该作者
mark

使用特权

评论回复
12
Swallow_0322| | 2011-7-2 20:16 | 只看该作者
顶!

使用特权

评论回复
13
lwslws201| | 2011-7-2 23:10 | 只看该作者
:victory:

使用特权

评论回复
14
nongfuxu| | 2011-7-3 08:02 | 只看该作者
顶一下

使用特权

评论回复
15
hotpower| | 2011-7-5 08:13 | 只看该作者
昨晚与菜地听老师的头文件的实现方法,那才叫个晕!

使用特权

评论回复
16
cheng105| | 2011-7-6 12:24 | 只看该作者
你强大,

使用特权

评论回复
17
areshan| | 2011-7-9 00:41 | 只看该作者
顶下!

使用特权

评论回复
18
kardel| | 2011-7-9 13:27 | 只看该作者
老实说,我看不懂,有没有注释呀:)

使用特权

评论回复
19
leang521| | 2011-7-11 17:33 | 只看该作者
mark

使用特权

评论回复
20
NICKY99| | 2011-7-12 11:45 | 只看该作者
mark!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:该死的ST,还不赶快出STM8L小FLASH片子

0

主题

262

帖子

1

粉丝