问题:
我编程很少使用idata,都是data和xdata,但是最近遇到一个问题,RAM使用超过128Byte了,外部RAM很小也用满了,所以我试着用idata,但碰到一些问题。
我有一个64Byte的数组,不要这个数组时,能编译通过。data<128的。
但加上这个数组,并且定义为idata,起始地址为0x80后,编译就通不过了,256>data>128的,但MCU本身是有256的内部RAM的,不知道这个是为什么?
不知道是不是要在Keil中哪里设置一下,还是其它的什么原因?
我有一个64Byte的数组,不要这个数组时,能编译通过。data<128的。
但加上这个数组,并且定义为idata,起始地址为0x80后,编译就通不过了,256>data>128的,但MCU本身是有256的内部RAM的,不知道这个是为什么?
不知道是不是要在Keil中哪里设置一下,还是其它的什么原因?
1 |
如上图,data=159.7,还没超过256,但是编译不通过…… |
回答:
的确是RAM不够了,因为你没有把堆栈计算进去,所以虽然看起来小于256,但实际已经溢出。
从编译结果来看,你有好几个函数有实体但没有调用,这样是很浪费RAM的,因为KEIL因此会为这些函数中的局部变量都做了保留,相当于变成了全局变量来保存,如果你不想删除这些函数,那就教你个办法,在程序初始化阶段:
i=0;
if(i)
{
…
不需要调用的函数;
…
}
这样就能把RAM省下来了。
记住,嵌入式编程时,任何一个RAM空间都是十分宝贵的,可不能像PC程序那样用啊。一些对性能要求不高的变量,或使用不频繁的变量最好定义到XDATA中去。
1 2 3 4 5 6 7 8 |
这是因为,你删除的程序中,有几行是函数的调用,被你删除后,这些函数就只有函数体,却没有调用了(从编译信息看,是memory_clear_with_font_bgcolor)。当这个函数中有局部变量时,由于没被调用过,所以KEIL无法进行变量的优化,最后只能把局部变量保存下来,反而多占用了空间。 解决办法:1、把不用函数删掉或注释掉 2、写成这样,伪调用: a = 1; if(a==0) { memory_clear_with_font_bgcolor();//把从不调用的函数放这里 } |
追问
1 |
那您的意思就是说,调用过反而会被keil清除掉,没被调用的反而会被保存下来~ |
追答
1 |
调用过的函数,它里面的局部变量会和其他的变量复用某个地址,而没被调用过的函数,里面的变量KEIL不知道怎么优化,但又必须保留,所以从编译结果来看,反而使用的RAM多了。 |
转载请注明:徐自远的乱七八糟小站 » Q&A:为什么Keil C中不用的函数占用data?