有关应广单片机数据类型与ROM空间优化的一点看法
引子:前一段时间做一个倒计时项目,带显示,由于涉及到各种运算和模式切换,把2k空间给填满了,但是还有一些特性没有完成,因此就想着看看这么样优化一下,扣点空间出来,这样就可以不用换3k空间的单品机了。毕竟3k空间单片机要贵一点。后面发现,eword运算比较耗空间,然后就用word+byte方式实现。
为了达到这个对比目的,把其中一部分代码扣下来,专门做了一个工程来对比测试。有需要可以找我要工程代码。
不多说上代码
void FPPA0 (void)
{
.ADJUST_IC SYSCLK=IHRC/2,IHRC=16MHz,init_ram;
wdreset;
/*初始化T16*/
Timer16_Init();
$ MS_OUT out,low;
Engint;
#if DEBUG_WORD
ucTaskRunTmr=240;
#else
ueTaskRunTmr=240000;
#endif
/*开启看门狗*/
CLKMD.En_WatchDog = 1;
while (1)
{
/*喂狗*/
wdreset;
/*1ms标记*/
if(msFlag)
{
#if DEBUG_WORD
/*word+byte 倒计时方式*/
usMsCnt++;
if(usMsCnt>999)
{
/*1ms*1000=1000ms*/
usMsCnt=0;
if(ucTaskRunTmr)
{
/*在倒计时内,在不同的时间点,执行不同动作*/
if(ucTaskRunTmr==240)
{
$ MS_OUT out,low;
}
else if(ucTaskRunTmr==180)
{
$ MS_OUT out,high;
}
else if(ucTaskRunTmr==120)
{
$ MS_OUT out,low;
}
else if(ucTaskRunTmr==60)
{
$ MS_OUT out,high;
}
else if(ucTaskRunTmr==30)
{
$ MS_OUT out,low;
}
else if(ucTaskRunTmr==15)
{
$ MS_OUT out,high;
}
ucTaskRunTmr--;
}
}
#else
/*使用eword(3 byte) 倒计时方式*/
if(ueTaskRunTmr)
{
if(ueTaskRunTmr==240000)
{
$ MS_OUT out,low;
}
else if(ueTaskRunTmr==180000)
{
$ MS_OUT out,high;
}
else if(ueTaskRunTmr==120000)
{
$ MS_OUT out,low;
}
else if(ueTaskRunTmr==60000)
{
$ MS_OUT out,high;
}
else if(ueTaskRunTmr==30000)
{
$ MS_OUT out,low;
}
else if(ueTaskRunTmr==15000)
{
$ MS_OUT out,high;
}
ueTaskRunTmr--;
}
#endif
/*1ms task*/
msFlag=0;
}
}
}
使用 word+byte 模式
使用 eword 模式
0xFd-0xD5= 0x28=40 word 。代码改一下就多出40个wrod空间,看来还蛮有效果的。
空间虽然腾出来一点,但是要注意的是:用了不同的数据类型,会导致定时的精度不同和和产生+/-1的问题,word+byte 的精度是1s(每秒判断一次),而eword的精度是1ms(每ms判断一次),因此进行优化的是时候一定要注意以上的问题,并且做好相关测试,否则优化之后可能出现问题。
下面就做一个总结:
因为应广单片机是一种8bit单片机,对大于8bit的数据处理能力有限,虽然可以处理16bit 24bit 32bit 这种数据,但是处理起来会耗费不少的空间和时间,因此,在做算法或是流程的时候,要考虑一下这种特性,能够用8bit数据尽量用8bit数据,这样才能使单片机处理效率高,性价比最大化。