减少RAM使用量(实时更新)17楼亮点

2020-01-20 19:11发布

本帖最后由 霸气侧漏 于 2014-9-30 11:03 编辑

怎么减少RAM的使用量,用的是12864无字库的,定义了很大的数据用的code,为了显示方便,层层调用。stc12c5612ad,

发现ram占用很大,然后再修改编译选项
方法一:
QQ截图20140929095520.png (20.08 KB, 下载次数: 1) 下载附件 2014-9-29 09:55 上传
方法二:
,后来在给特定的函数使用void delayUs(uint xdata  Tus);就编译通过


只是在进中断服务函数里调用函数,经常运行失败。


大家还有什么办法减少RAM的方法

方法1:少用全局变量,多用局部变量
方法2:少使用不需要的函数
方法3: 使用合适的数据类型,能用bit就不用char,能用char就不用int。
方法4:其次,如果使用RAM,可以在变量声明的时候指定存储位置,如:
char data var[8];    // 变量声明在C51.RAM(0x00-0x80)地址,使用MOV指令,可直接寻址
char idata var[8];    // 变量声明在C51.RAM(0x80-0xFF)地址,使用MOV指令,间接寻址,会增加指令数
char xdata var[8];  // 变量声明在C51.XDATA地址,使用MOVX指令,会增加指令数.
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
36条回答
霸气侧漏
1楼-- · 2020-01-22 18:15
 精彩回答 2  元偷偷看……
霸气侧漏
2楼-- · 2020-01-22 22:24
caoxuerji 发表于 2014-9-29 13:18
局部变量用的多的函数拆分成几个函数

为啥,分成几个还是一样吧
caoxuerji
3楼-- · 2020-01-23 00:21
碰运气吧,分成多个函数之后不同函数的局部变量可能会覆盖的
dr2001
4楼-- · 2020-01-23 00:46
本帖最后由 dr2001 于 2014-9-29 21:05 编辑

Keil C51的内存分配策略是特殊的,不知道最新版本的C51编译器修改了没。

由于51的栈非常小(默认IDATA),所以C51编译器默认动态变量不是放在栈上的(加reentant会用到软件栈,不会放SP)。
Keil会分析函数的调用关系,然后静态分配动态变量的地址。你会发现不同函数的动态变量地址可能重复。

所以,如果用小模式编译,
全局变量和大的数据结构如果非必要,尽量扔到xdata,节约data/idata/栈空间;
尽量不用函数指针,因为依赖关系分析不出来可能会出问题;
中断函数的using等要少,因为这些占用了data就不会被别人用;
函数内的动态变量要尽量少且简单,这是常见规约;
函数的调用层数不要太深,为了省堆栈,注意,small模式动态变量会抢堆栈的空间的;
函数的调用关系最好是一颗不太深的树,尽量不要多个不同的函数调用同一个函数(除非函数的参数非常简单,并且内部没进行什么计算之类的)。

这些都有利于减少内存消耗,保证代码正确。

如果理解51的内存机制以及编译器内存分配的原理,一般不会出什么问题。
梁国俭
5楼-- · 2020-01-23 03:46
字库用CODE 关键字定义
霸气侧漏
6楼-- · 2020-01-23 08:48
 精彩回答 2  元偷偷看……

一周热门 更多>