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

2006-12-28 22:35 6155 7 7 分类: 处理器与DSP
hotpower 发表于 2006-7-2 23:35 DSP 技术 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

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


研究了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.

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


点击看大图

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条