[资料分享] DSP对位操作的C++的简单封装

fish001   2017-4-20 20:54 楼主

位操作在为硬件编程中是非常普遍的。往往是寄存器的各位都具有不同的意义,包括获取位状态,给位置数等。

正因为位操作这么普遍,往往容易出现错误,而且除了那些对HEX编码,以及二进制编码非常熟悉的大牛之外,一般很难发现错在哪。

另外,尤其是在中断之类的要求快速处理完成的过程中,对位操作的执行效率要求也高。

我使用模板对位操作做了一个简单的封装


定义各种类型的位掩码:


[cpp] view plain copy
print?


  • /**
  • * 位掩码
  • */  
  • template  
  • class BitMaskSet{  
  • public:  
  •     static const T v ;  
  • };  
  •   
  • template  
  • const T BitMaskSet::v = (1u<


这个类定义了简单的某位的掩码值,比如双字节的位8的掩码

BitMaskSet::v;


[cpp] view plain copy
print?


  • /**
  • * 清除位掩码
  • */  
  • template  
  • class BitMaskClr{  
  • public:  
  •     static const T v;  
  • };  
  •   
  • template  
  • const T BitMaskClr::v = ~(1u<


同时还封装了一些简化的操作函数

[cpp] view plain copy
print?


  • /**
  • * 获取位值
  • * @param v
  • * @return
  • */  
  • template  
  • inline Tmask getBit( const Tv& v ){  
  •     return v&(BitMaskSet::v);  
  • }  
  •   
  • /**
  • * 位值是否设置
  • * @param v
  • * @return
  • */  
  • template  
  • inline bool isBitSet( const Tv& v ){  
  •     return 0!=v&(BitMaskSet::v);  
  • }  
  •   
  • /**
  • * 设置位
  • * @param v
  • */  
  • template  
  • inline void bitSet( Tv& v ){  
  •     v |= BitMaskSet::v;  
  • }  
  •   
  • /**
  • * 清除位
  • * @param v
  • */  
  • template  
  • inline void bitClr( Tv& v ){  
  •     v &= BitMaskClr::v;  
  • }  


下面来举几个例子

比如在PIE模块中,使能PDPINTA或者禁用,可以使用一下代码:


[cpp] view plain copy
print?


  • inline void en_pdpIntA(){   NDm::bitSet(m_ier1);    }  
  • inline void dis_pdpIntA(){  NDm::bitClr(m_ier1);    }  


从编码风格上看,上面的两行代码非常整齐,而且很直观的看出都是对位0进行操作,一个是设置,一个是清除。

即使有书写错误也很容易识别出来。


回复评论

暂无评论,赶紧抢沙发吧
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复