[电路设计] C++ 玩IO(更新一下):

[复制链接]
 楼主| CC2530 发表于 2011-7-2 11:14 | 显示全部楼层 |阅读模式
本帖最后由 CC2530 于 2011-7-4 15:58 编辑

  1. #ifndef __URIL_REG_OBJECT_HPP__
  2. #define __URIL_REG_OBJECT_HPP__
  3. #ifdef  __cplusplus   //仅在C++使用
  4. #include "uni_int.h"
  5. #include "util_macro.h"
  6. #include "iar_macro.h"
  7. template <typename T> class  REG_OBJECT_t;
  8. template <typename T,uint8 bit_start> class  REG_BIT_OBJECT_t;
  9. template <typename T,uint8 bit_start,uint8 bit_size> class  REG_FIELD_OBJECT_t;

  10. template <typename T> class  REG_OBJECT_t
  11. {   
  12.   public:  
  13.     __always_inline__ static  REG_OBJECT_t<T>  &Attach(volatile T  * REG_ADDR)
  14.     {
  15.         return *(REG_OBJECT_t<T> *)REG_ADDR;
  16.     }
  17.    
  18.     __always_inline__   REG_OBJECT_t<T>   &ToREG_OBJECT_t()
  19.     {
  20.         return *(REG_OBJECT_t<T> *)&reg;
  21.     }
  22.     template <uint8 b1>   
  23.         __inline__   REG_BIT_OBJECT_t<T,b1>   &ToREG_BIT_OBJECT_t()
  24.         {
  25.             return *(REG_BIT_OBJECT_t<T,b1> *)&reg;
  26.         }
  27.    
  28.     template <uint8 b1,uint8 s>   
  29.         __inline__   REG_FIELD_OBJECT_t<T,b1,s>   &ToREG_FIELD_OBJECT_t()
  30.         {
  31.             return *(REG_FIELD_OBJECT_t<T,b1,s> *)&reg;
  32.         }   
  33.    
  34.    
  35.     union
  36.     {
  37.         T          reg;
  38.         volatile T Reg;
  39.     };
  40.    
  41.    
  42.    
  43.     __always_inline__ REG_OBJECT_t<T> &set_bit(uint8 bit_start)
  44.     {
  45.         reg |=  1U<<bit_start;
  46.         return *this;
  47.     }
  48.     __always_inline__ REG_OBJECT_t<T> &Set_Bit(uint8 bit_start)
  49.     {
  50.         Reg |=  1U<<bit_start;
  51.         return *this;
  52.     }
  53.    
  54.     __always_inline__ REG_OBJECT_t<T> &clr_bit(uint8 bit_start)
  55.     {
  56.         reg &=  ~(1U<<bit_start);
  57.         return *this;
  58.     }
  59.    
  60.     __always_inline__ REG_OBJECT_t<T> &Clr_Bit(uint8 bit_start)
  61.     {
  62.         Reg &= ~(1U<<bit_start);
  63.         return *this;
  64.     }
  65.    
  66.     __always_inline__ REG_OBJECT_t<T> &toggle_bit(uint8 bit_start)
  67.     {
  68.         reg ^=  1U<<bit_start;
  69.         return *this;
  70.     }
  71.    
  72.     __always_inline__  REG_OBJECT_t<T> &Toggle_Bit(uint8 bit_start)
  73.     {
  74.         Reg ^= 1U<<bit_start;
  75.         return *this;
  76.     }
  77.    
  78.     __always_inline__  REG_OBJECT_t<T> &write_bit(uint8 bit_start,T value)
  79.     {
  80.         if(value)
  81.         {
  82.             reg |=  1U<<bit_start;
  83.         }
  84.         else
  85.         {
  86.             reg &= ~(1U<<bit_start);
  87.         }
  88.         return *this;
  89.     }
  90.     __always_inline__  REG_OBJECT_t<T> &Write_Bit(uint8 bit_start,T value)
  91.     {
  92.         if(value)
  93.         {
  94.             Reg |=  1U<<bit_start;
  95.         }
  96.         else
  97.         {
  98.             Reg &= ~(1U<<bit_start);
  99.         }
  100.         return *this;
  101.     }
  102.     __always_inline__  REG_OBJECT_t<T> &read_bit(uint8 bit_start,T &value)
  103.     {
  104.         
  105.         if(reg &  (1U<<bit_start))
  106.         {
  107.             value=1;
  108.         }
  109.         else
  110.         {
  111.             value=0;
  112.         }
  113.         
  114.         return *this;
  115.     }
  116.     __always_inline__  REG_OBJECT_t<T> &Read_Bit(uint8 bit_start,T &value)
  117.     {
  118.         
  119.         if(Reg &  (1U<<bit_start))
  120.         {
  121.             value=1;
  122.         }
  123.         else
  124.         {
  125.             value=0;
  126.         }
  127.         
  128.         return *this;
  129.     }
  130.    
  131.     __always_inline__  REG_OBJECT_t<T> &write_field(uint8 bit_start,uint8 bit_size,T value)
  132.     {
  133.         T temp_reg=this->reg;
  134.         temp_reg &= ~_BVF_DATA(~value,bit_start,bit_size);
  135.         temp_reg |=  _BVF_DATA(value,bit_start,bit_size);
  136.         this->reg = temp_reg;
  137.         
  138.         return *this;
  139.     }
  140.    
  141.     __always_inline__  REG_OBJECT_t<T> &Write_Field(uint8 bit_start,uint8 bit_size,T value)
  142.     {
  143.         T temp_reg=this->Reg;
  144.         temp_reg &= ~_BVF_DATA(~value,bit_start,bit_size);
  145.         temp_reg |=  _BVF_DATA(value,bit_start,bit_size);
  146.         this->Reg = temp_reg;
  147.         
  148.         return *this;
  149.     }
  150.    
  151.         __always_inline__  REG_OBJECT_t<T> &read_field(uint8 bit_start,uint8 bit_size,T &value)
  152.     {
  153.         value= (reg & _BVF(bit_start,bit_size))>>bit_start;
  154.         
  155.         return *this;
  156.     }
  157.    
  158.     __always_inline__  REG_OBJECT_t<T> &Read_Field(uint8 bit_start,uint8 bit_size,T &value)
  159.     {
  160.         value= (Reg & _BVF(bit_start,bit_size))>>bit_start;
  161.         
  162.         return *this;
  163.     }
  164.    
  165. };

  166. template <typename T,uint8 b> class  REG_BIT_OBJECT_t
  167. {
  168.   public:  
  169.     __always_inline__ static  REG_BIT_OBJECT_t<T,b>  &Attach(volatile T  * REG_ADDR)
  170.     {
  171.         return *(REG_BIT_OBJECT_t<T,b> *)REG_ADDR;
  172.     }
  173.    
  174.     __always_inline__   REG_OBJECT_t<T>   &ToREG_OBJECT_t()
  175.     {
  176.         return *(REG_OBJECT_t<T> *)&reg;
  177.     }
  178.     template <uint8 b1>   
  179.         __inline__   REG_BIT_OBJECT_t<T,b1>   &ToREG_BIT_OBJECT_t()
  180.         {
  181.             return *(REG_BIT_OBJECT_t<T,b1> *)&reg;
  182.         }
  183.    
  184.     template <uint8 b1,uint8 s>   
  185.         __inline__   REG_FIELD_OBJECT_t<T,b1,s>   &ToREG_FIELD_OBJECT_t()
  186.         {
  187.             return *(REG_FIELD_OBJECT_t<T,b1,s> *)&reg;
  188.         }
  189.    
  190.     union
  191.     {
  192.         T          reg;
  193.         volatile T Reg;
  194.     };
  195.    
  196.     __always_inline__ REG_BIT_OBJECT_t<T,b> &set()
  197.     {
  198.         reg |=  1U<<b;
  199.         return *this;
  200.     }
  201.    
  202.     __always_inline__ REG_BIT_OBJECT_t<T,b> &Set()
  203.     {
  204.         Reg |=  1U<<b;
  205.         return *this;
  206.     }
  207.    
  208.     __always_inline__ REG_BIT_OBJECT_t<T,b> &clr()
  209.     {
  210.         reg &=  ~(1U<<b);
  211.         return *this;
  212.     }
  213.    
  214.     __always_inline__ REG_BIT_OBJECT_t<T,b> &Clr()
  215.     {
  216.         Reg &= ~(1U<<b);
  217.         return *this;
  218.     }
  219.    
  220.     __always_inline__ REG_BIT_OBJECT_t<T,b> &toggle()
  221.     {
  222.         reg ^=  1U<<b;
  223.         return *this;
  224.     }
  225.    
  226.     __always_inline__  REG_BIT_OBJECT_t<T,b> &Toggle()
  227.     {
  228.         Reg ^= 1U<<b;
  229.         return *this;
  230.     }
  231.    
  232.     __always_inline__  REG_BIT_OBJECT_t<T,b> &write(T value)
  233.     {
  234.         if(value)
  235.         {
  236.             reg |=  1U<<b;
  237.         }
  238.         else
  239.         {
  240.             reg &= ~(1U<<b);
  241.         }
  242.         return *this;
  243.     }
  244.     __always_inline__  REG_BIT_OBJECT_t<T,b> &Write(T value)
  245.     {
  246.         if(value)
  247.         {
  248.             Reg |=  1U<<b;
  249.         }
  250.         else
  251.         {
  252.             Reg &= ~(1U<<b);
  253.         }
  254.         return *this;
  255.     }
  256.     __always_inline__  REG_BIT_OBJECT_t<T,b> &read(T &value)
  257.     {
  258.         
  259.         if(reg &  (1U<<b))
  260.         {
  261.             value=1;
  262.         }
  263.         else
  264.         {
  265.             value=0;
  266.         }
  267.         
  268.         return *this;
  269.     }
  270.     __always_inline__  REG_BIT_OBJECT_t<T,b> &Read(T &value)
  271.     {
  272.         
  273.         if(Reg &  (1U<<b))
  274.         {
  275.             value=1;
  276.         }
  277.         else
  278.         {
  279.             value=0;
  280.         }
  281.         
  282.         return *this;
  283.     }  
  284. };
  285. template <typename T,uint8 bit_start,uint8 bit_size> class  REG_FIELD_OBJECT_t
  286. {
  287.   public:
  288.    
  289.     __always_inline__  static  REG_FIELD_OBJECT_t<T,bit_start,bit_size>  &Attach(volatile T  * REG_ADDR)
  290.     {
  291.         return *(REG_FIELD_OBJECT_t<T,bit_start,bit_size> *)REG_ADDR;
  292.     }
  293.    
  294.     __always_inline__   REG_OBJECT_t<T>   &ToREG_OBJECT_t()
  295.     {
  296.         return *(REG_OBJECT_t<T> *)&reg;
  297.     }
  298.     template <uint8 b1>   
  299.         __inline__   REG_BIT_OBJECT_t<T,b1>   &ToREG_BIT_OBJECT_t()
  300.         {
  301.             return *(REG_BIT_OBJECT_t<T,b1> *)&reg;
  302.         }
  303.    
  304.     template <uint8 b1,uint8 s>   
  305.         __inline__   REG_FIELD_OBJECT_t<T,b1,s>   &ToREG_FIELD_OBJECT_t()
  306.         {
  307.             return *(REG_FIELD_OBJECT_t<T,b1,s> *)&reg;
  308.         }
  309.    
  310.    
  311.     union
  312.     {
  313.         T          reg;
  314.         volatile T Reg;
  315.     };
  316.    
  317.    
  318.     __always_inline__ REG_FIELD_OBJECT_t<T,bit_start,bit_size> &write(T value)
  319.     {
  320.         T temp_reg=this->reg;
  321.         temp_reg &= ~_BVF_DATA(~value,bit_start,bit_size);
  322.         temp_reg |=  _BVF_DATA(value,bit_start,bit_size);
  323.         this->reg = temp_reg;
  324.         return *this;
  325.     }
  326.    
  327.     __always_inline__ REG_FIELD_OBJECT_t<T,bit_start,bit_size> &Write(T value)
  328.     {
  329.         T temp_reg=this->Reg;
  330.         temp_reg &= ~_BVF_DATA(~value,bit_start,bit_size);
  331.         temp_reg |=  _BVF_DATA(value,bit_start,bit_size);
  332.         this->Reg = temp_reg;
  333.         return *this;
  334.     }
  335.    
  336.     __always_inline__ REG_FIELD_OBJECT_t<T,bit_start,bit_size> &read(T &value)
  337.     {
  338.         value= (reg & _BVF(bit_start,bit_size))>>bit_start;
  339.         return *this;
  340.     }
  341.    
  342.     __always_inline__ REG_FIELD_OBJECT_t<T,bit_start,bit_size> &Read(T &value)
  343.     {
  344.         value=(Reg & _BVF(bit_start,bit_size))>>bit_start;
  345.         
  346.         return *this;
  347.     }
  348.    
  349. };
  350. #endif
  351. #endif


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

  3. uint8 io;
  4. uint8 x;
  5. void test_io1a(void)
  6. {   
  7.     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);   
  8. }
  9. void test_io1b(void)
  10. {   
  11.     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);   
  12. }
  13. void test_io2a(void)
  14. {
  15.     REG_BIT_OBJECT_t<uint8,2+3>::Attach(&io).write(1).write(0).toggle().read(x).write(~x);
  16.     //优化用小写
  17. }
  18. void test_io2b(void)
  19. {
  20.     REG_BIT_OBJECT_t<uint8,2>::Attach(&io).Write(1).Write(0).Toggle().Read(x).Write(~x);
  21.     //防优化用大写
  22. }
  23. void test_io3a(void)
  24. {
  25.     REG_FIELD_OBJECT_t<uint8,2,3>::Attach(&io).write(3).write(4).read(x).write(~x);
  26.     //优化用小写   
  27. }
  28. void test_io3b(void)
  29. {
  30.     REG_FIELD_OBJECT_t<uint8,2,3>::Attach(&io).Write(3).Write(4).Read(x).Write(~x);
  31.     //防优化用大写
  32. }

  33. int main()
  34. {
  35.     test_io1a();
  36.     test_io1b();
  37.     test_io2a();
  38.     test_io2b();
  39.     test_io3a();
  40.     test_io3b();
  41.    
  42.     while(1);
  43. }

评分

参与人数 2威望 +2 收起 理由
mayingzi521 + 1 不错
499734424 + 1

查看全部评分

lxyppc 发表于 2011-7-4 10:18 | 显示全部楼层
支持一下,我写一个纯c版本的

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

  3. #define Attach(x)           (x) = (x)
  4. #define set(s,e)            | _BitField(s,e)
  5. #define clr(s,e)            & ~_BitField(s,e)
  6. #define tog(s,e)            ^ _BitField(s,e)

  7. 使用方式
  8. uint8 io=0xff;
  9. // 设置[0,6]位,清除[1,2]位,反转[0,7]位
  10. 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 | 显示全部楼层
沙发
乡村男孩 发表于 2011-7-2 11:17 | 显示全部楼层
沙发被抢
上官叔叔
厉害
是IAR编译器吗
moreand 发表于 2011-7-2 11:19 | 显示全部楼层
C++也可以用在M0里编程吗?
hotpower 发表于 2011-7-2 11:19 | 显示全部楼层
不错~~~
酒鬼,老师都是用的模板,很黄很暴力的~~
乡村男孩 发表于 2011-7-2 11:23 | 显示全部楼层
膜拜
john_lee 发表于 2011-7-2 13:57 | 显示全部楼层
不错!顶一下上官。
plc_avr 发表于 2011-7-2 15:50 | 显示全部楼层
没学过C++,要向高手看齐........顶你!
chy117 发表于 2011-7-2 19:27 | 显示全部楼层
Swallow_0322 发表于 2011-7-2 20:16 | 显示全部楼层
顶!
lwslws201 发表于 2011-7-2 23:10 | 显示全部楼层
:victory:
nongfuxu 发表于 2011-7-3 08:02 | 显示全部楼层
顶一下
hotpower 发表于 2011-7-5 08:13 | 显示全部楼层
昨晚与菜地听老师的头文件的实现方法,那才叫个晕!
cheng105 发表于 2011-7-6 12:24 | 显示全部楼层
你强大,
areshan 发表于 2011-7-9 00:41 | 显示全部楼层
顶下!
kardel 发表于 2011-7-9 13:27 | 显示全部楼层
老实说,我看不懂,有没有注释呀:)
leang521 发表于 2011-7-11 17:33 | 显示全部楼层
NICKY99 发表于 2011-7-12 11:45 | 显示全部楼层
mark!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

0

主题

262

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部