访问电脑版页面

导航:老古开发网手机版其他

拜托放弃位域效率低下的习惯吧~~~

导读:
关键字:
拜托放弃位域效率低下的习惯吧~~~

研究了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
栏目: [ ]

相关阅读

安森美推出新的高功率图腾柱PFC控制器,满足具挑战的能效标准

动态功耗低至60μA/MHz!助力设备超长续航,首选国民技术低功耗MCU!