研究了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.
哈哈,菜农拜托各位晕友放弃位域效率低下的不良习惯吧~~~
|
|
文章评论(0条评论)
登录后参与讨论