发新帖我要提问
12
返回列表
打印

关于51中ram内存不够用和局部变量

[复制链接]
楼主: samyoju
手机看帖
扫描二维码
随时随地手机跟帖
21
samyoju|  楼主 | 2011-11-2 19:41 | 只看该作者 回帖奖励 |倒序浏览
同意3楼:
有很多减少 RAM 占用的技巧.
1. 优化程序, 让局部变量尽量放在寄存器里, 而不是 RAM 里.
2.多个数组, 怎么共享同一片内存区域.
3. 通常 Keil 是不会把局部变量放堆栈的. 但是可以设置函数为可重入(reentra ...
airwill 发表于 2011-11-2 12:17


局部变量尽量放在寄存器,怎么做,能举一个例子吗?
设置函数为可重入,这个似乎太复杂了。现阶段的我可能还掌控不了!

使用特权

评论回复
22
sysdriver| | 2011-11-2 20:15 | 只看该作者
1.25K的RAM都被你用完了,如果不是有特殊应用,那么一定是你算法、结构、思路有问题!

把你定义的数组写出来,做什么用的说说,看是不是真的需要用这么多,如果涉及到保密就算了。

使用特权

评论回复
23
samyoju|  楼主 | 2011-11-2 20:48 | 只看该作者
如果实在还不行,就要试一下用几个全局变量来代替一些局部变量了!

还有一个问题,就是如果我写一个函数,分别改成下面三种形式

void disp(unsigned char xdata *buf)
{
}

void disp(unsigned char xdata * data buf)
{
}

void disp(unsigned char xdata * xdata buf)
{
}

选small模式
这三次修改编译后,占用空间都一样。buf两字节都在data里面。

选large模式。
这三次修改编译后,占用空间都一样。buf两字节都在xdata里面。

但是我建立一个指针变量ptr,局部变量或者全局变量。指针ptr它就按照声明的空间分配
unsigned char xdata * xdata ptr; ptr两字节都在xdata里面
unsigned char xdata * data ptr; ptr两字节都在data里面

难道形参特殊,不论怎么限定,它都是在选定的模式的ram里面?????

使用特权

评论回复
24
samyoju|  楼主 | 2011-11-2 20:52 | 只看该作者
1.25K的RAM都被你用完了,如果不是有特殊应用,那么一定是你算法、结构、思路有问题!

把你定义的数组写出来,做什么用的说说,看是不是真的需要用这么多,如果涉及到保密就算了。 ...
sysdriver 发表于 2011-11-2 20:15

其实就是电能表校表台。就是对电表做一些规范实验。
PC通过485按照通信协议发信息下来,然后控制下面做一些实验。
这其中主控STC还要和电表通讯。主控把PC发下来的数据再组装成另一个和电表通讯的协议来通讯。

其实数组也不多,大一点的是收发数据的缓存数组。
不过功能函数有点多,这就造成了局部变量很多!

使用特权

评论回复
25
ningling_21| | 2011-11-2 21:09 | 只看该作者
编程不够规范...

使用特权

评论回复
26
eydj2008| | 2011-11-2 23:38 | 只看该作者
尽量不要用全局变量 全部为动态变量 或是局部变量

使用特权

评论回复
27
forget121| | 2011-11-2 23:53 | 只看该作者
谢谢!mark!

使用特权

评论回复
28
songhere| | 2012-4-17 23:37 | 只看该作者
c51不是标准的编译器,对局部变量这块处理的采用覆盖。一搞到 实时操作系统,局部变量的处理就是最头疼的事。。。。。

使用特权

评论回复
29
yuandm1| | 2012-6-28 21:31 | 只看该作者
标记一下,感觉很受用。

使用特权

评论回复
30
uc_c++| | 2012-6-29 08:15 | 只看该作者
用IAR,局部变量放在外部堆栈里,函数可重入。
再多的局部变量也没问题,只要堆栈不溢出(局部变量多,堆栈可设大点)

使用特权

评论回复
31
veryyd| | 2012-9-17 15:00 | 只看该作者
mark 一下,好东西

使用特权

评论回复
32
misra| | 2012-9-17 20:38 | 只看该作者
应该先估计一下ram  然后再玩。 你到最后才发现ram不够了,是这样么?如果真是这样,那就很麻烦。至少说明思考方法有问题。

使用特权

评论回复
33
zook0k| | 2015-8-12 18:14 | 只看该作者

使用特权

评论回复
34
冷调幽忧| | 2015-8-18 13:37 | 只看该作者
楼主,最后是怎么搞定的?

使用特权

评论回复
35
chaifuwu| | 2020-4-6 09:17 | 只看该作者
这是由内部bootloder占用了一部分,不然怎么能通过串口烧写程序呢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则