减少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条回答
myxiaonia
1楼-- · 2020-01-23 14:33
本帖最后由 myxiaonia 于 2014-9-30 11:18 编辑
dr2001 发表于 2014-9-29 20:59
Keil C51的内存分配策略是特殊的,不知道最新版本的C51编译器修改了没。

由于51的栈非常小(默认IDATA), ...


keil C51有个覆盖分析,就是你说的这个事情,我当时开始学cm3时,想当然也以为也有这个覆盖分析。。。其实就是因为51内存太小,他的函数默认不可重入的


中断函数用using不是可以避免入栈操作呀。。。你的意思是指定using后它使用的内存就不会参与覆盖分析吗,我没有尝试过呢
dr2001
2楼-- · 2020-01-23 16:19
本帖最后由 dr2001 于 2014-9-30 12:11 编辑
myxiaonia 发表于 2014-9-30 11:15
keil C51有个覆盖分析,就是你说的这个事情,我当时开始学cm3时,想当然也以为也有这个覆盖分析。。。其 ...


很久没用C51了,不太清楚目前是怎么做的了,嗯。

Keil C51默认函数不可重入的根源在于静态分配了动态变量的地址,而不是在栈上分配。原因当然是栈太小,不禁花消。

using以前在Keil里只是声明bank的使用,实际使用还是要自己改PSW。其目的在于让Keil知道DATA的相关区域会被用掉,不在那个空间继续进行内存分配。

印象中,中断函数interrupt后缀是另一颗调用树的起点;而且,这个树似乎独占内存区分配动态变量?这点记不清了。所以,中断函数里变量要尽可能少而且尽量不要调用函数。省内存就要一点点扣了。
印象中,C51会尽量避免栈操作的,51太容易爆栈了;具体编译器的行为只能看手册和看汇编了。。。
myxiaonia
3楼-- · 2020-01-23 16:57
dr2001 发表于 2014-9-30 12:08
很久没用C51了,不太清楚目前是怎么做的了,嗯。

Keil C51默认函数不可重入的根源在于静态分配了动态变 ...

因为51有4个R0-R7寄存器组,用using可以指定选择,修改PSW是C51自己会完成的,而且中断函数调用的其他函数也应该用相同的using ? 来指定,好像是这样
zhaotyue
4楼-- · 2020-01-23 21:51
dr2001 发表于 2014-9-29 20:59
Keil C51的内存分配策略是特殊的,不知道最新版本的C51编译器修改了没。

由于51的栈非常小(默认IDATA), ...

分析的很到位,顶。
霸气侧漏
5楼-- · 2020-01-24 03:33
 精彩回答 2  元偷偷看……
jswd0810
6楼-- · 2020-01-24 08:43
霸气侧漏 发表于 2015-2-14 07:43
又遇见RAM问题@单独串口收上位机数据@在解析数据,返回指令,运行正常。加上其他程序,串口收发异常。 ...

可能是通讯超时问题,你可以把通讯的波特率降低试试看

一周热门 更多>