关于单片机DATA空间的问题。

[复制链接]
3176|8
 楼主| Lows 发表于 2012-10-31 18:26 | 显示全部楼层 |阅读模式
uint POW(uchar i,j)
{

uchar k;uint l,a=i;

for (k=0;k<=j;k++)

{

a*=i;

l=a/100;

}return l;
}

uchar math(uchar i,j,uint k)
{

uchar l;

uint a;

a=POW(10,i-(j+1));

l=k/a%(j*10);

if(l>9) l%=10;

return l;
}

void SHOW(uchar x,y,uchar *p,uint q,uchar sz,color)
{

uchar i=0,k=0;

while (*p)

{

if(*p==32) CHN(x,y+i*8,8,&nAsciiDot[(math(sz,k,q)+16)*16],k+1==color),k++;

else

{

CHN(x,y+i*8,8,&nAsciiDot[(*p-32)*16],0);

}i++;p++;

}
}

这是本人编的一个小程序段。经过编译发现占用的 30个字节的DATA空间

《连接器提示》 Program Size: data=100.6 xdata=0 code=4735


本人百思不得其解。这明明不是很长的程序为什么这么占空间。。求大神解释。。
Auir 发表于 2012-10-31 19:45 | 显示全部楼层
你的CHN函数从何而来???
forgot 发表于 2012-11-1 08:46 | 显示全部楼层
ayb_ice 发表于 2012-11-1 08:51 | 显示全部楼层
CHN函数又多,参数还是个函数,CHN又被SHOW调用,SHOW参数又多。。。

另外POW数学函数也可能是罪魁祸首,

有这样一句话,KEIL帮助文档里的“一个复杂的数学函数可能将51的堆栈空间全部耗尽”
 楼主| Lows 发表于 2012-11-2 07:28 | 显示全部楼层
4# ayb_ice 额。。POW是我自己定义的呀。。
 楼主| Lows 发表于 2012-11-2 07:29 | 显示全部楼层
uchar xp(uchar i)
{
        if(i<=63) CS1=1,CS2=0;
        else
        {
                CS1=0,CS2=1,i-=64;
        }return i;
}

void chn(uchar x,y,yy,uchar code*p,bit color)
{
        uchar i,j,k;
        wr_lcd(0,0x3f);wr_lcd(0,0x3f);
        for (j=0;j<2;j++)
        {
                for (i=0;i<yy;i++)
                {
                        k=xp(i+y);
                        wr_lcd(0,0xb8+x+j);
                        wr_lcd(0,0x40+k);
                        color? wr_lcd(1,~p[j*yy+i]):wr_lcd(1,p[j*yy+i]);
                }
        }
}
Auir 发表于 2012-11-3 18:22 | 显示全部楼层
你的wr_lcd()函数从何而来。

一些数学函数会占不少的空间。
airwill 发表于 2012-11-4 12:25 | 显示全部楼层
编译发现占用的 30个字节的DATA空间
《连接器提示》 Program Size: data=100.6 xdata=0 code=4735

总共使用的空间以连接器提示的为准. 另外: 寄存器空间和位寻址空间也都要算进DATA空间去. 当然还有可能其他数据堆.
ningling_21 发表于 2012-11-4 21:27 | 显示全部楼层
函数参数 多了,有时很占用DATA空间的...
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

8

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部