访问手机版页面
你的位置:老古开发网 > 其他 > 正文  
拜托放弃位域效率低下的习惯吧~~~
内容导读:
拜托放弃位域效率低下的习惯吧~~~

研究了C28X的头文件后,有点失望~~~看来TI也陶醉与51位的流毒~~~

51的位只能适合自己,虽然PIC也是满身的位,AVR的PORT位.

但随着16位/32位 ARM/DSP的发展,"位"已淡化,且以另一种新的构思代替,即

IOSET,IOCLR代替,且2812还有IOTOGGLE.

由于控制更加复杂,模块已不能用几个寄存器就能表述...

他们一般都是地址连续或能遵循一定排列规律的变量,故一般都声明为结构(指针)而使表述更为简洁.

例:
struct GPIO_DATA_REGS {
   union  GPADAT_REG    GPADAT;
   union  GPASET_REG    GPASET;
   union  GPACLEAR_REG  GPACLEAR;
   union  GPATOGGLE_REG GPATOGGLE;
//..............
};
//...............
union GPFTOGGLE_REG {
   Uint16                all;
   struct GPFTOGGLE_BITS bit;
};

虽然位域的设置清除很方便,但是对编译器的优化带来的难题~~~

下图是经过3级优化后的编译代码,确实不好.

所以,可以保留TI的头文件,再加上"位宏",就能提高代码的效率....
(连续操作相同变量的位域不是个好习惯,除非硬件需要)

   SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
   SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
   SysCtrlRegs.PCLKCR.bit.SCIAENCLK=1;
   SysCtrlRegs.PCLKCR.bit.SCIBENCLK=1;
   SysCtrlRegs.PCLKCR.bit.MCBSPENCLK=1;
   SysCtrlRegs.PCLKCR.bit.SPIENCLK=1;
   SysCtrlRegs.PCLKCR.bit.ECANENCLK=1;
   SysCtrlRegs.PCLKCR.bit.ADCENCLK=1;
写成以下形式肯定代码简洁
SysCtrlRegs.PCLKCR.all = (1 << ...) (1 << ...);

所以不如放弃union直接用:
SysCtrlRegs.PCLKCR = (1 << ...) (1 << ...);

当然偷懒就只不要滥用xxx.bit....而在只控制1个位时使用,超过2个就用xxx.all.

哈哈,菜农拜托各位晕友放弃位域效率低下的不良习惯吧~~~

 

标签:
来源: 作者: 时间:2006/9/25 16:50:53
相关阅读
推荐阅读
阅读排行
最近更新
商品推荐